Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74a797ef authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix NPE on UsbManager in w/o usb devices"

parents e8cdb83f f5a236e0
Loading
Loading
Loading
Loading
+46 −15
Original line number Diff line number Diff line
@@ -51,23 +51,37 @@ public class ConnectedDeviceGroupController extends BasePreferenceController
    private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
    private ConnectedUsbDeviceUpdater mConnectedUsbDeviceUpdater;
    private DockUpdater mConnectedDockUpdater;
    private final PackageManager mPackageManager;

    public ConnectedDeviceGroupController(Context context) {
        super(context, KEY);
        mPackageManager = context.getPackageManager();
    }

    @Override
    public void onStart() {
        if (mBluetoothDeviceUpdater != null) {
            mBluetoothDeviceUpdater.registerCallback();
            mBluetoothDeviceUpdater.refreshPreference();
        }

        if (mConnectedUsbDeviceUpdater != null) {
            mConnectedUsbDeviceUpdater.registerCallback();
        }

        mConnectedDockUpdater.registerCallback();
        mBluetoothDeviceUpdater.refreshPreference();
    }

    @Override
    public void onStop() {
        mConnectedUsbDeviceUpdater.unregisterCallback();
        if (mBluetoothDeviceUpdater != null) {
            mBluetoothDeviceUpdater.unregisterCallback();
        }

        if (mConnectedUsbDeviceUpdater != null) {
            mConnectedUsbDeviceUpdater.unregisterCallback();
        }

        mConnectedDockUpdater.unregisterCallback();
    }

@@ -80,9 +94,15 @@ public class ConnectedDeviceGroupController extends BasePreferenceController

        if (isAvailable()) {
            final Context context = screen.getContext();
            if (mBluetoothDeviceUpdater != null) {
                mBluetoothDeviceUpdater.setPrefContext(context);
                mBluetoothDeviceUpdater.forceUpdate();
            }

            if (mConnectedUsbDeviceUpdater != null) {
                mConnectedUsbDeviceUpdater.initUsbPreference(context);
            }

            mConnectedDockUpdater.setPreferenceContext(context);
            mConnectedDockUpdater.forceUpdate();
        }
@@ -90,10 +110,8 @@ public class ConnectedDeviceGroupController extends BasePreferenceController

    @Override
    public int getAvailabilityStatus() {
        final PackageManager packageManager = mContext.getPackageManager();
        return (packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
                || packageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)
                || packageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
        return (hasBluetoothFeature()
                || hasUsbFeature()
                || mConnectedDockUpdater != null)
                ? AVAILABLE_UNSEARCHABLE
                : UNSUPPORTED_ON_DEVICE;
@@ -121,7 +139,7 @@ public class ConnectedDeviceGroupController extends BasePreferenceController
    }

    @VisibleForTesting
    public void init(BluetoothDeviceUpdater bluetoothDeviceUpdater,
    void init(BluetoothDeviceUpdater bluetoothDeviceUpdater,
            ConnectedUsbDeviceUpdater connectedUsbDeviceUpdater,
            DockUpdater connectedDockUpdater) {

@@ -136,8 +154,21 @@ public class ConnectedDeviceGroupController extends BasePreferenceController
                FeatureFactory.getFactory(context).getDockUpdaterFeatureProvider();
        final DockUpdater connectedDockUpdater =
                dockUpdaterFeatureProvider.getConnectedDockUpdater(context, this);
        init(new ConnectedBluetoothDeviceUpdater(context, fragment, this),
                new ConnectedUsbDeviceUpdater(context, fragment, this),
        init(hasBluetoothFeature()
                        ? new ConnectedBluetoothDeviceUpdater(context, fragment, this)
                        : null,
                hasUsbFeature()
                        ? new ConnectedUsbDeviceUpdater(context, fragment, this)
                        : null,
                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);
    }
}
+17 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
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.usb.ConnectedUsbDeviceUpdater;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;

import org.junit.Before;
import org.junit.Test;
@@ -52,7 +54,7 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplicationPackageManager;

@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowApplicationPackageManager.class)
@Config(shadows = {ShadowApplicationPackageManager.class, ShadowBluetoothAdapter.class})
public class ConnectedDeviceGroupControllerTest {

    private static final String PREFERENCE_KEY_1 = "pref_key_1";
@@ -203,4 +205,18 @@ public class ConnectedDeviceGroupControllerTest {
                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();
    }
}