Merge changes I097335ff,I68ff7bbf,I4515a566 into main

* changes:
  SilenceDeviceManager: Consolidate start
  DatabaseManager: handler post message cleanup
  PhonePolicy: nit cleanup
diff --git a/android/app/src/com/android/bluetooth/btservice/AdapterService.java b/android/app/src/com/android/bluetooth/btservice/AdapterService.java
index 04a32f1..5813f5c 100644
--- a/android/app/src/com/android/bluetooth/btservice/AdapterService.java
+++ b/android/app/src/com/android/bluetooth/btservice/AdapterService.java
@@ -727,8 +727,6 @@
         mActiveDeviceManager = new ActiveDeviceManager(this, new ServiceFactory());
         mActiveDeviceManager.start();
 
-        mSilenceDeviceManager.start();
-
         mBtCompanionManager = new CompanionManager(this, new ServiceFactory());
 
         mBluetoothSocketManagerBinder = new BluetoothSocketManagerBinder(this);
diff --git a/android/app/src/com/android/bluetooth/btservice/PhonePolicy.java b/android/app/src/com/android/bluetooth/btservice/PhonePolicy.java
index 0486023..0999690 100644
--- a/android/app/src/com/android/bluetooth/btservice/PhonePolicy.java
+++ b/android/app/src/com/android/bluetooth/btservice/PhonePolicy.java
@@ -64,6 +64,7 @@
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 // Describes the phone policy
 //
@@ -96,13 +97,25 @@
     private final AdapterService mAdapterService;
     private final ServiceFactory mFactory;
     private final Handler mHandler;
-    private final HashSet<BluetoothDevice> mHeadsetRetrySet = new HashSet<>();
-    private final HashSet<BluetoothDevice> mA2dpRetrySet = new HashSet<>();
-    private final HashSet<BluetoothDevice> mConnectOtherProfilesDeviceSet = new HashSet<>();
+    private final Set<BluetoothDevice> mHeadsetRetrySet = new HashSet<>();
+    private final Set<BluetoothDevice> mA2dpRetrySet = new HashSet<>();
+    private final Set<BluetoothDevice> mConnectOtherProfilesDeviceSet = new HashSet<>();
 
     @VisibleForTesting boolean mAutoConnectProfilesSupported;
     @VisibleForTesting boolean mLeAudioEnabledByDefault;
 
+    PhonePolicy(AdapterService service, Looper looper, ServiceFactory factory) {
+        mAdapterService = service;
+        mDatabaseManager = requireNonNull(service.getDatabase());
+        mFactory = factory;
+        mHandler = new Handler(looper);
+        mAutoConnectProfilesSupported =
+                SystemProperties.getBoolean(AUTO_CONNECT_PROFILES_PROPERTY, false);
+        mLeAudioEnabledByDefault =
+                SystemProperties.getBoolean(LE_AUDIO_CONNECTION_BY_DEFAULT_PROPERTY, true);
+        mAdapterService.registerBluetoothStateCallback(mHandler::post, this);
+    }
+
     @Override
     public void onBluetoothStateChange(int prevState, int newState) {
         // Only act if the adapter has actually changed state from non-ON to ON.
@@ -144,18 +157,6 @@
         resetStates();
     }
 
