Fix NPE on UsbManager in w/o usb devices
Bug: 206987614 Test: make -j64 RunSettingsRoboTests Change-Id: I9ed4c2e803f3e7018518380667658ca0015f31a7
This commit is contained in:
@@ -51,23 +51,37 @@ public class ConnectedDeviceGroupController extends BasePreferenceController
|
|||||||
private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
|
private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
|
||||||
private ConnectedUsbDeviceUpdater mConnectedUsbDeviceUpdater;
|
private ConnectedUsbDeviceUpdater mConnectedUsbDeviceUpdater;
|
||||||
private DockUpdater mConnectedDockUpdater;
|
private DockUpdater mConnectedDockUpdater;
|
||||||
|
private final PackageManager mPackageManager;
|
||||||
|
|
||||||
public ConnectedDeviceGroupController(Context context) {
|
public ConnectedDeviceGroupController(Context context) {
|
||||||
super(context, KEY);
|
super(context, KEY);
|
||||||
|
mPackageManager = context.getPackageManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart() {
|
public void onStart() {
|
||||||
mBluetoothDeviceUpdater.registerCallback();
|
if (mBluetoothDeviceUpdater != null) {
|
||||||
mConnectedUsbDeviceUpdater.registerCallback();
|
mBluetoothDeviceUpdater.registerCallback();
|
||||||
|
mBluetoothDeviceUpdater.refreshPreference();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mConnectedUsbDeviceUpdater != null) {
|
||||||
|
mConnectedUsbDeviceUpdater.registerCallback();
|
||||||
|
}
|
||||||
|
|
||||||
mConnectedDockUpdater.registerCallback();
|
mConnectedDockUpdater.registerCallback();
|
||||||
mBluetoothDeviceUpdater.refreshPreference();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStop() {
|
public void onStop() {
|
||||||
mConnectedUsbDeviceUpdater.unregisterCallback();
|
if (mBluetoothDeviceUpdater != null) {
|
||||||
mBluetoothDeviceUpdater.unregisterCallback();
|
mBluetoothDeviceUpdater.unregisterCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mConnectedUsbDeviceUpdater != null) {
|
||||||
|
mConnectedUsbDeviceUpdater.unregisterCallback();
|
||||||
|
}
|
||||||
|
|
||||||
mConnectedDockUpdater.unregisterCallback();
|
mConnectedDockUpdater.unregisterCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,9 +94,15 @@ public class ConnectedDeviceGroupController extends BasePreferenceController
|
|||||||
|
|
||||||
if (isAvailable()) {
|
if (isAvailable()) {
|
||||||
final Context context = screen.getContext();
|
final Context context = screen.getContext();
|
||||||
mBluetoothDeviceUpdater.setPrefContext(context);
|
if (mBluetoothDeviceUpdater != null) {
|
||||||
mBluetoothDeviceUpdater.forceUpdate();
|
mBluetoothDeviceUpdater.setPrefContext(context);
|
||||||
mConnectedUsbDeviceUpdater.initUsbPreference(context);
|
mBluetoothDeviceUpdater.forceUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mConnectedUsbDeviceUpdater != null) {
|
||||||
|
mConnectedUsbDeviceUpdater.initUsbPreference(context);
|
||||||
|
}
|
||||||
|
|
||||||
mConnectedDockUpdater.setPreferenceContext(context);
|
mConnectedDockUpdater.setPreferenceContext(context);
|
||||||
mConnectedDockUpdater.forceUpdate();
|
mConnectedDockUpdater.forceUpdate();
|
||||||
}
|
}
|
||||||
@@ -90,10 +110,8 @@ public class ConnectedDeviceGroupController extends BasePreferenceController
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAvailabilityStatus() {
|
public int getAvailabilityStatus() {
|
||||||
final PackageManager packageManager = mContext.getPackageManager();
|
return (hasBluetoothFeature()
|
||||||
return (packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
|
|| hasUsbFeature()
|
||||||
|| packageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)
|
|
||||||
|| packageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
|
|
||||||
|| mConnectedDockUpdater != null)
|
|| mConnectedDockUpdater != null)
|
||||||
? AVAILABLE_UNSEARCHABLE
|
? AVAILABLE_UNSEARCHABLE
|
||||||
: UNSUPPORTED_ON_DEVICE;
|
: UNSUPPORTED_ON_DEVICE;
|
||||||
@@ -121,7 +139,7 @@ public class ConnectedDeviceGroupController extends BasePreferenceController
|
|||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public void init(BluetoothDeviceUpdater bluetoothDeviceUpdater,
|
void init(BluetoothDeviceUpdater bluetoothDeviceUpdater,
|
||||||
ConnectedUsbDeviceUpdater connectedUsbDeviceUpdater,
|
ConnectedUsbDeviceUpdater connectedUsbDeviceUpdater,
|
||||||
DockUpdater connectedDockUpdater) {
|
DockUpdater connectedDockUpdater) {
|
||||||
|
|
||||||
@@ -136,8 +154,21 @@ public class ConnectedDeviceGroupController extends BasePreferenceController
|
|||||||
FeatureFactory.getFactory(context).getDockUpdaterFeatureProvider();
|
FeatureFactory.getFactory(context).getDockUpdaterFeatureProvider();
|
||||||
final DockUpdater connectedDockUpdater =
|
final DockUpdater connectedDockUpdater =
|
||||||
dockUpdaterFeatureProvider.getConnectedDockUpdater(context, this);
|
dockUpdaterFeatureProvider.getConnectedDockUpdater(context, this);
|
||||||
init(new ConnectedBluetoothDeviceUpdater(context, fragment, this),
|
init(hasBluetoothFeature()
|
||||||
new ConnectedUsbDeviceUpdater(context, fragment, this),
|
? new ConnectedBluetoothDeviceUpdater(context, fragment, this)
|
||||||
|
: null,
|
||||||
|
hasUsbFeature()
|
||||||
|
? new ConnectedUsbDeviceUpdater(context, fragment, this)
|
||||||
|
: null,
|
||||||
connectedDockUpdater);
|
connectedDockUpdater);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasBluetoothFeature() {
|
||||||
|
return mPackageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasUsbFeature() {
|
||||||
|
return mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)
|
||||||
|
|| mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -22,6 +22,7 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.anyString;
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
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;
|
||||||
@@ -38,6 +39,7 @@ import com.android.settings.bluetooth.ConnectedBluetoothDeviceUpdater;
|
|||||||
import com.android.settings.connecteddevice.dock.DockUpdater;
|
import com.android.settings.connecteddevice.dock.DockUpdater;
|
||||||
import com.android.settings.connecteddevice.usb.ConnectedUsbDeviceUpdater;
|
import com.android.settings.connecteddevice.usb.ConnectedUsbDeviceUpdater;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
|
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -52,7 +54,7 @@ import org.robolectric.annotation.Config;
|
|||||||
import org.robolectric.shadows.ShadowApplicationPackageManager;
|
import org.robolectric.shadows.ShadowApplicationPackageManager;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@Config(shadows = ShadowApplicationPackageManager.class)
|
@Config(shadows = {ShadowApplicationPackageManager.class, ShadowBluetoothAdapter.class})
|
||||||
public class ConnectedDeviceGroupControllerTest {
|
public class ConnectedDeviceGroupControllerTest {
|
||||||
|
|
||||||
private static final String PREFERENCE_KEY_1 = "pref_key_1";
|
private static final String PREFERENCE_KEY_1 = "pref_key_1";
|
||||||
@@ -203,4 +205,18 @@ public class ConnectedDeviceGroupControllerTest {
|
|||||||
AVAILABLE_UNSEARCHABLE);
|
AVAILABLE_UNSEARCHABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void init_noBluetoothAndUsbFeature_doesNotCrash() {
|
||||||
|
DashboardFragment fragment = mock(DashboardFragment.class);
|
||||||
|
when(fragment.getContext()).thenReturn(mContext);
|
||||||
|
when(mPreferenceScreen.findPreference(anyString())).thenReturn(mPreferenceGroup);
|
||||||
|
mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false);
|
||||||
|
mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_ACCESSORY, false);
|
||||||
|
mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_HOST, false);
|
||||||
|
|
||||||
|
mConnectedDeviceGroupController.init(fragment);
|
||||||
|
mConnectedDeviceGroupController.displayPreference(mPreferenceScreen);
|
||||||
|
mConnectedDeviceGroupController.onStart();
|
||||||
|
mConnectedDeviceGroupController.onStop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user