diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9f266b69bfc..66068eb6d16 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -73,6 +73,7 @@ + diff --git a/src/com/android/settings/MasterClearConfirm.java b/src/com/android/settings/MasterClearConfirm.java index 153a1aad2ab..7a85dbe15b8 100644 --- a/src/com/android/settings/MasterClearConfirm.java +++ b/src/com/android/settings/MasterClearConfirm.java @@ -25,6 +25,7 @@ import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.service.oemlock.OemLockManager; import android.service.persistentdata.PersistentDataBlockManager; import android.view.LayoutInflater; import android.view.View; @@ -67,12 +68,14 @@ public class MasterClearConfirm extends OptionsMenuFragment { final PersistentDataBlockManager pdbManager = (PersistentDataBlockManager) getActivity().getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); + final OemLockManager oemLockManager = (OemLockManager) + getActivity().getSystemService(Context.OEM_LOCK_SERVICE); - if (pdbManager != null && !pdbManager.getOemUnlockEnabled() && + if (pdbManager != null && !oemLockManager.isOemUnlockAllowed() && Utils.isDeviceProvisioned(getActivity())) { - // if OEM unlock is enabled, this will be wiped during FR process. If disabled, it - // will be wiped here, unless the device is still being provisioned, in which case - // the persistent data block will be preserved. + // if OEM unlock is allowed, the persistent data block will be wiped during FR + // process. If disabled, it will be wiped here, unless the device is still being + // provisioned, in which case the persistent data block will be preserved. new AsyncTask() { int mOldOrientation; ProgressDialog mProgressDialog; diff --git a/src/com/android/settings/development/DevelopmentSettings.java b/src/com/android/settings/development/DevelopmentSettings.java index bfb9f0f0e5f..376005cb793 100644 --- a/src/com/android/settings/development/DevelopmentSettings.java +++ b/src/com/android/settings/development/DevelopmentSettings.java @@ -59,7 +59,7 @@ import android.os.UserManager; import android.os.storage.IStorageManager; import android.provider.SearchIndexableResource; import android.provider.Settings; -import android.service.persistentdata.PersistentDataBlockManager; +import android.service.oemlock.OemLockManager; import android.support.annotation.VisibleForTesting; import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.ListPreference; @@ -238,7 +238,6 @@ public class DevelopmentSettings extends RestrictedSettingsFragment private static final int RESULT_DEBUG_APP = 1000; private static final int RESULT_MOCK_LOCATION_APP = 1001; - private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst"; private static final String FLASH_LOCKED_PROP = "ro.boot.flash.locked"; private static final String SHORTCUT_MANAGER_RESET_KEY = "reset_shortcut_manager_throttling"; @@ -252,7 +251,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment private IWebViewUpdateService mWebViewUpdateService; private UserManager mUm; private WifiManager mWifiManager; - private PersistentDataBlockManager mOemUnlockManager; + private OemLockManager mOemLockManager; private TelephonyManager mTelephonyManager; private SwitchBar mSwitchBar; @@ -383,8 +382,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment mBackupManager = IBackupManager.Stub.asInterface( ServiceManager.getService(Context.BACKUP_SERVICE)); mWebViewUpdateService = WebViewFactory.getUpdateService(); - mOemUnlockManager = (PersistentDataBlockManager) getActivity() - .getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); + mOemLockManager = (OemLockManager) getSystemService(Context.OEM_LOCK_SERVICE); mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); mUm = (UserManager) getSystemService(Context.USER_SERVICE); @@ -431,7 +429,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment mKeepScreenOn = (RestrictedSwitchPreference) findAndInitSwitchPref(KEEP_SCREEN_ON); mBtHciSnoopLog = findAndInitSwitchPref(BT_HCI_SNOOP_LOG); mEnableOemUnlock = (RestrictedSwitchPreference) findAndInitSwitchPref(ENABLE_OEM_UNLOCK); - if (!showEnableOemUnlockPreference()) { + if (!showEnableOemUnlockPreference(getActivity())) { removePreference(mEnableOemUnlock); mEnableOemUnlock = null; } @@ -1070,18 +1068,17 @@ public class DevelopmentSettings extends RestrictedSettingsFragment Settings.Global.PACKAGE_VERIFIER_SETTING_VISIBLE, 1) > 0; } - private static boolean showEnableOemUnlockPreference() { - return !SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP).equals(""); + private static boolean showEnableOemUnlockPreference(Context context) { + return context.getSystemService(Context.OEM_LOCK_SERVICE) != null; } private boolean enableOemUnlockPreference() { - return !isBootloaderUnlocked() && OemUnlockUtils.isOemUnlockAllowed(mUm); + return !isBootloaderUnlocked() && mOemLockManager.canUserAllowOemUnlock(); } private void updateOemUnlockOptions() { if (mEnableOemUnlock != null) { - updateSwitchPreference(mEnableOemUnlock, - OemUnlockUtils.isOemUnlockEnabled(getActivity())); + updateSwitchPreference(mEnableOemUnlock, mOemLockManager.isOemUnlockAllowed()); updateOemUnlockSettingDescription(); // Showing mEnableOemUnlock preference as device has persistent data block. mEnableOemUnlock.setDisabledByAdmin(null); @@ -2339,7 +2336,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment @Override public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_POSITIVE) { - OemUnlockUtils.setOemUnlockEnabled(getActivity(), true); + mOemLockManager.setOemUnlockAllowedByUser(true); } } }; @@ -2410,7 +2407,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment if (mEnableOemUnlock.isChecked()) { confirmEnableOemUnlock(); } else { - OemUnlockUtils.setOemUnlockEnabled(getActivity(), false); + mOemLockManager.setOemUnlockAllowedByUser(false); } } } else { @@ -2480,7 +2477,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment confirmEnableOemUnlock(); } } else { - OemUnlockUtils.setOemUnlockEnabled(getActivity(), false); + mOemLockManager.setOemUnlockAllowedByUser(false); } } else if (preference == mMockLocationAppPref) { Intent intent = new Intent(getActivity(), AppPicker.class); @@ -2821,7 +2818,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment } final List keys = new ArrayList(); - if (!showEnableOemUnlockPreference()) { + if (!showEnableOemUnlockPreference(context)) { keys.add(ENABLE_OEM_UNLOCK); } return keys; @@ -2849,11 +2846,10 @@ public class DevelopmentSettings extends RestrictedSettingsFragment oemUnlockSummary = R.string.oem_unlock_enable_disabled_summary_bootloader_unlocked; } else if (isSimLockedDevice()) { oemUnlockSummary = R.string.oem_unlock_enable_disabled_summary_sim_locked_device; - } else if (!OemUnlockUtils.isOemUnlockAllowed(mUm)) { - // If the device isn't SIM-locked but OEM unlock is disabled by the system via the - // user restriction, this means either some other carrier restriction is in place or - // the device hasn't been able to confirm which restrictions (SIM-lock or otherwise) - // apply. + } else if (!mOemLockManager.canUserAllowOemUnlock()) { + // If the device isn't SIM-locked but OEM unlock is disallowed by some party, this + // means either some other carrier restriction is in place or the device hasn't been + // able to confirm which restrictions (SIM-lock or otherwise) apply. oemUnlockSummary = R.string.oem_unlock_enable_disabled_summary_connectivity_or_locked; } @@ -2876,12 +2872,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment * Returns {@code true} if the bootloader has been unlocked. Otherwise, returns {code false}. */ private boolean isBootloaderUnlocked() { - int flashLockState = PersistentDataBlockManager.FLASH_LOCK_UNKNOWN; - if (mOemUnlockManager != null) { - flashLockState = mOemUnlockManager.getFlashLockState(); - } - - return flashLockState == PersistentDataBlockManager.FLASH_LOCK_UNLOCKED; + return mOemLockManager.isDeviceOemUnlocked(); } diff --git a/src/com/android/settings/development/OemUnlockUtils.java b/src/com/android/settings/development/OemUnlockUtils.java deleted file mode 100644 index cee3679ea89..00000000000 --- a/src/com/android/settings/development/OemUnlockUtils.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.development; - -import android.content.Context; -import android.os.UserHandle; -import android.os.UserManager; -import android.service.persistentdata.PersistentDataBlockManager; -import android.util.Log; - -public class OemUnlockUtils { - private static final String TAG = "OemUnlockUtils"; - - /** - * Returns whether or not this device is able to be OEM unlocked. - */ - static boolean isOemUnlockEnabled(Context context) { - PersistentDataBlockManager manager = (PersistentDataBlockManager) - context.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); - return manager.getOemUnlockEnabled(); - } - - /** - * Allows enabling or disabling OEM unlock on this device. OEM unlocked - * devices allow users to flash other OSes to them. - */ - static void setOemUnlockEnabled(Context context, boolean enabled) { - try { - PersistentDataBlockManager manager = (PersistentDataBlockManager) - context.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); - manager.setOemUnlockEnabled(enabled); - } catch (SecurityException e) { - Log.e(TAG, "Fail to set oem unlock.", e); - } - } - - /** - * Returns {@code true} if OEM unlock is disallowed by user restriction - * {@link UserManager#DISALLOW_FACTORY_RESET} or {@link UserManager#DISALLOW_OEM_UNLOCK}. - * Otherwise, returns {@code false}. - */ - static boolean isOemUnlockAllowed(UserManager um) { - final UserHandle userHandle = UserHandle.of(UserHandle.myUserId()); - return !(um.hasBaseUserRestriction(UserManager.DISALLOW_OEM_UNLOCK, userHandle) - || um.hasBaseUserRestriction(UserManager.DISALLOW_FACTORY_RESET, userHandle)); - } -} diff --git a/tests/robotests/src/android/service/oemlock/OemLockManager.java b/tests/robotests/src/android/service/oemlock/OemLockManager.java new file mode 100644 index 00000000000..7c015cf5051 --- /dev/null +++ b/tests/robotests/src/android/service/oemlock/OemLockManager.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.oemlock; + +/** + * Make OemLockManager available to Robolectric. + */ +public class OemLockManager { + public void setOemUnlockAllowedByCarrier(boolean allowed, byte[] signature) {} + + public boolean isOemUnlockAllowedByCarrier() { + return true; + } + + public void setOemUnlockAllowedByUser(boolean allowed) {} + + public boolean isOemUnlockAllowedByUser() { + return false; + } + + public boolean canUserAllowOemUnlock() { + return true; + } + public boolean isOemUnlockAllowed() { + return false; + } + + public boolean isDeviceOemUnlocked() { + return false; + } +}