Make bluetooth not discoverable via SliceDeepLinkTrampoline

- Don't let device be discovered when the user launch "Connected Devices
  settings" through SliceDeepLinkTrampoline.

Bug: 228450811
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: I5490b58675b1fd9fc36305766867f65caa6ccb6c
This commit is contained in:
Hugh Chen
2022-05-10 09:39:12 +00:00
parent 22cda47705
commit 205752dcf2
2 changed files with 41 additions and 4 deletions

View File

@@ -39,6 +39,7 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment {
private static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui"; private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final String SLICE_ACTION = "com.android.settings.SEARCH_RESULT_TRAMPOLINE";
@VisibleForTesting @VisibleForTesting
static final String KEY_CONNECTED_DEVICES = "connected_device_list"; static final String KEY_CONNECTED_DEVICES = "connected_device_list";
@@ -72,8 +73,10 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment {
SettingsUIDeviceConfig.BT_NEAR_BY_SUGGESTION_ENABLED, true); SettingsUIDeviceConfig.BT_NEAR_BY_SUGGESTION_ENABLED, true);
String callingAppPackageName = PasswordUtils.getCallingAppPackageName( String callingAppPackageName = PasswordUtils.getCallingAppPackageName(
getActivity().getActivityToken()); getActivity().getActivityToken());
String action = getIntent() != null ? getIntent().getAction() : "";
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "onAttach() calling package name is : " + callingAppPackageName); Log.d(TAG, "onAttach() calling package name is : " + callingAppPackageName
+ ", action : " + action);
} }
use(AvailableMediaDeviceGroupController.class).init(this); use(AvailableMediaDeviceGroupController.class).init(this);
use(ConnectedDeviceGroupController.class).init(this); use(ConnectedDeviceGroupController.class).init(this);
@@ -81,9 +84,15 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment {
use(SlicePreferenceController.class).setSliceUri(nearbyEnabled use(SlicePreferenceController.class).setSliceUri(nearbyEnabled
? Uri.parse(getString(R.string.config_nearby_devices_slice_uri)) ? Uri.parse(getString(R.string.config_nearby_devices_slice_uri))
: null); : null);
use(DiscoverableFooterPreferenceController.class).setAlwaysDiscoverable( use(DiscoverableFooterPreferenceController.class)
TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName) .setAlwaysDiscoverable(isAlwaysDiscoverable(callingAppPackageName, action));
|| TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName)); }
@VisibleForTesting
boolean isAlwaysDiscoverable(String callingAppPackageName, String action) {
return TextUtils.equals(SLICE_ACTION, action) ? false
: TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName)
|| TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName);
} }
/** /**

View File

@@ -54,16 +54,24 @@ public class ConnectedDeviceDashboardFragmentTest {
private static final String KEY_DISCOVERABLE_FOOTER = "discoverable_footer"; private static final String KEY_DISCOVERABLE_FOOTER = "discoverable_footer";
private static final String KEY_SEE_ALL = "previously_connected_devices_see_all"; private static final String KEY_SEE_ALL = "previously_connected_devices_see_all";
private static final String KEY_ADD_BT_DEVICES = "add_bt_devices"; private static final String KEY_ADD_BT_DEVICES = "add_bt_devices";
private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
private static final String SLICE_ACTION = "com.android.settings.SEARCH_RESULT_TRAMPOLINE";
private static final String TEST_APP_NAME = "com.testapp.settings";
private static final String TEST_ACTION = "com.testapp.settings.ACTION_START";
@Mock @Mock
private PackageManager mPackageManager; private PackageManager mPackageManager;
private Context mContext; private Context mContext;
private ConnectedDeviceDashboardFragment mFragment;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
mFragment = new ConnectedDeviceDashboardFragment();
doReturn(mPackageManager).when(mContext).getPackageManager(); doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
} }
@@ -87,6 +95,26 @@ public class ConnectedDeviceDashboardFragmentTest {
KEY_NEARBY_DEVICES, KEY_DISCOVERABLE_FOOTER, KEY_SEE_ALL); KEY_NEARBY_DEVICES, KEY_DISCOVERABLE_FOOTER, KEY_SEE_ALL);
} }
@Test
public void isAlwaysDiscoverable_callingAppIsNotFromSystemApp_returnsFalse() {
assertThat(mFragment.isAlwaysDiscoverable(TEST_APP_NAME, TEST_ACTION)).isFalse();
}
@Test
public void isAlwaysDiscoverable_callingAppIsFromSettings_returnsTrue() {
assertThat(mFragment.isAlwaysDiscoverable(SETTINGS_PACKAGE_NAME, TEST_ACTION)).isTrue();
}
@Test
public void isAlwaysDiscoverable_callingAppIsFromSystemUI_returnsTrue() {
assertThat(mFragment.isAlwaysDiscoverable(SYSTEMUI_PACKAGE_NAME, TEST_ACTION)).isTrue();
}
@Test
public void isAlwaysDiscoverable_actionIsFromSlice_returnsFalse() {
assertThat(mFragment.isAlwaysDiscoverable(SYSTEMUI_PACKAGE_NAME, SLICE_ACTION)).isFalse();
}
@Test @Test
public void getPreferenceControllers_containSlicePrefController() { public void getPreferenceControllers_containSlicePrefController() {
final List<BasePreferenceController> controllers = final List<BasePreferenceController> controllers =