-    PhonePolicy(AdapterService service, Looper looper, ServiceFactory factory) {
-        mAdapterService = service;
-        mDatabaseManager = requireNonNull(service.getDatabase());
-        mFactory = factory;
-        mHandler = new Handler(looper);
-        mAutoConnectProfilesSupported =
-                SystemProperties.getBoolean(AUTO_CONNECT_PROFILES_PROPERTY, false);
-        mLeAudioEnabledByDefault =
-                SystemProperties.getBoolean(LE_AUDIO_CONNECTION_BY_DEFAULT_PROPERTY, true);
-        mAdapterService.registerBluetoothStateCallback(mHandler::post, this);
-    }
-
     boolean isLeAudioOnlyGroup(BluetoothDevice device) {
         String log = "isLeAudioOnlyGroup(" + device + "): ";
         if (!Flags.leaudioAllowLeaudioOnlyDevices()) {
diff --git a/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java b/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java
index 3e12b5f..b250e2f 100644
--- a/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java
+++ b/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java
@@ -54,8 +54,7 @@
 
     private final AdapterService mAdapterService;
     private final ServiceFactory mFactory;
-    private Handler mHandler = null;
-    private Looper mLooper = null;
+    private final Handler mHandler;
 
     private final Map<BluetoothDevice, Boolean> mSilenceDevices = new HashMap<>();
     private final List<BluetoothDevice> mA2dpConnectedDevices = new ArrayList<>();
@@ -113,6 +112,7 @@
     }
 
     class SilenceDeviceManagerHandler extends Handler {
+
         SilenceDeviceManagerHandler(Looper looper) {
             super(looper);
         }
@@ -197,12 +197,7 @@
     SilenceDeviceManager(AdapterService service, ServiceFactory factory, Looper looper) {
         mAdapterService = service;
         mFactory = factory;
-        mLooper = looper;
-    }
-
-    void start() {
-        Log.v(TAG, "start()");
-        mHandler = new SilenceDeviceManagerHandler(mLooper);
+        mHandler = new SilenceDeviceManagerHandler(looper);
     }
 
     void cleanup() {
@@ -212,18 +207,13 @@
 
     @VisibleForTesting
     boolean setSilenceMode(BluetoothDevice device, boolean silence) {
-        if (mHandler == null) {
-            Log.e(TAG, "setSilenceMode() mHandler is null!");
-            return false;
-        }
         Log.d(TAG, "setSilenceMode: " + device + ", " + silence);
-        Message message =
-                mHandler.obtainMessage(
+        mHandler.obtainMessage(
                         MSG_SILENCE_DEVICE_STATE_CHANGED,
                         silence ? ENABLE_SILENCE : DISABLE_SILENCE,
                         0,
-                        device);
-        mHandler.sendMessage(message);
+                        device)
+                .sendToTarget();
         return true;
     }
 
@@ -252,10 +242,10 @@
             headsetService.setSilenceMode(device, state);
         }
         Log.i(TAG, "Silence mode change " + device + ": " + oldState + " -> " + state);
-        broadcastSilenceStateChange(device, state);
+        broadcastSilenceStateChange(device);
     }
 
-    void broadcastSilenceStateChange(BluetoothDevice device, boolean state) {
+    private void broadcastSilenceStateChange(BluetoothDevice device) {
         Intent intent = new Intent(BluetoothDevice.ACTION_SILENCE_MODE_CHANGED);
         intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
         mAdapterService.sendBroadcastAsUser(
@@ -265,7 +255,6 @@
                 Utils.getTempBroadcastOptions().toBundle());
     }
 
-    @VisibleForTesting
     boolean getSilenceMode(BluetoothDevice device) {
         boolean state = false;
         if (mSilenceDevices.containsKey(device)) {
@@ -274,7 +263,7 @@
         return state;
     }
 
-    void addConnectedDevice(BluetoothDevice device, int profile) {
+    private void addConnectedDevice(BluetoothDevice device, int profile) {
         Log.d(
                 TAG,
                 "addConnectedDevice: "
@@ -295,7 +284,7 @@
         }
     }
 
-    void removeConnectedDevice(BluetoothDevice device, int profile) {
+    private void removeConnectedDevice(BluetoothDevice device, int profile) {
         Log.d(
                 TAG,
                 "removeConnectedDevice: "
@@ -316,7 +305,7 @@
         }
     }
 
-    boolean isBluetoothAudioConnected(BluetoothDevice device) {
+    private boolean isBluetoothAudioConnected(BluetoothDevice device) {
         return (mA2dpConnectedDevices.contains(device) || mHfpConnectedDevices.contains(device));
     }
 
diff --git a/android/app/src/com/android/bluetooth/btservice/storage/DatabaseManager.java b/android/app/src/com/android/bluetooth/btservice/storage/DatabaseManager.java
index ad52d2e..ca0d8ac 100644
--- a/android/app/src/com/android/bluetooth/btservice/storage/DatabaseManager.java
+++ b/android/app/src/com/android/bluetooth/btservice/storage/DatabaseManager.java
@@ -1183,8 +1183,7 @@
     /** Clear all persistence data in database */
     public void factoryReset() {
         Log.w(TAG, "factoryReset");
-        Message message = mHandler.obtainMessage(MSG_CLEAR_DATABASE);
-        mHandler.sendMessage(message);
+        mHandler.sendEmptyMessage(MSG_CLEAR_DATABASE);
     }
 
     /** Close and de-init the DatabaseManager */
@@ -1459,8 +1458,7 @@
 
     private void loadDatabase() {
         Log.d(TAG, "Load Database");
-        Message message = mHandler.obtainMessage(MSG_LOAD_DATABASE);
-        mHandler.sendMessage(message);
+        mHandler.sendEmptyMessage(MSG_LOAD_DATABASE);
         try {
             // Lock the thread until handler thread finish loading database.
             mSemaphore.tryAcquire(LOAD_DATABASE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
@@ -1475,9 +1473,7 @@
             return;
         }
         Log.d(TAG, "updateDatabase " + data.getAnonymizedAddress());
-        Message message = mHandler.obtainMessage(MSG_UPDATE_DATABASE);
-        message.obj = data;
-        mHandler.sendMessage(message);
+        mHandler.obtainMessage(MSG_UPDATE_DATABASE, data).sendToTarget();
     }
 
     @VisibleForTesting
@@ -1488,9 +1484,7 @@
             return;
         }
         logMetadataChange(data, "Metadata deleted");
-        Message message = mHandler.obtainMessage(MSG_DELETE_DATABASE);
-        message.obj = data.getAddress();
-        mHandler.sendMessage(message);
+        mHandler.obtainMessage(MSG_DELETE_DATABASE, data.getAddress()).sendToTarget();
     }
 
     private void logManufacturerInfo(BluetoothDevice device, int key, byte[] bytesValue) {
diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/PhonePolicyTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/PhonePolicyTest.java
index 906436c..2818862 100644
--- a/android/app/tests/unit/src/com/android/bluetooth/btservice/PhonePolicyTest.java
+++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/PhonePolicyTest.java
@@ -119,8 +119,6 @@
         doReturn(BluetoothAdapter.STATE_ON).when(mAdapterService).getState();
         doReturn(MAX_CONNECTED_AUDIO_DEVICES).when(mAdapterService).getMaxConnectedAudioDevices();
         doReturn(mDatabaseManager).when(mAdapterService).getDatabase();
-        doReturn(mLooper.getLooper()).when(mAdapterService).getMainLooper();
-
         // Setup the mocked factory to return mocked services
         doReturn(mHeadsetService).when(mServiceFactory).getHeadsetService();
         doReturn(mA2dpService).when(mServiceFactory).getA2dpService();
diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/SilenceDeviceManagerTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/SilenceDeviceManagerTest.java
index 2a49540..75e3eac 100644
--- a/android/app/tests/unit/src/com/android/bluetooth/btservice/SilenceDeviceManagerTest.java
+++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/SilenceDeviceManagerTest.java
@@ -76,7 +76,6 @@
         mHandlerThread.start();
         mLooper = mHandlerThread.getLooper();
         mSilenceDeviceManager = new SilenceDeviceManager(mAdapterService, mServiceFactory, mLooper);
-        mSilenceDeviceManager.start();
     }
 
     @After