diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4996aeb83de..e86f2b4b9ef 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1617,6 +1617,10 @@
android:windowSoftInputMode="stateHidden|adjustResize"
android:theme="@style/GlifTheme.Light"/>
+
+
diff --git a/res/drawable/ic_help_outline_32.xml b/res/drawable/ic_help_outline_32.xml
new file mode 100644
index 00000000000..ffe673eef46
--- /dev/null
+++ b/res/drawable/ic_help_outline_32.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/layout-land/confirm_lock_password.xml b/res/layout-land/confirm_lock_password.xml
index 546ef67b003..3d2589c5b83 100644
--- a/res/layout-land/confirm_lock_password.xml
+++ b/res/layout-land/confirm_lock_password.xml
@@ -54,6 +54,15 @@
android:layout_height="wrap_content"
android:layout_marginStart="?attr/sudMarginSides"
android:layout_marginEnd="?attr/sudMarginSides" />
+
+
+
+
+
+
x
+ android:layout_marginEnd="?attr/sudMarginSides" />
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ac77cc5fb1d..07ed67ada29 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4044,6 +4044,12 @@
To use face unlock, set pattern
To use face unlock, set PIN
+
+ Forgot your password?
+
+ Forgot your pattern?
+
+ Forgot your PIN?
@@ -4215,6 +4221,11 @@
See all %1$d apps
+
+ Contact your IT admin
+
+ They can help you reset your PIN, pattern, or password
+
Your tablet and personal data are more vulnerable
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
index a1eb1066eca..44222047bcb 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
@@ -34,6 +34,7 @@ import android.graphics.drawable.Drawable;
import android.hardware.biometrics.BiometricManager;
import android.os.Bundle;
import android.os.Handler;
+import android.os.UserHandle;
import android.os.UserManager;
import android.text.TextUtils;
import android.view.View;
@@ -77,6 +78,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
protected boolean mReturnCredentials = false;
protected Button mCancelButton;
+ protected Button mForgotButton;
protected int mEffectiveUserId;
protected int mUserId;
protected UserManager mUserManager;
@@ -116,8 +118,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- mCancelButton = (Button) view.findViewById(R.id.cancelButton);
-
+ mCancelButton = view.findViewById(R.id.cancelButton);
boolean showCancelButton = getActivity().getIntent().getBooleanExtra(
SHOW_CANCEL_BUTTON, false);
boolean hasAlternateButton = mFrp && !TextUtils.isEmpty(mFrpAlternateButtonText);
@@ -126,20 +127,27 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
if (hasAlternateButton) {
mCancelButton.setText(mFrpAlternateButtonText);
}
- mCancelButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (hasAlternateButton) {
- getActivity().setResult(KeyguardManager.RESULT_ALTERNATE);
- }
- getActivity().finish();
+ mCancelButton.setOnClickListener(v -> {
+ if (hasAlternateButton) {
+ getActivity().setResult(KeyguardManager.RESULT_ALTERNATE);
}
+ getActivity().finish();
});
- int credentialOwnerUserId = Utils.getCredentialOwnerUserId(
- getActivity(),
- Utils.getUserIdFromBundle(
- getActivity(),
- getActivity().getIntent().getExtras(), isInternalActivity()));
+ mForgotButton = view.findViewById(R.id.forgotButton);
+ if (mUserManager.isManagedProfile(mUserId)
+ && mUserManager.isQuietModeEnabled(UserHandle.of(mUserId))
+ && mDevicePolicyManager.canProfileOwnerResetPasswordWhenLocked(mUserId)) {
+ mForgotButton.setVisibility(View.VISIBLE);
+ mForgotButton.setOnClickListener(v -> {
+ final Intent intent = new Intent();
+ intent.setClassName(SETTINGS_PACKAGE_NAME, ForgotPasswordActivity.class.getName());
+ intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
+ getActivity().startActivity(intent);
+ getActivity().finish();
+ });
+ } else {
+ mForgotButton.setVisibility(View.GONE);
+ }
}
// User could be locked while Effective user is unlocked even though the effective owns the
diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java
index a6a1b37e587..d77fd3a078b 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -16,6 +16,7 @@
package com.android.settings.password;
+import android.annotation.Nullable;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
import android.content.Context;
@@ -203,6 +204,16 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
return view;
}
+ @Override
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ if (mForgotButton != null) {
+ mForgotButton.setText(mIsAlpha
+ ? R.string.lockpassword_forgot_password
+ : R.string.lockpassword_forgot_pin);
+ }
+ }
+
private int getDefaultHeader() {
if (mFrp) {
return mIsAlpha ? R.string.lockpassword_confirm_your_password_header_frp
@@ -256,6 +267,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
mHeaderTextView.setAlpha(0f);
mDetailsTextView.setAlpha(0f);
mCancelButton.setAlpha(0f);
+ mForgotButton.setAlpha(0f);
mPasswordEntry.setAlpha(0f);
mErrorTextView.setAlpha(0f);
}
@@ -267,6 +279,9 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
if (mCancelButton.getVisibility() == View.VISIBLE) {
result.add(mCancelButton);
}
+ if (mForgotButton.getVisibility() == View.VISIBLE) {
+ result.add(mForgotButton);
+ }
result.add(mPasswordEntry);
result.add(mErrorTextView);
return result.toArray(new View[] {});
diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java
index d52992fee86..fd164b8d097 100644
--- a/src/com/android/settings/password/ConfirmLockPattern.java
+++ b/src/com/android/settings/password/ConfirmLockPattern.java
@@ -16,6 +16,7 @@
package com.android.settings.password;
+import android.annotation.Nullable;
import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Intent;
@@ -181,9 +182,18 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
getFragmentManager().beginTransaction().add(mCredentialCheckResultTracker,
FRAGMENT_TAG_CHECK_LOCK_RESULT).commit();
}
+
return view;
}
+ @Override
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ if (mForgotButton != null) {
+ mForgotButton.setText(R.string.lockpassword_forgot_pattern);
+ }
+ }
+
@Override
public void onSaveInstanceState(Bundle outState) {
// deliberately not calling super since we are managing this in full
@@ -230,6 +240,7 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
super.prepareEnterAnimation();
mHeaderTextView.setAlpha(0f);
mCancelButton.setAlpha(0f);
+ mForgotButton.setAlpha(0f);
mLockPatternView.setAlpha(0f);
mDetailsTextView.setAlpha(0f);
}
@@ -252,10 +263,13 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
private Object[][] getActiveViews() {
ArrayList> result = new ArrayList<>();
- result.add(new ArrayList