Skip to content

Commit d3abbb9

Browse files
author
Hugh Chen
committed
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
1 parent 663e79c commit d3abbb9

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-4
lines changed

src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java

+14
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@
1919
import android.content.Context;
2020
import android.net.Uri;
2121
import android.provider.DeviceConfig;
22+
import android.text.TextUtils;
23+
import android.util.Log;
2224

2325
import androidx.annotation.VisibleForTesting;
2426

2527
import com.android.settings.R;
2628
import com.android.settings.core.SettingsUIDeviceConfig;
2729
import com.android.settings.dashboard.DashboardFragment;
30+
import com.android.settings.password.PasswordUtils;
2831
import com.android.settings.search.BaseSearchIndexProvider;
2932
import com.android.settings.slices.SlicePreferenceController;
3033
import com.android.settingslib.search.SearchIndexable;
@@ -33,6 +36,9 @@
3336
public class ConnectedDeviceDashboardFragment extends DashboardFragment {
3437

3538
private static final String TAG = "ConnectedDeviceFrag";
39+
private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
40+
private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
41+
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
3642

3743
@VisibleForTesting
3844
static final String KEY_CONNECTED_DEVICES = "connected_device_list";
@@ -64,12 +70,20 @@ public void onAttach(Context context) {
6470
super.onAttach(context);
6571
final boolean nearbyEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
6672
SettingsUIDeviceConfig.BT_NEAR_BY_SUGGESTION_ENABLED, true);
73+
String callingAppPackageName = PasswordUtils.getCallingAppPackageName(
74+
getActivity().getActivityToken());
75+
if (DEBUG) {
76+
Log.d(TAG, "onAttach() calling package name is : " + callingAppPackageName);
77+
}
6778
use(AvailableMediaDeviceGroupController.class).init(this);
6879
use(ConnectedDeviceGroupController.class).init(this);
6980
use(PreviouslyConnectedDevicePreferenceController.class).init(this);
7081
use(SlicePreferenceController.class).setSliceUri(nearbyEnabled
7182
? Uri.parse(getString(R.string.config_nearby_devices_slice_uri))
7283
: null);
84+
use(DiscoverableFooterPreferenceController.class).setAlwaysDiscoverable(
85+
TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName)
86+
|| TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName));
7387
}
7488

7589
/**

src/com/android/settings/connecteddevice/DiscoverableFooterPreferenceController.java

+17-2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public class DiscoverableFooterPreferenceController extends BasePreferenceContro
5252
private BluetoothAdapter mBluetoothAdapter;
5353
private AlwaysDiscoverable mAlwaysDiscoverable;
5454
private FooterPreference mPreference;
55+
private boolean mIsAlwaysDiscoverable;
5556

5657
public DiscoverableFooterPreferenceController(Context context, String key) {
5758
super(context, key);
@@ -84,7 +85,9 @@ public void onStart() {
8485
}
8586
mContext.registerReceiver(mBluetoothChangedReceiver,
8687
new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
87-
mAlwaysDiscoverable.start();
88+
if (mIsAlwaysDiscoverable) {
89+
mAlwaysDiscoverable.start();
90+
}
8891
updateFooterPreferenceTitle(mBluetoothAdapter.getState());
8992
}
9093

@@ -94,7 +97,19 @@ public void onStop() {
9497
return;
9598
}
9699
mContext.unregisterReceiver(mBluetoothChangedReceiver);
97-
mAlwaysDiscoverable.stop();
100+
if (mIsAlwaysDiscoverable) {
101+
mAlwaysDiscoverable.stop();
102+
}
103+
}
104+
105+
/**
106+
* Set whether the device can be discovered. By default the value will be {@code false}.
107+
*
108+
* @param isAlwaysDiscoverable {@code true} if the device can be discovered,
109+
* otherwise {@code false}
110+
*/
111+
public void setAlwaysDiscoverable(boolean isAlwaysDiscoverable) {
112+
mIsAlwaysDiscoverable = isAlwaysDiscoverable;
98113
}
99114

100115
private void updateFooterPreferenceTitle(int bluetoothState) {

tests/robotests/src/com/android/settings/connecteddevice/DiscoverableFooterPreferenceControllerTest.java

+24-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static com.google.common.truth.Truth.assertThat;
1919

2020
import static org.mockito.Mockito.doReturn;
21+
import static org.mockito.Mockito.never;
2122
import static org.mockito.Mockito.spy;
2223
import static org.mockito.Mockito.verify;
2324
import static org.mockito.Mockito.when;
@@ -104,22 +105,43 @@ public void getAvailabilityStatus_BluetoothFeature_returnAvailableUnsearchable()
104105
}
105106

106107
@Test
107-
public void onStart_shouldRegisterBluetoothChanged() {
108+
public void onStart_setAlwaysDiscoverableAsTrue_shouldRegisterBluetoothChanged() {
109+
mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(true);
108110
mDiscoverableFooterPreferenceController.onStart();
109111

110112
assertThat(getRegisteredBroadcastReceivers()).contains(mBluetoothChangedReceiver);
111113
verify(mAlwaysDiscoverable).start();
112114
}
113115

114116
@Test
115-
public void onStop_shouldUnregisterBluetoothChanged() {
117+
public void onStop_setAlwaysDiscoverableAsTrue_shouldUnregisterBluetoothChanged() {
118+
mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(true);
116119
mDiscoverableFooterPreferenceController.onStart();
117120
mDiscoverableFooterPreferenceController.onStop();
118121

119122
assertThat(getRegisteredBroadcastReceivers()).doesNotContain(mBluetoothChangedReceiver);
120123
verify(mAlwaysDiscoverable).stop();
121124
}
122125

126+
@Test
127+
public void onStart_setAlwaysDiscoverableAsFalse_shouldNotRegisterBluetoothChanged() {
128+
mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(false);
129+
mDiscoverableFooterPreferenceController.onStart();
130+
131+
assertThat(getRegisteredBroadcastReceivers()).contains(mBluetoothChangedReceiver);
132+
verify(mAlwaysDiscoverable, never()).start();
133+
}
134+
135+
@Test
136+
public void onStop_setAlwaysDiscoverableAsFalse_shouldNotUnregisterBluetoothChanged() {
137+
mDiscoverableFooterPreferenceController.setAlwaysDiscoverable(false);
138+
mDiscoverableFooterPreferenceController.onStart();
139+
mDiscoverableFooterPreferenceController.onStop();
140+
141+
assertThat(getRegisteredBroadcastReceivers()).doesNotContain(mBluetoothChangedReceiver);
142+
verify(mAlwaysDiscoverable, never()).stop();
143+
}
144+
123145
@Test
124146
public void onBluetoothStateChanged_bluetoothOn_updateTitle() {
125147
BluetoothAdapter.getDefaultAdapter().setName(DEVICE_NAME);

0 commit comments

Comments
 (0)