Remove BluetoothEventManager#setReceiverHandler
Make BluetoothEventManager fields final and remove the method to
unregister receivers unnecessarily (introduced in b/35415158).
Bug: 113122466
Test: runtest systemui && make RunSettingsLibRoboTests
Change-Id: I8f34ab1a809638959ab4096a829c72b3d1ac3a23
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
index e071b7c..4aca2bb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
@@ -53,22 +53,23 @@
private final BroadcastReceiver mBroadcastReceiver = new BluetoothBroadcastReceiver();
private final BroadcastReceiver mProfileBroadcastReceiver = new BluetoothBroadcastReceiver();
private final Collection<BluetoothCallback> mCallbacks = new ArrayList<>();
-
- private android.os.Handler mReceiverHandler;
- private Context mContext;
+ private final android.os.Handler mReceiverHandler;
+ private final Context mContext;
interface Handler {
void onReceive(Context context, Intent intent, BluetoothDevice device);
}
BluetoothEventManager(LocalBluetoothAdapter adapter,
- CachedBluetoothDeviceManager deviceManager, Context context) {
+ CachedBluetoothDeviceManager deviceManager, Context context,
+ android.os.Handler handler) {
mLocalAdapter = adapter;
mDeviceManager = deviceManager;
mAdapterIntentFilter = new IntentFilter();
mProfileIntentFilter = new IntentFilter();
mHandlerMap = new HashMap<>();
mContext = context;
+ mReceiverHandler = handler;
// Bluetooth on/off broadcasts
addHandler(BluetoothAdapter.ACTION_STATE_CHANGED, new AdapterStateChangedHandler());
@@ -104,15 +105,6 @@
new AudioModeChangedHandler());
mContext.registerReceiver(mBroadcastReceiver, mAdapterIntentFilter, null, mReceiverHandler);
- mContext.registerReceiver(mProfileBroadcastReceiver, mProfileIntentFilter, null, mReceiverHandler);
- }
-
- public void setReceiverHandler(android.os.Handler handler) {
- mContext.unregisterReceiver(mBroadcastReceiver);
- mContext.unregisterReceiver(mProfileBroadcastReceiver);
- mReceiverHandler = handler;
- mContext.registerReceiver(mBroadcastReceiver, mAdapterIntentFilter, null, mReceiverHandler);
- registerProfileIntentReceiver();
}
/** Register to start receiving callbacks for Bluetooth events. */
@@ -233,12 +225,6 @@
BluetoothDevice device) {
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
BluetoothAdapter.ERROR);
- // Reregister Profile Broadcast Receiver as part of TURN OFF
- if (state == BluetoothAdapter.STATE_OFF)
- {
- context.unregisterReceiver(mProfileBroadcastReceiver);
- registerProfileIntentReceiver();
- }
// update local profiles and get paired devices
mLocalAdapter.setBluetoothStateInt(state);
// send callback to update UI and possibly start scanning
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothManager.java
index 51601a5..7fe6205 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothManager.java
@@ -17,6 +17,7 @@
package com.android.settingslib.bluetooth;
import android.content.Context;
+import android.os.Handler;
import android.util.Log;
import java.lang.ref.WeakReference;
@@ -57,7 +58,7 @@
}
// This will be around as long as this process is
Context appContext = context.getApplicationContext();
- sInstance = new LocalBluetoothManager(adapter, appContext);
+ sInstance = new LocalBluetoothManager(adapter, appContext, null);
if (onInitCallback != null) {
onInitCallback.onBluetoothManagerInitialized(appContext, sInstance);
}
@@ -66,13 +67,25 @@
return sInstance;
}
- private LocalBluetoothManager(LocalBluetoothAdapter adapter, Context context) {
+ /**
+ * Returns a new instance of {@link LocalBluetoothManager} or null if Bluetooth is not
+ * supported for this hardware. This instance should be globally cached by the caller.
+ */
+ public static LocalBluetoothManager create(Context context, Handler handler) {
+ LocalBluetoothAdapter adapter = LocalBluetoothAdapter.getInstance();
+ if (adapter == null) {
+ return null;
+ }
+ return new LocalBluetoothManager(adapter, context.getApplicationContext(), handler);
+ }
+
+ private LocalBluetoothManager(
+ LocalBluetoothAdapter adapter, Context context, Handler handler) {
mContext = context;
mLocalAdapter = adapter;
-
mCachedDeviceManager = new CachedBluetoothDeviceManager(context, this);
mEventManager = new BluetoothEventManager(mLocalAdapter,
- mCachedDeviceManager, context);
+ mCachedDeviceManager, context, handler);
mProfileManager = new LocalBluetoothProfileManager(context,
mLocalAdapter, mCachedDeviceManager, mEventManager);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java
index 5f42b66..14bfb27 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java
@@ -54,7 +54,7 @@
mContext = RuntimeEnvironment.application;
mBluetoothEventManager = new BluetoothEventManager(mLocalAdapter,
- mCachedDeviceManager, mContext);
+ mCachedDeviceManager, mContext, null);
}
/**
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java
index 5550b7e..6f4c292 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java
@@ -76,7 +76,7 @@
mContext = spy(RuntimeEnvironment.application);
mLocalBluetoothAdapter = LocalBluetoothAdapter.getInstance();
mEventManager = spy(new BluetoothEventManager(mLocalBluetoothAdapter, mDeviceManager,
- mContext));
+ mContext, null));
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
when(mDeviceManager.findDevice(mDevice)).thenReturn(mCachedBluetoothDevice);
mProfileManager = new LocalBluetoothProfileManager(mContext, mLocalBluetoothAdapter,
@@ -151,9 +151,7 @@
mShadowBluetoothAdapter.setSupportedProfiles(generateList(
new int[] {BluetoothProfile.A2DP}));
mProfileManager.updateLocalProfiles();
- // Refer to BluetoothControllerImpl, it will call setReceiverHandler after
- // LocalBluetoothProfileManager created.
- mEventManager.setReceiverHandler(null);
+
mIntent = new Intent(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
mIntent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, BluetoothProfile.STATE_CONNECTING);
@@ -174,9 +172,7 @@
mShadowBluetoothAdapter.setSupportedProfiles(generateList(
new int[] {BluetoothProfile.HEADSET}));
mProfileManager.updateLocalProfiles();
- // Refer to BluetoothControllerImpl, it will call setReceiverHandler after
- // LocalBluetoothProfileManager created.
- mEventManager.setReceiverHandler(null);
+
mIntent = new Intent(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
mIntent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, BluetoothProfile.STATE_CONNECTING);
@@ -197,9 +193,7 @@
mShadowBluetoothAdapter.setSupportedProfiles(generateList(
new int[] {BluetoothProfile.HEARING_AID}));
mProfileManager.updateLocalProfiles();
- // Refer to BluetoothControllerImpl, it will call setReceiverHandler after
- // LocalBluetoothProfileManager created.
- mEventManager.setReceiverHandler(null);
+
mIntent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
mIntent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, BluetoothProfile.STATE_CONNECTING);
@@ -220,9 +214,7 @@
mShadowBluetoothAdapter.setSupportedProfiles(generateList(
new int[] {BluetoothProfile.PAN}));
mProfileManager.updateLocalProfiles();
- // Refer to BluetoothControllerImpl, it will call setReceiverHandler after
- // LocalBluetoothProfileManager created.
- mEventManager.setReceiverHandler(null);
+
mIntent = new Intent(BluetoothPan.ACTION_CONNECTION_STATE_CHANGED);
mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
mIntent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, BluetoothProfile.STATE_CONNECTING);
@@ -243,9 +235,7 @@
() {
mShadowBluetoothAdapter.setSupportedProfiles(null);
mProfileManager.updateLocalProfiles();
- // Refer to BluetoothControllerImpl, it will call setReceiverHandler after
- // LocalBluetoothProfileManager created.
- mEventManager.setReceiverHandler(null);
+
mIntent = new Intent(BluetoothPan.ACTION_CONNECTION_STATE_CHANGED);
mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
mIntent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, BluetoothProfile.STATE_CONNECTING);
@@ -265,9 +255,7 @@
mShadowBluetoothAdapter.setSupportedProfiles(generateList(
new int[] {BluetoothProfile.PAN}));
mProfileManager.updateLocalProfiles();
- // Refer to BluetoothControllerImpl, it will call setReceiverHandler after
- // LocalBluetoothProfileManager created.
- mEventManager.setReceiverHandler(null);
+
mIntent = new Intent(BluetoothPan.ACTION_CONNECTION_STATE_CHANGED);
mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
mIntent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, BluetoothProfile.STATE_CONNECTING);
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index 2dd54aa..b2cf305 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -133,6 +133,10 @@
*/
public static final DependencyKey<Looper> BG_LOOPER = new DependencyKey<>("background_looper");
/**
+ * Key for getting a background Handler for background work.
+ */
+ public static final DependencyKey<Handler> BG_HANDLER = new DependencyKey<>("background_handler");
+ /**
* Key for getting a Handler for receiving time tick broadcasts on.
*/
public static final DependencyKey<Handler> TIME_TICK_HANDLER =
@@ -166,6 +170,7 @@
thread.start();
return thread.getLooper();
});
+ mProviders.put(BG_HANDLER, () -> new Handler(getDependency(BG_LOOPER)));
mProviders.put(MAIN_HANDLER, () -> new Handler(Looper.getMainLooper()));
mProviders.put(ActivityStarter.class, () -> new ActivityStarterDelegate());
mProviders.put(ActivityStarterDelegate.class, () ->
@@ -288,7 +293,7 @@
new PluginDependencyProvider(get(PluginManager.class)));
mProviders.put(LocalBluetoothManager.class, () ->
- LocalBluetoothManager.getInstance(mContext, null));
+ LocalBluetoothManager.create(mContext, getDependency(BG_HANDLER)));
mProviders.put(VolumeDialogController.class, () ->
new VolumeDialogControllerImpl(mContext));
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
index 76a1acc..e0657c9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
@@ -49,6 +49,7 @@
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.android.settingslib.bluetooth.BluetoothUtils;
+import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
@@ -171,7 +172,7 @@
return;
}
- LocalBluetoothManager bluetoothManager = LocalBluetoothManager.getInstance(context, null);
+ LocalBluetoothManager bluetoothManager = Dependency.get(LocalBluetoothManager.class);
if (bluetoothManager == null) {
if (DEBUG) {
Slog.e(TAG, "Failed to retrieve LocalBluetoothManager instance");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
index 1085b06..6f64a563 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
@@ -65,7 +65,6 @@
mLocalBluetoothManager = Dependency.get(LocalBluetoothManager.class);
mBgHandler = new Handler(bgLooper);
if (mLocalBluetoothManager != null) {
- mLocalBluetoothManager.getEventManager().setReceiverHandler(mBgHandler);
mLocalBluetoothManager.getEventManager().registerCallback(this);
mLocalBluetoothManager.getProfileManager().addServiceListener(this);
onBluetoothStateChanged(