RESTRICT AUTOMERGE Fix make Bluetooth discoverable without additional permission

- Only enable device can be discoverable when the user launch
  "Connected Devices settings" through settings and systemui

Bug: 194695497
Test: make -j42 RunSettingsRoboTests and use test apk to manually test
to verify the device is not discoversable when open "Connected settings"
through test apk.

Change-Id: Ia04ab759b737acf30b782f5c5831dd59f25fb257
(cherry picked from commit d3abbb9821dca627c49b15185109150c79597549)
(cherry picked from commit b1adf980a58479affaae3476ea80d7f1b0d27138)
Merged-In:Ia04ab759b737acf30b782f5c5831dd59f25fb257
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
index ce980e0..c8eb488 100644
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
@@ -19,12 +19,15 @@
 import android.content.Context;
 import android.net.Uri;
 import android.provider.DeviceConfig;
+import android.text.TextUtils;
+import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
 
 import com.android.settings.R;
 import com.android.settings.core.SettingsUIDeviceConfig;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.password.PasswordUtils;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.slices.SlicePreferenceController;
 import com.android.settingslib.search.SearchIndexable;
@@ -33,6 +36,9 @@
 public class ConnectedDeviceDashboardFragment extends DashboardFragment {
 
     private static final String TAG = "ConnectedDeviceFrag";
+    private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
+    private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
     @VisibleForTesting
     static final String KEY_CONNECTED_DEVICES = "connected_device_list";
@@ -64,12 +70,20 @@
         super.onAttach(context);
         final boolean nearbyEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
                 SettingsUIDeviceConfig.BT_NEAR_BY_SUGGESTION_ENABLED, true);
+        String callingAppPackageName = PasswordUtils.getCallingAppPackageName(
+                getActivity().getActivityToken());
+        if (DEBUG) {
+            Log.d(TAG, "onAttach() calling package name is : " + callingAppPackageName);
+        }
         use(AvailableMediaDeviceGroupController.class).init(this);
         use(ConnectedDeviceGroupController.class).init(this);
         use(PreviouslyConnectedDevicePreferenceController.class).init(this);
         use(SlicePreferenceController.class).setSliceUri(nearbyEnabled
                 ? Uri.parse(getString(R.string.config_nearby_devices_slice_uri))
                 : null);
+        use(DiscoverableFooterPreferenceController.class).setAlwaysDiscoverable(
+                TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName)
+                        || TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName));
     }
 
     /**
diff --git a/src/com/android/settings/connecteddevice/DiscoverableFooterPreferenceController.java b/src/com/android/settings/connecteddevice/DiscoverableFooterPreferenceController.java
index 91368bf..5df31bc 100644
--- a/src/com/android/settings/connecteddevice/DiscoverableFooterPreferenceController.java
+++ b/src/com/android/settings/connecteddevice/DiscoverableFooterPreferenceController.java
@@ -52,6 +52,7 @@
     private BluetoothAdapter mBluetoothAdapter;
     private AlwaysDiscoverable mAlwaysDiscoverable;
     private FooterPreference mPreference;
+    private boolean mIsAlwaysDiscoverable;
 
     public DiscoverableFooterPreferenceController(Context context, String key) {
         super(context, key);
@@ -84,7 +85,9 @@
         }
         mContext.registerReceiver(mBluetoothChangedReceiver,
                 new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
-        mAlwaysDiscoverable.start();
+        if (mIsAlwaysDiscoverable) {
+            mAlwaysDiscoverable.start();
+        }
         updateFooterPreferenceTitle(mBluetoothAdapter.getState());
     }
 
@@ -94,7 +97,19 @@
             return;
         }
         mContext.unregisterReceiver(mBluetoothChangedReceiver);
-        mAlwaysDiscoverable.stop();
+        if (mIsAlwaysDiscoverable) {
+            mAlwaysDiscoverable.stop();
+        }
+    }
+
+    /**
+     * Set whether the device can be discovered. By default the value will be {@code false}.
+     *
+     * @param isAlwaysDiscoverable {@code true} if the device can be discovered,
+     *     otherwise {@code false}
+     */
+    public void setAlwaysDiscoverable(boolean isAlwaysDiscoverable) {
+        mIsAlwaysDiscoverable = isAlwaysDiscoverable;
     }
 
     private void updateFooterPreferenceTitle(int bluetoothState) {
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/DiscoverableFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/DiscoverableFooterPreferenceControllerTest.java
index 065b924..6510f19 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/DiscoverableFooterPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/DiscoverableFooterPreferenceControllerTest.java
@@ -18,6 +18,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -104,7 +105,8 @@
     }
 
     @Test
-    public void onStart_shouldRegisterBluetoothChanged() {
+    public void onStart_setAlwaysDiscoverableAsTrue_shouldRegisterBluetoothChanged() {
+        mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(true);
         mDiscoverableFooterPreferenceController.onStart();
 
         assertThat(getRegisteredBroadcastReceivers()).contains(mBluetoothChangedReceiver);
@@ -112,7 +114,8 @@
     }
 
     @Test
-    public void onStop_shouldUnregisterBluetoothChanged() {
+    public void onStop_setAlwaysDiscoverableAsTrue_shouldUnregisterBluetoothChanged() {
+        mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(true);
         mDiscoverableFooterPreferenceController.onStart();
         mDiscoverableFooterPreferenceController.onStop();
 
@@ -121,6 +124,25 @@
     }
 
     @Test
+    public void onStart_setAlwaysDiscoverableAsFalse_shouldNotRegisterBluetoothChanged() {
+        mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(false);
+        mDiscoverableFooterPreferenceController.onStart();
+
+        assertThat(getRegisteredBroadcastReceivers()).contains(mBluetoothChangedReceiver);
+        verify(mAlwaysDiscoverable, never()).start();
+    }
+
+    @Test
+    public void onStop_setAlwaysDiscoverableAsFalse_shouldNotUnregisterBluetoothChanged() {
+        mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(false);
+        mDiscoverableFooterPreferenceController.onStart();
+        mDiscoverableFooterPreferenceController.onStop();
+
+        assertThat(getRegisteredBroadcastReceivers()).doesNotContain(mBluetoothChangedReceiver);
+        verify(mAlwaysDiscoverable, never()).stop();
+    }
+
+    @Test
     public void onBluetoothStateChanged_bluetoothOn_updateTitle() {
         BluetoothAdapter.getDefaultAdapter().setName(DEVICE_NAME);
         sendBluetoothStateChangedIntent(BluetoothAdapter.STATE_ON);