diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 212aeaeb02d..8c9af29cb23 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1468,6 +1468,17 @@
+
+
+
+
+
+
+
+
diff --git a/src/com/android/settings/ChooseLockSettingsHelper.java b/src/com/android/settings/ChooseLockSettingsHelper.java
index 4c3fb7ba37a..ab814558053 100644
--- a/src/com/android/settings/ChooseLockSettingsHelper.java
+++ b/src/com/android/settings/ChooseLockSettingsHelper.java
@@ -21,6 +21,7 @@ import android.app.Activity;
import android.app.Fragment;
import android.app.admin.DevicePolicyManager;
import android.content.Intent;
+import android.content.IntentSender;
import com.android.internal.widget.LockPatternUtils;
@@ -112,6 +113,27 @@ public final class ChooseLockSettingsHelper {
returnCredentials, external, false, 0, Utils.getEffectiveUserId(mActivity));
}
+ /**
+ * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
+ *
+ * @param title title of the confirmation screen; shown in the action bar
+ * @param header header of the confirmation screen; shown as large text
+ * @param description description of the confirmation screen
+ * @param returnCredentials if true, put credentials into intent. Note that if this is true,
+ * this can only be called internally.
+ * @param external specifies whether this activity is launched externally, meaning that it will
+ * get a dark theme and allow fingerprint authentication
+ * @param userId The userId for whom the lock should be confirmed.
+ * @return true if one exists and we launched an activity to confirm it
+ * @see Activity#onActivityResult(int, int, android.content.Intent)
+ */
+ boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
+ @Nullable CharSequence header, @Nullable CharSequence description,
+ boolean returnCredentials, boolean external, int userId) {
+ return launchConfirmationActivity(request, title, header, description,
+ returnCredentials, external, false, 0, Utils.getSameOwnerUserId(mActivity, userId));
+ }
+
/**
* If a pattern, password or PIN exists, prompt the user before allowing them to change it.
* @param message optional message to display about the action about to be done
@@ -175,8 +197,18 @@ public final class ChooseLockSettingsHelper {
if (external) {
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
if (mFragment != null) {
+ IntentSender intentSender = mFragment.getActivity().getIntent()
+ .getParcelableExtra(Intent.EXTRA_INTENT);
+ if (intentSender != null) {
+ intent.putExtra(Intent.EXTRA_INTENT, intentSender);
+ }
mFragment.startActivity(intent);
} else {
+ IntentSender intentSender = mActivity.getIntent()
+ .getParcelableExtra(Intent.EXTRA_INTENT);
+ if (intentSender != null) {
+ intent.putExtra(Intent.EXTRA_INTENT, intentSender);
+ }
mActivity.startActivity(intent);
}
} else {
diff --git a/src/com/android/settings/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/ConfirmDeviceCredentialActivity.java
index 86935c3fe5b..c4587ebc2fa 100644
--- a/src/com/android/settings/ConfirmDeviceCredentialActivity.java
+++ b/src/com/android/settings/ConfirmDeviceCredentialActivity.java
@@ -20,7 +20,11 @@ package com.android.settings;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Intent;
+import android.os.Binder;
import android.os.Bundle;
+import android.os.Process;
+import android.os.UserHandle;
+import android.os.UserManager;
import android.util.Log;
/**
@@ -30,6 +34,9 @@ import android.util.Log;
public class ConfirmDeviceCredentialActivity extends Activity {
public static final String TAG = ConfirmDeviceCredentialActivity.class.getSimpleName();
+ public static class InternalActivity extends ConfirmDeviceCredentialActivity {
+ }
+
public static Intent createIntent(CharSequence title, CharSequence details) {
Intent intent = new Intent();
intent.setClassName("com.android.settings",
@@ -57,13 +64,24 @@ public class ConfirmDeviceCredentialActivity extends Activity {
Intent intent = getIntent();
String title = intent.getStringExtra(KeyguardManager.EXTRA_TITLE);
String details = intent.getStringExtra(KeyguardManager.EXTRA_DESCRIPTION);
-
+ int userId = Utils.getEffectiveUserId(this);
+ if (isInternalActivity()) {
+ int givenUserId = intent.getIntExtra(Intent.EXTRA_USER_ID, userId);
+ UserManager userManager = UserManager.get(this);
+ if (userManager.isSameProfileGroup(givenUserId, userId)) {
+ userId = givenUserId;
+ }
+ }
ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
if (!helper.launchConfirmationActivity(0 /* request code */, null /* title */, title,
- details, false /* returnCredentials */, true /* isExternal */)) {
+ details, false /* returnCredentials */, true /* isExternal */, userId)) {
Log.d(TAG, "No pattern, password or PIN set.");
setResult(Activity.RESULT_OK);
}
finish();
}
+
+ private boolean isInternalActivity() {
+ return this instanceof ConfirmDeviceCredentialActivity.InternalActivity;
+ }
}
diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
index 32ad317e367..e04f86fe17a 100644
--- a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
@@ -18,6 +18,7 @@ package com.android.settings;
import android.annotation.Nullable;
import android.content.Intent;
+import android.content.IntentSender;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
@@ -124,4 +125,16 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
public void startEnterAnimation() {
}
+
+ protected void checkForPendingIntent() {
+ IntentSender intentSender = getActivity().getIntent()
+ .getParcelableExtra(Intent.EXTRA_INTENT);
+ if (intentSender != null) {
+ try {
+ getActivity().startIntentSenderForResult(intentSender, -1, null, 0, 0, 0);
+ } catch (IntentSender.SendIntentException e) {
+ /* ignore */
+ }
+ }
+ }
}
diff --git a/src/com/android/settings/ConfirmLockPassword.java b/src/com/android/settings/ConfirmLockPassword.java
index 7ef6a577d1d..53555e0c456 100644
--- a/src/com/android/settings/ConfirmLockPassword.java
+++ b/src/com/android/settings/ConfirmLockPassword.java
@@ -20,6 +20,7 @@ import android.app.Fragment;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentSender;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.CountDownTimer;
@@ -405,6 +406,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
mPasswordEntryInputDisabler.setInputEnabled(true);
if (matched) {
startDisappearAnimation(intent);
+ checkForPendingIntent();
} else {
if (timeoutMs > 0) {
long deadline = mLockPatternUtils.setLockoutAttemptDeadline(
diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java
index 44e74c964c0..63312902588 100644
--- a/src/com/android/settings/ConfirmLockPattern.java
+++ b/src/com/android/settings/ConfirmLockPattern.java
@@ -18,6 +18,7 @@ package com.android.settings;
import android.app.Activity;
import android.content.Intent;
+import android.content.IntentSender;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.CountDownTimer;
@@ -473,6 +474,7 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
mLockPatternView.setEnabled(true);
if (matched) {
startDisappearAnimation(intent);
+ checkForPendingIntent();
} else {
if (timeoutMs > 0) {
long deadline = mLockPatternUtils.setLockoutAttemptDeadline(