diff --git a/src/com/android/settings/development/OemUnlockPreferenceController.java b/src/com/android/settings/development/OemUnlockPreferenceController.java index 2a397f10282..f12d8357186 100644 --- a/src/com/android/settings/development/OemUnlockPreferenceController.java +++ b/src/com/android/settings/development/OemUnlockPreferenceController.java @@ -21,11 +21,13 @@ import static com.android.settings.development.DevelopmentOptionsActivityRequest import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.UserHandle; import android.os.UserManager; import android.service.oemlock.OemLockManager; import android.telephony.TelephonyManager; +import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -41,6 +43,7 @@ public class OemUnlockPreferenceController extends DeveloperOptionsPreferenceCon Preference.OnPreferenceChangeListener, PreferenceControllerMixin, OnActivityResultListener { private static final String PREFERENCE_KEY = "oem_unlock_enable"; + private static final String TAG = "OemUnlockPreferenceController"; private final OemLockManager mOemLockManager; private final UserManager mUserManager; @@ -52,7 +55,16 @@ public class OemUnlockPreferenceController extends DeveloperOptionsPreferenceCon public OemUnlockPreferenceController(Context context, Activity activity, DevelopmentSettingsDashboardFragment fragment) { super(context); - mOemLockManager = (OemLockManager) context.getSystemService(Context.OEM_LOCK_SERVICE); + + if (context.getPackageManager().hasSystemFeature(PackageManager + .FEATURE_TELEPHONY_CARRIERLOCK)) { + 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); mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mFragment = fragment; diff --git a/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java index 08502ddec66..0d6fbd1b78b 100644 --- a/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.content.Context; +import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.UserManager; import android.service.oemlock.OemLockManager; @@ -60,6 +61,8 @@ public class OemUnlockPreferenceControllerTest { @Mock private RestrictedSwitchPreference mPreference; @Mock + private PackageManager mPackageManager; + @Mock private PreferenceScreen mPreferenceScreen; @Mock private OemLockManager mOemLockManager; @@ -74,6 +77,9 @@ public class OemUnlockPreferenceControllerTest { @Before public void setup() { 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.USER_SERVICE)).thenReturn(mUserManager); when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager); @@ -86,6 +92,16 @@ public class OemUnlockPreferenceControllerTest { 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 public void isAvailable_shouldReturnTrueWhenOemLockManagerIsNotNull() { boolean returnValue = mController.isAvailable();