developer-options: avoid oem-unlock preference controller crash

If there is no FEATURE_TELEPHONY_CARRIERLOCK.

BUG: 123583878

Test: lunch sdk_phone_x86-eng
make -j
emulator
the Settings->System->Developer options should not crash

Test:
make RunSettingsRoboTests ROBOTEST_FILTER=OemUnlockPreferenceControllerTest
should all pass (12 tests: 11 existing and 1 new)

Change-Id: I18c08c1ff1a7860616b0081ede4eb19dcfa8814b
This commit is contained in:
bohu
2019-02-14 08:23:25 -08:00
parent cd15971f14
commit 9bc365febd
2 changed files with 29 additions and 1 deletions

View File

@@ -21,11 +21,13 @@ import static com.android.settings.development.DevelopmentOptionsActivityRequest
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.service.oemlock.OemLockManager; import android.service.oemlock.OemLockManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -41,6 +43,7 @@ public class OemUnlockPreferenceController extends DeveloperOptionsPreferenceCon
Preference.OnPreferenceChangeListener, PreferenceControllerMixin, OnActivityResultListener { Preference.OnPreferenceChangeListener, PreferenceControllerMixin, OnActivityResultListener {
private static final String PREFERENCE_KEY = "oem_unlock_enable"; private static final String PREFERENCE_KEY = "oem_unlock_enable";
private static final String TAG = "OemUnlockPreferenceController";
private final OemLockManager mOemLockManager; private final OemLockManager mOemLockManager;
private final UserManager mUserManager; private final UserManager mUserManager;
@@ -52,7 +55,16 @@ public class OemUnlockPreferenceController extends DeveloperOptionsPreferenceCon
public OemUnlockPreferenceController(Context context, Activity activity, public OemUnlockPreferenceController(Context context, Activity activity,
DevelopmentSettingsDashboardFragment fragment) { DevelopmentSettingsDashboardFragment fragment) {
super(context); super(context);
if (context.getPackageManager().hasSystemFeature(PackageManager
.FEATURE_TELEPHONY_CARRIERLOCK)) {
mOemLockManager = (OemLockManager) context.getSystemService(Context.OEM_LOCK_SERVICE); mOemLockManager = (OemLockManager) context.getSystemService(Context.OEM_LOCK_SERVICE);
} else {
mOemLockManager = null;
Log.i(TAG, "Missing FEATURE_TELEPHONY_CARRIERLOCK, OemUnlock Preference" +
" Controller disabled.");
}
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
mFragment = fragment; mFragment = fragment;

View File

@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.UserManager; import android.os.UserManager;
import android.service.oemlock.OemLockManager; import android.service.oemlock.OemLockManager;
@@ -60,6 +61,8 @@ public class OemUnlockPreferenceControllerTest {
@Mock @Mock
private RestrictedSwitchPreference mPreference; private RestrictedSwitchPreference mPreference;
@Mock @Mock
private PackageManager mPackageManager;
@Mock
private PreferenceScreen mPreferenceScreen; private PreferenceScreen mPreferenceScreen;
@Mock @Mock
private OemLockManager mOemLockManager; private OemLockManager mOemLockManager;
@@ -74,6 +77,9 @@ public class OemUnlockPreferenceControllerTest {
@Before @Before
public void setup() { public void setup() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getPackageManager().hasSystemFeature(PackageManager
.FEATURE_TELEPHONY_CARRIERLOCK)).thenReturn(true);
when(mContext.getSystemService(Context.OEM_LOCK_SERVICE)).thenReturn(mOemLockManager); when(mContext.getSystemService(Context.OEM_LOCK_SERVICE)).thenReturn(mOemLockManager);
when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager); when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
@@ -86,6 +92,16 @@ public class OemUnlockPreferenceControllerTest {
mController.displayPreference(mPreferenceScreen); mController.displayPreference(mPreferenceScreen);
} }
@Test
public void OemUnlockPreferenceController_shouldNotCrashWhenMissingFEATURE_TELEPHONY_CARRIERLOCK() {
when(mContext.getPackageManager().hasSystemFeature(PackageManager
.FEATURE_TELEPHONY_CARRIERLOCK)).thenReturn(false);
when(mContext.getSystemService(Context.OEM_LOCK_SERVICE)).thenThrow
(new RuntimeException());
new OemUnlockPreferenceController(mContext, mActivity, mFragment);
}
@Test @Test
public void isAvailable_shouldReturnTrueWhenOemLockManagerIsNotNull() { public void isAvailable_shouldReturnTrueWhenOemLockManagerIsNotNull() {
boolean returnValue = mController.isAvailable(); boolean returnValue = mController.isAvailable();