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 d3abbb9821)
This commit is contained in:
Hugh Chen
2021-10-28 06:21:37 +00:00
parent aebca7f35b
commit f8cd68c6e2
3 changed files with 65 additions and 6 deletions

View File

@@ -16,9 +16,14 @@
package com.android.settings.connecteddevice; package com.android.settings.connecteddevice;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context; import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import android.support.annotation.VisibleForTesting; import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.Log;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R; import com.android.settings.R;
@@ -36,6 +41,9 @@ import java.util.List;
public class ConnectedDeviceDashboardFragment extends DashboardFragment { public class ConnectedDeviceDashboardFragment extends DashboardFragment {
private static final String TAG = "ConnectedDeviceFrag"; 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 @VisibleForTesting
static final String KEY_CONNECTED_DEVICES = "connected_device_list"; static final String KEY_CONNECTED_DEVICES = "connected_device_list";
@@ -84,10 +92,27 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment {
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
String callingAppPackageName = getCallingAppPackageName(getActivity().getActivityToken());
if (DEBUG) {
Log.d(TAG, "onAttach() calling package name is : " + callingAppPackageName);
}
use(AvailableMediaDeviceGroupController.class).init(this); use(AvailableMediaDeviceGroupController.class).init(this);
use(ConnectedDeviceGroupController.class).init(this); use(ConnectedDeviceGroupController.class).init(this);
use(PreviouslyConnectedDevicePreferenceController.class).init(this); use(PreviouslyConnectedDevicePreferenceController.class).init(this);
use(DiscoverableFooterPreferenceController.class).init(this); use(DiscoverableFooterPreferenceController.class).init(this,
TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName)
|| TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName));
}
private String getCallingAppPackageName(IBinder activityToken) {
String pkg = null;
try {
pkg = ActivityManager.getService().getLaunchedFromPackage(activityToken);
} catch (RemoteException e) {
Log.v(TAG, "Could not talk to activity manager.", e);
}
return pkg;
} }
@VisibleForTesting @VisibleForTesting

View File

@@ -54,6 +54,7 @@ public class DiscoverableFooterPreferenceController extends BasePreferenceContro
private LocalBluetoothManager mLocalManager; private LocalBluetoothManager mLocalManager;
private LocalBluetoothAdapter mLocalAdapter; private LocalBluetoothAdapter mLocalAdapter;
private AlwaysDiscoverable mAlwaysDiscoverable; private AlwaysDiscoverable mAlwaysDiscoverable;
private boolean mIsAlwaysDiscoverable;
public DiscoverableFooterPreferenceController(Context context) { public DiscoverableFooterPreferenceController(Context context) {
super(context, KEY); super(context, KEY);
@@ -79,8 +80,9 @@ public class DiscoverableFooterPreferenceController extends BasePreferenceContro
}; };
} }
public void init(DashboardFragment fragment) { public void init(DashboardFragment fragment, boolean isAlwaysDiscoverable) {
mFooterPreferenceMixin = new FooterPreferenceMixin(fragment, fragment.getLifecycle()); mFooterPreferenceMixin = new FooterPreferenceMixin(fragment, fragment.getLifecycle());
mIsAlwaysDiscoverable = isAlwaysDiscoverable;
} }
@VisibleForTesting @VisibleForTesting
@@ -91,6 +93,11 @@ public class DiscoverableFooterPreferenceController extends BasePreferenceContro
mAlwaysDiscoverable = alwaysDiscoverable; mAlwaysDiscoverable = alwaysDiscoverable;
} }
@VisibleForTesting
void setAlwaysDiscoverable(boolean isAlwaysDiscoverable) {
mIsAlwaysDiscoverable = isAlwaysDiscoverable;
}
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
@@ -114,14 +121,18 @@ public class DiscoverableFooterPreferenceController extends BasePreferenceContro
public void onResume() { public void onResume() {
mContext.registerReceiver(mBluetoothChangedReceiver, mContext.registerReceiver(mBluetoothChangedReceiver,
new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
mAlwaysDiscoverable.start(); if (mIsAlwaysDiscoverable) {
mAlwaysDiscoverable.start();
}
updateFooterPreferenceTitle(mLocalAdapter.getState()); updateFooterPreferenceTitle(mLocalAdapter.getState());
} }
@Override @Override
public void onPause() { public void onPause() {
mContext.unregisterReceiver(mBluetoothChangedReceiver); mContext.unregisterReceiver(mBluetoothChangedReceiver);
mAlwaysDiscoverable.stop(); if (mIsAlwaysDiscoverable) {
mAlwaysDiscoverable.stop();
}
} }
private void updateFooterPreferenceTitle (int bluetoothState) { private void updateFooterPreferenceTitle (int bluetoothState) {

View File

@@ -17,6 +17,7 @@ package com.android.settings.connecteddevice;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -117,14 +118,17 @@ public class DiscoverableFooterPreferenceControllerTest {
} }
@Test @Test
public void onResume() { public void onResume_setAlwaysDiscoverableAsTrue_shouldRegisterBluetoothChanged() {
mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(true);
mDiscoverableFooterPreferenceController.onResume(); mDiscoverableFooterPreferenceController.onResume();
assertThat(getRegisteredBroadcastReceivers()).contains(mBluetoothChangedReceiver); assertThat(getRegisteredBroadcastReceivers()).contains(mBluetoothChangedReceiver);
verify(mAlwaysDiscoverable).start(); verify(mAlwaysDiscoverable).start();
} }
@Test @Test
public void onPause() { public void onPause_setAlwaysDiscoverableAsTrue_shouldUnregisterBluetoothChanged() {
mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(true);
mDiscoverableFooterPreferenceController.onResume(); mDiscoverableFooterPreferenceController.onResume();
mDiscoverableFooterPreferenceController.onPause(); mDiscoverableFooterPreferenceController.onPause();
@@ -132,6 +136,25 @@ public class DiscoverableFooterPreferenceControllerTest {
verify(mAlwaysDiscoverable).stop(); verify(mAlwaysDiscoverable).stop();
} }
@Test
public void onResume_setAlwaysDiscoverableAsFalse_shouldNotRegisterBluetoothChanged() {
mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(false);
mDiscoverableFooterPreferenceController.onResume();
assertThat(getRegisteredBroadcastReceivers()).contains(mBluetoothChangedReceiver);
verify(mAlwaysDiscoverable, never()).start();
}
@Test
public void onPause_setAlwaysDiscoverableAsFalse_shouldNotUnregisterBluetoothChanged() {
mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(false);
mDiscoverableFooterPreferenceController.onResume();
mDiscoverableFooterPreferenceController.onPause();
assertThat(getRegisteredBroadcastReceivers()).doesNotContain(mBluetoothChangedReceiver);
verify(mAlwaysDiscoverable, never()).stop();
}
@Test @Test
public void onBluetoothStateChanged_bluetoothOn_updateTitle() { public void onBluetoothStateChanged_bluetoothOn_updateTitle() {
ShadowLocalBluetoothAdapter.setName(DEVICE_NAME); ShadowLocalBluetoothAdapter.setName(DEVICE_NAME);