diff --git a/res/values/strings.xml b/res/values/strings.xml
index 47e6a361437..c06035b25a0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3400,6 +3400,15 @@
Enable OEM unlock
Allow the device to be OEM unlocked
+
+ Enter your PIN
+
+ Enter your device PIN to enable OEM unlock
+
+ Warning
+
+ Enabling OEM unlock disables theft protection features on this device and may void your warranty. Continue?
+
Wireless display certification
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 8c13f9cf35c..f64b16b07e9 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -33,6 +33,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
import android.hardware.usb.IUsbManager;
import android.hardware.usb.UsbManager;
import android.net.wifi.WifiManager;
@@ -167,6 +168,8 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
+ private static final int REQUEST_CODE_ENABLE_OEM_UNLOCK = 0;
+
private static String DEFAULT_LOG_RING_BUFFER_SIZE_IN_BYTES = "262144"; // 256K
private IWindowManager mWindowManager;
@@ -1320,6 +1323,24 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
getActivity().getContentResolver(), Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0);
}
+ private void confirmEnableOemUnlock() {
+ DialogInterface.OnClickListener onConfirmListener = new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Utils.setOemUnlockEnabled(getActivity(), true);
+ updateAllOptions();
+ }
+ };
+
+ new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.confirm_enable_oem_unlock_title)
+ .setMessage(R.string.confirm_enable_oem_unlock_text)
+ .setPositiveButton(R.string.yes, onConfirmListener)
+ .setNegativeButton(android.R.string.cancel, null)
+ .create()
+ .show();
+ }
+
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
if (switchView != mSwitchBar.getSwitch()) {
@@ -1355,6 +1376,14 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
writeDebuggerOptions();
updateDebuggerOptions();
}
+ } else if (requestCode == REQUEST_CODE_ENABLE_OEM_UNLOCK) {
+ if (resultCode == Activity.RESULT_OK) {
+ if (mEnableOemUnlock.isChecked()) {
+ confirmEnableOemUnlock();
+ } else {
+ Utils.setOemUnlockEnabled(getActivity(), false);
+ }
+ }
} else {
super.onActivityResult(requestCode, resultCode, data);
}
@@ -1408,7 +1437,13 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
} else if (preference == mBtHciSnoopLog) {
writeBtHciSnoopLogOptions();
} else if (preference == mEnableOemUnlock) {
- Utils.setOemUnlockEnabled(getActivity(), mEnableOemUnlock.isChecked());
+ if (!showKeyguardConfirmation(getResources(), REQUEST_CODE_ENABLE_OEM_UNLOCK)) {
+ if (mEnableOemUnlock.isChecked()) {
+ confirmEnableOemUnlock();
+ } else {
+ Utils.setOemUnlockEnabled(getActivity(), false);
+ }
+ }
} else if (preference == mAllowMockLocation) {
Settings.Secure.putInt(getActivity().getContentResolver(),
Settings.Secure.ALLOW_MOCK_LOCATION,
@@ -1470,6 +1505,13 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
return false;
}
+ private boolean showKeyguardConfirmation(Resources resources, int requestCode) {
+ return new ChooseLockSettingsHelper(getActivity(), this)
+ .launchConfirmationActivity(requestCode,
+ resources.getString(R.string.oem_unlock_enable_pin_prompt),
+ resources.getString(R.string.oem_unlock_enable_pin_description));
+ }
+
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (HDCP_CHECKING_KEY.equals(preference.getKey())) {