diff options
| author | 2018-01-13 01:13:26 +0000 | |
|---|---|---|
| committer | 2018-01-13 01:13:26 +0000 | |
| commit | e1daf52b92adf3962ded260a36a9594ef8540823 (patch) | |
| tree | 7e366a0a349198edb7d08fda295006b6822eab6a | |
| parent | 64938fb2904fa28459aa9c5d2cd7cc1e4ad07b11 (diff) | |
| parent | c80c67e7bc96691b6e3700bac49e819ad52db0ae (diff) | |
Merge "Allow custom keyguard "prompt reason""
33 files changed, 148 insertions, 50 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 4f5754ef3b72..b47304a41bc2 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -162,6 +162,7 @@ package android { field public static final java.lang.String SET_TIME = "android.permission.SET_TIME"; field public static final java.lang.String SET_VOLUME_KEY_LONG_PRESS_LISTENER = "android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER"; field public static final java.lang.String SET_WALLPAPER_COMPONENT = "android.permission.SET_WALLPAPER_COMPONENT"; + field public static final java.lang.String SHOW_KEYGUARD_MESSAGE = "android.permission.SHOW_KEYGUARD_MESSAGE"; field public static final java.lang.String SHUTDOWN = "android.permission.SHUTDOWN"; field public static final java.lang.String SIGNAL_PERSISTENT_PROCESSES = "android.permission.SIGNAL_PERSISTENT_PROCESSES"; field public static final java.lang.String STATUS_BAR = "android.permission.STATUS_BAR"; @@ -314,6 +315,7 @@ package android.app { public class KeyguardManager { method public android.content.Intent createConfirmFactoryResetCredentialIntent(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence); + method public void requestDismissKeyguard(android.app.Activity, java.lang.CharSequence, android.app.KeyguardManager.KeyguardDismissCallback); } public class Notification implements android.os.Parcelable { diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index a9e633ff392d..696899f73b96 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -620,8 +620,9 @@ interface IActivityManager { boolean updateDisplayOverrideConfiguration(in Configuration values, int displayId); void moveStackToDisplay(int stackId, int displayId); boolean requestAutofillData(in IAssistDataReceiver receiver, in Bundle receiverExtras, - in IBinder activityToken, int flags); - void dismissKeyguard(in IBinder token, in IKeyguardDismissCallback callback); + in IBinder activityToken, int flags); + void dismissKeyguard(in IBinder token, in IKeyguardDismissCallback callback, + in CharSequence message); int restartUserInBackground(int userId); /** Cancels the window transitions for the given task. */ diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java index af536f6e9cc9..024dbcbe4169 100644 --- a/core/java/android/app/KeyguardManager.java +++ b/core/java/android/app/KeyguardManager.java @@ -477,6 +477,39 @@ public class KeyguardManager { */ public void requestDismissKeyguard(@NonNull Activity activity, @Nullable KeyguardDismissCallback callback) { + requestDismissKeyguard(activity, null /* message */, callback); + } + + /** + * If the device is currently locked (see {@link #isKeyguardLocked()}, requests the Keyguard to + * be dismissed. + * <p> + * If the Keyguard is not secure or the device is currently in a trusted state, calling this + * method will immediately dismiss the Keyguard without any user interaction. + * <p> + * If the Keyguard is secure and the device is not in a trusted state, this will bring up the + * UI so the user can enter their credentials. + * <p> + * If the value set for the {@link Activity} attr {@link android.R.attr#turnScreenOn} is true, + * the screen will turn on when the keyguard is dismissed. + * + * @param activity The activity requesting the dismissal. The activity must be either visible + * by using {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} or must be in a state in + * which it would be visible if Keyguard would not be hiding it. If that's not + * the case, the request will fail immediately and + * {@link KeyguardDismissCallback#onDismissError} will be invoked. + * @param message A message that will be shown in the keyguard explaining why the user + * would want to dismiss it. + * @param callback The callback to be called if the request to dismiss Keyguard was successful + * or {@code null} if the caller isn't interested in knowing the result. The + * callback will not be invoked if the activity was destroyed before the + * callback was received. + * @hide + */ + @RequiresPermission(Manifest.permission.SHOW_KEYGUARD_MESSAGE) + @SystemApi + public void requestDismissKeyguard(@NonNull Activity activity, @Nullable CharSequence message, + @Nullable KeyguardDismissCallback callback) { try { mAm.dismissKeyguard(activity.getActivityToken(), new IKeyguardDismissCallback.Stub() { @Override @@ -499,7 +532,7 @@ public class KeyguardManager { activity.mHandler.post(callback::onDismissCancelled); } } - }); + }, message); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 700106739665..8c7032207c34 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -147,7 +147,7 @@ interface IWindowManager void exitKeyguardSecurely(IOnKeyguardExitResult callback); boolean isKeyguardLocked(); boolean isKeyguardSecure(); - void dismissKeyguard(IKeyguardDismissCallback callback); + void dismissKeyguard(IKeyguardDismissCallback callback, CharSequence message); // Requires INTERACT_ACROSS_USERS_FULL permission void setSwitchingUser(boolean switching); diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index 69184c34cf7a..e5d5685ab3e8 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -35,7 +35,7 @@ oneway interface IKeyguardService { void addStateMonitorCallback(IKeyguardStateCallback callback); void verifyUnlock(IKeyguardExitCallback callback); - void dismiss(IKeyguardDismissCallback callback); + void dismiss(IKeyguardDismissCallback callback, CharSequence message); void onDreamingStarted(); void onDreamingStopped(); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 35dc62461047..b5c5fa61227e 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3398,6 +3398,12 @@ <permission android:name="android.permission.PROVIDE_TRUST_AGENT" android:protectionLevel="signature|privileged" /> + <!-- @SystemApi Allows an application to show a message + on the keyguard when asking to dismiss it. + @hide For security reasons, this is a platform-only permission. --> + <permission android:name="android.permission.SHOW_KEYGUARD_MESSAGE" + android:protectionLevel="signature|privileged" /> + <!-- Allows an application to launch the trust agent settings activity. @hide --> <permission android:name="android.permission.LAUNCH_TRUST_AGENT_SETTINGS" diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 73d03c627157..600f0dc37775 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -616,7 +616,7 @@ public class BugreportProgressService extends Service { final IWindowManager wm = IWindowManager.Stub .asInterface(ServiceManager.getService(Context.WINDOW_SERVICE)); try { - wm.dismissKeyguard(null); + wm.dismissKeyguard(null, null); } catch (Exception e) { // ignore it } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java index a980413922ed..d63ad0840734 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -280,7 +280,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout @Override public void showPromptReason(int reason) { if (reason != PROMPT_REASON_NONE) { - int promtReasonStringRes = getPromtReasonStringRes(reason); + int promtReasonStringRes = getPromptReasonStringRes(reason); if (promtReasonStringRes != 0) { mSecurityMessageDisplay.setMessage(promtReasonStringRes); } @@ -288,12 +288,12 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout } @Override - public void showMessage(String message, int color) { + public void showMessage(CharSequence message, int color) { mSecurityMessageDisplay.setNextMessageColor(color); mSecurityMessageDisplay.setMessage(message); } - protected abstract int getPromtReasonStringRes(int reason); + protected abstract int getPromptReasonStringRes(int reason); // Cause a VIRTUAL_KEY vibration public void doHapticKeyClick() { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java index 27a3f7d44890..f1a5ca9fba93 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java @@ -34,6 +34,7 @@ import android.widget.FrameLayout; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityContainer.SecurityCallback; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; +import com.android.settingslib.Utils; import java.io.File; @@ -171,10 +172,14 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { mSecurityContainer.showPromptReason(reason); } - public void showMessage(String message, int color) { + public void showMessage(CharSequence message, int color) { mSecurityContainer.showMessage(message, color); } + public void showErrorMessage(CharSequence message) { + showMessage(message, Utils.getColorError(mContext)); + } + /** * Dismisses the keyguard by going to the next screen or making it gone. * @param targetUserId a user that needs to be the foreground user at the dismissal completion. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java index b6184a883210..ff5f5e77b3f9 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java @@ -117,7 +117,7 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView } @Override - protected int getPromtReasonStringRes(int reason) { + protected int getPromptReasonStringRes(int reason) { switch (reason) { case PROMPT_REASON_RESTART: return R.string.kg_prompt_reason_restart_password; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java index d636316dfe96..cb066a10a9c9 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java @@ -398,7 +398,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit } @Override - public void showMessage(String message, int color) { + public void showMessage(CharSequence message, int color) { mSecurityMessageDisplay.setNextMessageColor(color); mSecurityMessageDisplay.setMessage(message); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java index c04ae68dab36..6539ccffc61b 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java @@ -103,7 +103,7 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView } @Override - protected int getPromtReasonStringRes(int reason) { + protected int getPromptReasonStringRes(int reason) { switch (reason) { case PROMPT_REASON_RESTART: return R.string.kg_prompt_reason_restart_pin; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 9f393215c9bd..8dc4609f1b9d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -543,8 +543,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } } - - public void showMessage(String message, int color) { + public void showMessage(CharSequence message, int color) { if (mCurrentSecuritySelection != SecurityMode.None) { getSecurityView(mCurrentSecuritySelection).showMessage(message, color); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java index 829084202f5a..360dba3bc0ea 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java @@ -106,7 +106,7 @@ public interface KeyguardSecurityView { * @param message the message to show * @param color the color to use */ - void showMessage(String message, int color); + void showMessage(CharSequence message, int color); /** * Instruct the view to show usability hints, if any. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java index 6012c4501412..a2ff8f7896aa 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java @@ -139,7 +139,7 @@ public class KeyguardSecurityViewFlipper extends ViewFlipper implements Keyguard } @Override - public void showMessage(String message, int color) { + public void showMessage(CharSequence message, int color) { KeyguardSecurityView ksv = getSecurityView(); if (ksv != null) { ksv.showMessage(message, color); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java index 6e0b56e25a3f..e7432ba5855d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java @@ -168,7 +168,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } @Override - protected int getPromtReasonStringRes(int reason) { + protected int getPromptReasonStringRes(int reason) { // No message on SIM Pin return 0; } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java index 876d170e08cd..afee8ece26c4 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java @@ -211,7 +211,7 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } @Override - protected int getPromtReasonStringRes(int reason) { + protected int getPromptReasonStringRes(int reason) { // No message on SIM Puk return 0; } diff --git a/packages/SystemUI/src/com/android/keyguard/ViewMediatorCallback.java b/packages/SystemUI/src/com/android/keyguard/ViewMediatorCallback.java index eff84c6a6ad5..5c6812367a15 100644 --- a/packages/SystemUI/src/com/android/keyguard/ViewMediatorCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/ViewMediatorCallback.java @@ -99,4 +99,10 @@ public interface ViewMediatorCallback { * Invoked when the secondary display showing a keyguard window changes. */ void onSecondaryDisplayShowingChanged(int displayId); + + /** + * Consumes a message that was enqueued to be displayed on the next time the bouncer shows up. + * @return Message that should be displayed above the challenge. + */ + CharSequence consumeCustomMessage(); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 2a5ae0d3efc8..22b41a4f9cfa 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -96,9 +96,9 @@ public class KeyguardService extends Service { } @Override // Binder interface - public void dismiss(IKeyguardDismissCallback callback) { + public void dismiss(IKeyguardDismissCallback callback, CharSequence message) { checkPermission(); - mKeyguardViewMediator.dismiss(callback); + mKeyguardViewMediator.dismiss(callback, message); } @Override // Binder interface diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 91ae4485ca0e..653e5000f72c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -25,7 +25,6 @@ import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STR import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_TIMEOUT; - import android.app.ActivityManager; import android.app.AlarmManager; import android.app.NotificationManager; @@ -344,6 +343,7 @@ public class KeyguardViewMediator extends SystemUI { private boolean mWakeAndUnlocking; private IKeyguardDrawnCallback mDrawnCallback; private boolean mLockWhenSimRemoved; + private CharSequence mCustomMessage; KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { @@ -368,7 +368,7 @@ public class KeyguardViewMediator extends SystemUI { return; } else if (info.isGuest() || info.isDemo()) { // If we just switched to a guest, try to dismiss keyguard. - dismiss(null /* callback */); + dismiss(null /* callback */, null /* message */); } } } @@ -654,6 +654,13 @@ public class KeyguardViewMediator extends SystemUI { } @Override + public CharSequence consumeCustomMessage() { + final CharSequence message = mCustomMessage; + mCustomMessage = null; + return message; + } + + @Override public void onSecondaryDisplayShowingChanged(int displayId) { synchronized (KeyguardViewMediator.this) { setShowingLocked(mShowing, displayId, false); @@ -1321,20 +1328,22 @@ public class KeyguardViewMediator extends SystemUI { /** * Dismiss the keyguard through the security layers. * @param callback Callback to be informed about the result + * @param message Message that should be displayed on the bouncer. */ - private void handleDismiss(IKeyguardDismissCallback callback) { + private void handleDismiss(IKeyguardDismissCallback callback, CharSequence message) { if (mShowing) { if (callback != null) { mDismissCallbackRegistry.addCallback(callback); } + mCustomMessage = message; mStatusBarKeyguardViewManager.dismissAndCollapse(); } else if (callback != null) { new DismissCallbackWrapper(callback).notifyDismissError(); } } - public void dismiss(IKeyguardDismissCallback callback) { - mHandler.obtainMessage(DISMISS, callback).sendToTarget(); + public void dismiss(IKeyguardDismissCallback callback, CharSequence message) { + mHandler.obtainMessage(DISMISS, new DismissMessage(callback, message)).sendToTarget(); } /** @@ -1551,7 +1560,8 @@ public class KeyguardViewMediator extends SystemUI { } break; case DISMISS: - handleDismiss((IKeyguardDismissCallback) msg.obj); + final DismissMessage message = (DismissMessage) msg.obj; + handleDismiss(message.getCallback(), message.getMessage()); break; case START_KEYGUARD_EXIT_ANIM: Trace.beginSection("KeyguardViewMediator#handleMessage START_KEYGUARD_EXIT_ANIM"); @@ -2161,4 +2171,22 @@ public class KeyguardViewMediator extends SystemUI { } } } + + private static class DismissMessage { + private final CharSequence mMessage; + private final IKeyguardDismissCallback mCallback; + + DismissMessage(IKeyguardDismissCallback callback, CharSequence message) { + mCallback = callback; + mMessage = message; + } + + public IKeyguardDismissCallback getCallback() { + return mCallback; + } + + public CharSequence getMessage() { + return mMessage; + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index b71ebfdcfb75..699e8cf145bc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -131,6 +131,10 @@ public class KeyguardBouncer { mRoot.setVisibility(View.VISIBLE); mKeyguardView.onResume(); showPromptReason(mBouncerPromptReason); + final CharSequence customMessage = mCallback.consumeCustomMessage(); + if (customMessage != null) { + mKeyguardView.showErrorMessage(customMessage); + } // We might still be collapsed and the view didn't have time to layout yet or still // be small, let's wait on the predraw to do the animation in that case. if (mKeyguardView.getHeight() != 0 && mKeyguardView.getHeight() != mStatusBarHeight) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 8504d8e5fee5..c6673095d932 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -175,13 +175,18 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb public void dismissWithAction(OnDismissAction r, Runnable cancelAction, boolean afterKeyguardGone) { + dismissWithAction(r, cancelAction, afterKeyguardGone, null /* message */); + } + + public void dismissWithAction(OnDismissAction r, Runnable cancelAction, + boolean afterKeyguardGone, String message) { if (mShowing) { cancelPendingWakeupAction(); // If we're dozing, this needs to be delayed until after we wake up - unless we're // wake-and-unlocking, because there dozing will last until the end of the transition. if (mDozing && !isWakeAndUnlocking()) { mPendingWakeupAction = new DismissWithActionRequest( - r, cancelAction, afterKeyguardGone); + r, cancelAction, afterKeyguardGone, message); return; } @@ -632,7 +637,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb if (request != null) { if (mShowing) { dismissWithAction(request.dismissAction, request.cancelAction, - request.afterKeyguardGone); + request.afterKeyguardGone, request.message); } else if (request.dismissAction != null) { request.dismissAction.onDismiss(); } @@ -651,12 +656,14 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb final OnDismissAction dismissAction; final Runnable cancelAction; final boolean afterKeyguardGone; + final String message; DismissWithActionRequest(OnDismissAction dismissAction, Runnable cancelAction, - boolean afterKeyguardGone) { + boolean afterKeyguardGone, String message) { this.dismissAction = dismissAction; this.cancelAction = cancelAction; this.afterKeyguardGone = afterKeyguardGone; + this.message = message; } } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 65651874b9f7..2bf8b7c05f11 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -8401,7 +8401,7 @@ public class ActivityManagerService extends IActivityManager.Stub public void onDismissCancelled() throws RemoteException { // Do nothing } - }); + }, null /* message */); } catch (RemoteException e) { // Local call } @@ -25277,11 +25277,15 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public void dismissKeyguard(IBinder token, IKeyguardDismissCallback callback) - throws RemoteException { + public void dismissKeyguard(IBinder token, IKeyguardDismissCallback callback, + CharSequence message) throws RemoteException { + if (message != null) { + enforceCallingPermission(permission.SHOW_KEYGUARD_MESSAGE, + "dismissKeyguard()"); + } final long callingId = Binder.clearCallingIdentity(); try { - mKeyguardController.dismissKeyguard(token, callback); + mKeyguardController.dismissKeyguard(token, callback, message); } finally { Binder.restoreCallingIdentity(callingId); } diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java index 35f4f253198f..4d7bc1e4af56 100644 --- a/services/core/java/com/android/server/am/KeyguardController.java +++ b/services/core/java/com/android/server/am/KeyguardController.java @@ -150,7 +150,7 @@ class KeyguardController { } } - void dismissKeyguard(IBinder token, IKeyguardDismissCallback callback) { + void dismissKeyguard(IBinder token, IKeyguardDismissCallback callback, CharSequence message) { final ActivityRecord activityRecord = ActivityRecord.forTokenLocked(token); if (activityRecord == null || !activityRecord.visibleIgnoringKeyguard) { failCallback(callback); @@ -164,7 +164,7 @@ class KeyguardController { mStackSupervisor.wakeUp("dismissKeyguard"); } - mWindowManager.dismissKeyguard(callback); + mWindowManager.dismissKeyguard(callback, message); } private void setKeyguardGoingAway(boolean keyguardGoingAway) { @@ -304,7 +304,7 @@ class KeyguardController { // insecure case, we actually show it on top of the lockscreen. See #canShowWhileOccluded. if (!mOccluded && mDismissingKeyguardActivity != null && mWindowManager.isKeyguardSecure()) { - mWindowManager.dismissKeyguard(null /* callback */); + mWindowManager.dismissKeyguard(null /* callback */, null /* message */); mDismissalRequested = true; // If we are about to unocclude the Keyguard, but we can dismiss it without security, diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java index ba3e25aea66c..21f9135bd03d 100644 --- a/services/core/java/com/android/server/am/LockTaskController.java +++ b/services/core/java/com/android/server/am/LockTaskController.java @@ -752,7 +752,7 @@ public class LockTaskController { USER_CURRENT) != 0; if (shouldLockKeyguard) { mWindowManager.lockNow(null); - mWindowManager.dismissKeyguard(null /* callback */); + mWindowManager.dismissKeyguard(null /* callback */, null /* message */); getLockPatternUtils().requireCredentialEntry(USER_ALL); } } catch (Settings.SettingNotFoundException e) { diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 21cb325cc3e0..15fd7425ab64 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -6863,12 +6863,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { } @Override - public void dismissKeyguardLw(IKeyguardDismissCallback callback) { + public void dismissKeyguardLw(IKeyguardDismissCallback callback, CharSequence message) { if (mKeyguardDelegate != null && mKeyguardDelegate.isShowing()) { if (DEBUG_KEYGUARD) Slog.d(TAG, "PWM.dismissKeyguardLw"); // ask the keyguard to prompt the user to authenticate if necessary - mKeyguardDelegate.dismiss(callback); + mKeyguardDelegate.dismiss(callback, message); } else if (callback != null) { try { callback.onDismissError(); diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index cd3cabf7704d..686155b40985 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -1385,8 +1385,10 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * Ask the policy to dismiss the keyguard, if it is currently shown. * * @param callback Callback to be informed about the result. + * @param message A message that should be displayed in the keyguard. */ - public void dismissKeyguardLw(@Nullable IKeyguardDismissCallback callback); + public void dismissKeyguardLw(@Nullable IKeyguardDismissCallback callback, + CharSequence message); /** * Ask the policy whether the Keyguard has drawn. If the Keyguard is disabled, this method diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 6cb707a3757e..18f4a3c5f396 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -263,9 +263,9 @@ public class KeyguardServiceDelegate { mKeyguardState.occluded = isOccluded; } - public void dismiss(IKeyguardDismissCallback callback) { + public void dismiss(IKeyguardDismissCallback callback, CharSequence message) { if (mKeyguardService != null) { - mKeyguardService.dismiss(callback); + mKeyguardService.dismiss(callback, message); } } diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java index 952e0b017041..4e848686254a 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java @@ -74,9 +74,9 @@ public class KeyguardServiceWrapper implements IKeyguardService { } @Override // Binder interface - public void dismiss(IKeyguardDismissCallback callback) { + public void dismiss(IKeyguardDismissCallback callback, CharSequence message) { try { - mService.dismiss(callback); + mService.dismiss(callback, message); } catch (RemoteException e) { Slog.w(TAG , "Remote Exception", e); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index fcc9988e8dff..e4fe88858184 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2941,10 +2941,10 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void dismissKeyguard(IKeyguardDismissCallback callback) { + public void dismissKeyguard(IKeyguardDismissCallback callback, CharSequence message) { checkCallingPermission(permission.CONTROL_KEYGUARD, "dismissKeyguard"); synchronized(mWindowMap) { - mPolicy.dismissKeyguardLw(callback); + mPolicy.dismissKeyguardLw(callback, message); } } diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java index b9dc9db7c5ee..e24c3938f5d3 100644 --- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java +++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java @@ -231,7 +231,7 @@ public class WindowManagerShellCommand extends ShellCommand { } private int runDismissKeyguard(PrintWriter pw) throws RemoteException { - mInterface.dismissKeyguard(null /* callback */); + mInterface.dismissKeyguard(null /* callback */, null /* message */); return 0; } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 3b0937b98e9c..e112b5be1498 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -9739,7 +9739,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return false; } mLockPatternUtils.setLockScreenDisabled(disabled, userId); - mInjector.getIWindowManager().dismissKeyguard(null); + mInjector.getIWindowManager().dismissKeyguard(null /* callback */, null /* message */); } catch (RemoteException e) { // Same process, does not happen. } finally { diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java index a3177062b448..5ed17ccc6d9b 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -416,7 +416,8 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } @Override - public void dismissKeyguardLw(@Nullable IKeyguardDismissCallback callback) { + public void dismissKeyguardLw(@Nullable IKeyguardDismissCallback callback, + CharSequence message) { } @Override |