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:
@@ -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
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user