KeyguardHostView.java revision dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4b
1dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/* 2dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Copyright (C) 2012 The Android Open Source Project 3dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 4dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 5dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * you may not use this file except in compliance with the License. 6dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * You may obtain a copy of the License at 7dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 8dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * http://www.apache.org/licenses/LICENSE-2.0 9dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 10dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Unless required by applicable law or agreed to in writing, software 11dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * distributed under the License is distributed on an "AS IS" BASIS, 12dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * See the License for the specific language governing permissions and 14dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * limitations under the License. 15dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 16dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpackage com.android.internal.policy.impl.keyguard; 18dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 19258341c377b6aa9f1bd29a9b507a97967e432dfeJim Millerimport android.app.Activity; 2095b005c196de2f99513da28fe9108b2dec200140Jim Millerimport android.app.ActivityManager; 21dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.ActivityOptions; 22258341c377b6aa9f1bd29a9b507a97967e432dfeJim Millerimport android.app.AlertDialog; 23258341c377b6aa9f1bd29a9b507a97967e432dfeJim Millerimport android.app.admin.DevicePolicyManager; 24dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.appwidget.AppWidgetHost; 25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.appwidget.AppWidgetHostView; 26dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.appwidget.AppWidgetManager; 27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.appwidget.AppWidgetProviderInfo; 28dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Context; 29dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Intent; 30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.IntentSender; 3166b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.content.pm.UserInfo; 3295b005c196de2f99513da28fe9108b2dec200140Jim Millerimport android.content.res.Resources; 33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.graphics.Canvas; 345737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.graphics.Rect; 35f229e4d3eb8f910c181f96416c6798f6f305a395Jim Millerimport android.os.Looper; 36223ce5c7326f6d13a17ccf2624605bb62864a27aJim Millerimport android.os.Parcel; 37223ce5c7326f6d13a17ccf2624605bb62864a27aJim Millerimport android.os.Parcelable; 38b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Millerimport android.os.UserHandle; 3966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.os.UserManager; 40b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Millerimport android.provider.Settings; 41dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet; 42dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Log; 43258341c377b6aa9f1bd29a9b507a97967e432dfeJim Millerimport android.util.Slog; 44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.KeyEvent; 4566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.view.LayoutInflater; 465737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.view.MotionEvent; 47dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.View; 48258341c377b6aa9f1bd29a9b507a97967e432dfeJim Millerimport android.view.WindowManager; 49dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.animation.AnimationUtils; 50dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.RemoteViews.OnClickHandler; 510ff7f010f8bfd011f0915031b02739ae3bee401eJim Millerimport android.widget.TextView; 52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 5366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport com.android.internal.R; 54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.policy.impl.keyguard.KeyguardSecurityModel.SecurityMode; 55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternUtils; 56dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 5795b005c196de2f99513da28fe9108b2dec200140Jim Millerimport java.io.File; 5866b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport java.util.List; 59dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 60dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardHostView extends KeyguardViewBase { 61ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller private static final String TAG = "KeyguardViewHost"; 62ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 63dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Use this to debug all of keyguard 64dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public static boolean DEBUG; 65dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 66f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller // also referenced in SecuritySettings.java 67dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller static final int APPWIDGET_HOST_ID = 0x4B455947; 68dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 690ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // transport control states 70223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller private static final int TRANSPORT_GONE = 0; 71223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller private static final int TRANSPORT_INVISIBLE = 1; 72223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller private static final int TRANSPORT_VISIBLE = 2; 73223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 74dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private AppWidgetHost mAppWidgetHost; 75f2dfc351dec58ad3c16f8496208b4e6e9c667efeJim Miller private KeyguardWidgetPager mAppWidgetContainer; 766fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen private KeyguardSecurityViewFlipper mSecurityViewContainer; 770a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen private KeyguardSelectorView mKeyguardSelectorView; 784e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller private KeyguardTransportControlView mTransportControl; 7995b005c196de2f99513da28fe9108b2dec200140Jim Miller private boolean mEnableMenuKey; 80dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private boolean mIsVerifyUnlockOnly; 81258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private boolean mEnableFallback; // TODO: This should get the value from KeyguardPatternView 8263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid; 83dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 84dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected Runnable mLaunchRunnable; 85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected int mFailedAttempts; 87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private LockPatternUtils mLockPatternUtils; 88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardSecurityModel mSecurityModel; 90d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller private KeyguardViewStateManager mViewStateManager; 91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 925737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller private Rect mTempRect = new Rect(); 93223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller private int mTransportState = TRANSPORT_GONE; 94ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 95ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller /*package*/ interface TransportCallback { 96223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller void onListenerDetached(); 97223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller void onListenerAttached(); 98223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller void onPlayStateChanged(); 99ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 1005737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 10124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen /*package*/ interface UserSwitcherCallback { 10224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen void hideSecurityView(int duration); 10324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen void showSecurityView(); 1040a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen void showUnlockHint(); 10519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller void userActivity(); 10624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 10724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen 108dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardHostView(Context context) { 109dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller this(context, null); 110dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 111dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 112dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardHostView(Context context, AttributeSet attrs) { 113dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super(context, attrs); 114000464ac012471d301c6e48a8228291519915e17Jim Miller mLockPatternUtils = new LockPatternUtils(context); 115f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller mAppWidgetHost = new AppWidgetHost( 116f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller context, APPWIDGET_HOST_ID, mOnClickHandler, Looper.myLooper()); 117f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller mSecurityModel = new KeyguardSecurityModel(context); 11895b005c196de2f99513da28fe9108b2dec200140Jim Miller 11995b005c196de2f99513da28fe9108b2dec200140Jim Miller // The following enables the MENU key to work for testing automation 12095b005c196de2f99513da28fe9108b2dec200140Jim Miller mEnableMenuKey = shouldEnableMenuKey(); 12195b005c196de2f99513da28fe9108b2dec200140Jim Miller setFocusable(true); 12295b005c196de2f99513da28fe9108b2dec200140Jim Miller setFocusableInTouchMode(true); 123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 126d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller public boolean onTouchEvent(MotionEvent ev) { 127d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller boolean result = super.onTouchEvent(ev); 1285737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller mTempRect.set(0, 0, 0, 0); 1295737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller offsetRectIntoDescendantCoords(mSecurityViewContainer, mTempRect); 1305737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(mTempRect.left, mTempRect.top); 1315737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller result = mSecurityViewContainer.dispatchTouchEvent(ev) || result; 1325737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(-mTempRect.left, -mTempRect.top); 1335737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller return result; 1345737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 1355737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 1365737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller @Override 137dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void dispatchDraw(Canvas canvas) { 138dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.dispatchDraw(canvas); 1397def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 1407def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDoneDrawing(); 1417def1db03943251fe8cb57ec514722026425479eCraig Mautner } 142dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 143dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 144ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller private int getWidgetPosition(int id) { 145ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller final int children = mAppWidgetContainer.getChildCount(); 146ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller for (int i = 0; i < children; i++) { 147ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller if (mAppWidgetContainer.getChildAt(i).getId() == id) { 148ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller return i; 149ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 150ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 151ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller return -1; 152ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 153ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 154dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onFinishInflate() { 156d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller // Grab instances of and make any necessary changes to the main layouts. Create 157d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller // view state manager and wire up necessary listeners / callbacks. 158f2dfc351dec58ad3c16f8496208b4e6e9c667efeJim Miller mAppWidgetContainer = (KeyguardWidgetPager) findViewById(R.id.app_widget_container); 159838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller mAppWidgetContainer.setVisibility(VISIBLE); 160838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller mAppWidgetContainer.setCallbacks(mWidgetCallbacks); 161d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.setMinScale(0.5f); 162d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 163d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller addDefaultWidgets(); 164d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller maybePopulateWidgets(); 165d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 166d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mViewStateManager = new KeyguardViewStateManager(); 16719a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller SlidingChallengeLayout slider = 168d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller (SlidingChallengeLayout) findViewById(R.id.sliding_layout); 16919a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller if (slider != null) { 17019a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller slider.setOnChallengeScrolledListener(mViewStateManager); 17119a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller } 172d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.setViewStateManager(mViewStateManager); 173d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 174d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mViewStateManager.setPagedView(mAppWidgetContainer); 17519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller mViewStateManager.setChallengeLayout(slider != null ? slider : 17619a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller (ChallengeLayout) findViewById(R.id.multi_pane_challenge)); 1776fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mSecurityViewContainer = (KeyguardSecurityViewFlipper) findViewById(R.id.view_flipper); 1780a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen mKeyguardSelectorView = (KeyguardSelectorView) findViewById(R.id.keyguard_selector_view); 1796fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mViewStateManager.setSecurityViewContainer(mSecurityViewContainer); 180ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 1816fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mViewStateManager.showUsabilityHints(); 182d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 183e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityViews(); 184d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller if (!(mContext instanceof Activity)) { 185d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller setSystemUiVisibility(getSystemUiVisibility() | View.STATUS_BAR_DISABLE_BACK); 186d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 18768c2489457631f733f542e14058c6d1274c203deJim Miller 1880ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (KeyguardUpdateMonitor.getInstance(mContext).getIsFirstBoot()) { 1890ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 1900ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 191e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 193e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void updateSecurityViews() { 194e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller int children = mSecurityViewContainer.getChildCount(); 195e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller for (int i = 0; i < children; i++) { 196e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityView(mSecurityViewContainer.getChildAt(i)); 197e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 198e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 200e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void updateSecurityView(View view) { 201e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (view instanceof KeyguardSecurityView) { 202e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView ksv = (KeyguardSecurityView) view; 203e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller ksv.setKeyguardCallback(mCallback); 204e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller ksv.setLockPatternUtils(mLockPatternUtils); 205e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } else { 206e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller Log.w(TAG, "View " + view + " is not a KeyguardSecurityView"); 207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller void setLockPatternUtils(LockPatternUtils utils) { 211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSecurityModel.setLockPatternUtils(utils); 212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternUtils = utils; 213e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityViews(); 214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onAttachedToWindow() { 218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onAttachedToWindow(); 219dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mAppWidgetHost.startListening(); 220223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller post(mSwitchPageRunnable); 2217221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller } 2227221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller 223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onDetachedFromWindow() { 225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onDetachedFromWindow(); 226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mAppWidgetHost.stopListening(); 227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 229f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller private AppWidgetHost getAppWidgetHost() { 230dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mAppWidgetHost; 231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 233d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller void addWidget(AppWidgetHostView view, int pageIndex) { 234d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.addWidget(view, pageIndex); 235dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 236dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 237838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller private KeyguardWidgetPager.Callbacks mWidgetCallbacks 238838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller = new KeyguardWidgetPager.Callbacks() { 239c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 240c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public void userActivity() { 241c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown if (mViewMediatorCallback != null) { 242c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown mViewMediatorCallback.userActivity(); 243c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 244c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 245c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 246c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 247c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public void onUserActivityTimeoutChanged() { 248c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown if (mViewMediatorCallback != null) { 249c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown mViewMediatorCallback.onUserActivityTimeoutChanged(); 250c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 251c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 252c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown }; 253c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 254c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 255c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public long getUserActivityTimeout() { 256c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown // Currently only considering user activity timeouts needed by widgets. 257c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown // Could also take into account longer timeouts for certain security views. 258838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller if (mAppWidgetContainer != null) { 259838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller return mAppWidgetContainer.getUserActivityTimeout(); 260c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 261c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown return -1; 262c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 263c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 264dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardSecurityCallback mCallback = new KeyguardSecurityCallback() { 265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void userActivity(long timeout) { 2677def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 2683dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mViewMediatorCallback.userActivity(timeout); 2697def1db03943251fe8cb57ec514722026425479eCraig Mautner } 270dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 271dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 272dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void dismiss(boolean authenticated) { 273dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller showNextSecurityScreenOrFinish(authenticated); 274dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 275dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 276dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean isVerifyUnlockOnly() { 277258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller return mIsVerifyUnlockOnly; 278dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 279dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 280dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reportSuccessfulUnlockAttempt() { 281258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller KeyguardUpdateMonitor.getInstance(mContext).clearFailedUnlockAttempts(); 2827641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller mLockPatternUtils.reportSuccessfulPasswordAttempt(); 283dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 284dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 285dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reportFailedUnlockAttempt() { 2867641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller if (mCurrentSecuritySelection == SecurityMode.Biometric) { 2877641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller KeyguardUpdateMonitor.getInstance(mContext).reportFailedBiometricUnlockAttempt(); 2887641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller } else { 2897641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller KeyguardHostView.this.reportFailedUnlockAttempt(); 2907641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller } 291dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 292dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 293dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public int getFailedAttempts() { 294258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller return KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(); 295dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 296dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 297258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller @Override 298258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller public void showBackupSecurity() { 2990ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardHostView.this.showBackupSecurityScreen(); 300dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 301dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 3025f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller @Override 3035f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller public void setOnDismissRunnable(Runnable runnable) { 3045f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller KeyguardHostView.this.setOnDismissRunnable(runnable); 3055f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 3065f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller 307dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 308dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 309258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showDialog(String title, String message) { 310258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final AlertDialog dialog = new AlertDialog.Builder(mContext) 311258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setTitle(title) 312258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setMessage(message) 313258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setNeutralButton(com.android.internal.R.string.ok, null) 314258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .create(); 315258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (!(mContext instanceof Activity)) { 316258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 317258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 318258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller dialog.show(); 319258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 320258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 321258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showTimeoutDialog() { 322258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 323258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int messageId = 0; 324258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 325258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller switch (mSecurityModel.getSecurityMode()) { 326258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller case Pattern: 327258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller messageId = R.string.kg_too_many_failed_pattern_attempts_dialog_message; 328258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller break; 32969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 33069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler messageId = R.string.kg_too_many_failed_pin_attempts_dialog_message; 33169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler break; 33269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case Password: 33369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler messageId = R.string.kg_too_many_failed_password_attempts_dialog_message; 334258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller break; 335258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 336258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 337258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (messageId != 0) { 338258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final String message = mContext.getString(messageId, 339258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(), 340258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller timeoutInSeconds); 341258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 342258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 343258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 344258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 345258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showAlmostAtWipeDialog(int attempts, int remaining) { 346258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 347258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_almost_at_wipe, 348258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller attempts, remaining); 349258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 350258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 351258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 352258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showWipeDialog(int attempts) { 353258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_now_wiping, attempts); 354258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 355258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 356258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 357258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showAlmostAtAccountLoginDialog() { 358258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 359258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int count = LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET 360258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller - LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT; 361258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_almost_at_login, 362258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller count, LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT, timeoutInSeconds); 363258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 364258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 365258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 366258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void reportFailedUnlockAttempt() { 367258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 368258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttempts = monitor.getFailedUnlockAttempts() + 1; // +1 for this time 369258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 370258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (DEBUG) Log.d(TAG, "reportFailedPatternAttempt: #" + failedAttempts); 371258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 372258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller SecurityMode mode = mSecurityModel.getSecurityMode(); 373258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final boolean usingPattern = mode == KeyguardSecurityModel.SecurityMode.Pattern; 374258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 375258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttemptsBeforeWipe = mLockPatternUtils.getDevicePolicyManager() 376599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani .getMaximumFailedPasswordsForWipe(null, mLockPatternUtils.getCurrentUser()); 377258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 378258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttemptWarning = LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET 379258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller - LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT; 380258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 381258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int remainingBeforeWipe = failedAttemptsBeforeWipe > 0 ? 382258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller (failedAttemptsBeforeWipe - failedAttempts) 383258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller : Integer.MAX_VALUE; // because DPM returns 0 if no restriction 384258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 38508b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller boolean showTimeout = false; 386258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (remainingBeforeWipe < LockPatternUtils.FAILED_ATTEMPTS_BEFORE_WIPE_GRACE) { 387258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // If we reach this code, it means the user has installed a DevicePolicyManager 388258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // that requests device wipe after N attempts. Once we get below the grace 389258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // period, we'll post this dialog every time as a clear warning until the 390258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // bombshell hits and the device is wiped. 391258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (remainingBeforeWipe > 0) { 392258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showAlmostAtWipeDialog(failedAttempts, remainingBeforeWipe); 393258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else { 394258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // Too many attempts. The device will be wiped shortly. 395258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller Slog.i(TAG, "Too many unlock attempts; device will be wiped!"); 396258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showWipeDialog(failedAttempts); 397258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 398258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else { 39908b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller showTimeout = 400258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller (failedAttempts % LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) == 0; 401258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (usingPattern && mEnableFallback) { 402258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (failedAttempts == failedAttemptWarning) { 403258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showAlmostAtAccountLoginDialog(); 404258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showTimeout = false; // don't show both dialogs 405258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else if (failedAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET) { 406258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mLockPatternUtils.setPermanentlyLocked(true); 407e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(SecurityMode.Account); 408258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // don't show timeout dialog because we show account unlock screen next 409258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showTimeout = false; 410258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 411258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 412258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 413258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller monitor.reportFailedUnlockAttempt(); 414258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mLockPatternUtils.reportFailedPasswordAttempt(); 41508b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller if (showTimeout) { 41608b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller showTimeoutDialog(); 41708b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller } 418258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 419258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 420258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller /** 4210ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * Shows the primary security screen for the user. This will be either the multi-selector 4220ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * or the user's security method. 4230ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * @param turningOff true if the device is being turned off 4240ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller */ 4250ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller void showPrimarySecurityScreen(boolean turningOff) { 4260ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 4270ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")"); 4280ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (!turningOff && KeyguardUpdateMonitor.getInstance(mContext).isAlternateUnlockEnabled()) { 4290ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // If we're not turning off, then allow biometric alternate. 4300ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // We'll reload it when the device comes back on. 4310ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller securityMode = mSecurityModel.getAlternateFor(securityMode); 4320ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 4330ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showSecurityScreen(securityMode); 4340ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 43568c2489457631f733f542e14058c6d1274c203deJim Miller 4360ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller /** 437258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * Shows the backup security screen for the current security mode. This could be used for 438258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * password recovery screens but is currently only used for pattern unlock to show the 439258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * account unlock screen and biometric unlock to show the user's normal unlock. 440258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller */ 4410ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller private void showBackupSecurityScreen() { 44261413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett if (DEBUG) Log.d(TAG, "showBackupSecurity()"); 44363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller SecurityMode backup = mSecurityModel.getBackupSecurityMode(mCurrentSecuritySelection); 44463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller showSecurityScreen(backup); 445258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 446258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 4470a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen public boolean showNextSecurityScreenIfPresent() { 4480a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen SecurityMode securityMode = mSecurityModel.getSecurityMode(); 4490a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen // Allow an alternate, such as biometric unlock 4500a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen securityMode = mSecurityModel.getAlternateFor(securityMode); 4510a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen if (SecurityMode.None == securityMode) { 4520a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen return false; 4530a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } else { 4540a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen showSecurityScreen(securityMode); // switch to the alternate security view 4550a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen return true; 4560a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 4570a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 4580a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 459258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showNextSecurityScreenOrFinish(boolean authenticated) { 46061413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")"); 461dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller boolean finish = false; 462e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (SecurityMode.None == mCurrentSecuritySelection) { 463258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 464258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // Allow an alternate, such as biometric unlock 465000464ac012471d301c6e48a8228291519915e17Jim Miller securityMode = mSecurityModel.getAlternateFor(securityMode); 466e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (SecurityMode.None == securityMode) { 467dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller finish = true; // no security required 468dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 469e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); // switch to the alternate security view 470dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 471dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else if (authenticated) { 472e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller switch (mCurrentSecuritySelection) { 473e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: 474e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: 47569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 476e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: 477e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: 4784b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller finish = true; 4794b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 4804b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 481e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: 482e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: 4834b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home 4844b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 4854b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (securityMode != SecurityMode.None) { 486e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); 4874b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 4884b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller finish = true; 4894b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 4904b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 4914b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 4924b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller default: 4930ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller Log.v(TAG, "Bad security screen " + mCurrentSecuritySelection + ", fail safe"); 4940ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 4954b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 496dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 497dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 4980ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 499dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 500dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (finish) { 5010ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // If the alternate unlock was suppressed, it can now be safely 5020ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // enabled because the user has left keyguard. 5030ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); 5040ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardUpdateMonitor.getInstance(mContext).setIsFirstBoot(false); 50568c2489457631f733f542e14058c6d1274c203deJim Miller 506dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // If there's a pending runnable because the user interacted with a widget 507dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // and we're leaving keyguard, then run it. 508dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mLaunchRunnable != null) { 509dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLaunchRunnable.run(); 510dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLaunchRunnable = null; 511dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 5127def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 5137def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDone(true); 5147def1db03943251fe8cb57ec514722026425479eCraig Mautner } 515b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller } else { 516b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller mViewStateManager.showBouncer(true); 517dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 518dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 519dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 520dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private OnClickHandler mOnClickHandler = new OnClickHandler() { 521dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 522dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean onClickHandler(final View view, 523dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final android.app.PendingIntent pendingIntent, 524dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final Intent fillInIntent) { 525dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (pendingIntent.isActivity()) { 5265f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller setOnDismissRunnable(new Runnable() { 527dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 528dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 529dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? 530dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Context context = view.getContext(); 531dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, 532dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 0, 0, 533dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller view.getMeasuredWidth(), view.getMeasuredHeight()); 534dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller context.startIntentSender( 535dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller pendingIntent.getIntentSender(), fillInIntent, 536dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent.FLAG_ACTIVITY_NEW_TASK, 537dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle()); 538dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (IntentSender.SendIntentException e) { 539dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller android.util.Log.e(TAG, "Cannot send pending intent: ", e); 540dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (Exception e) { 541dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller android.util.Log.e(TAG, "Cannot send pending intent due to " + 542dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller "unknown exception: ", e); 543dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 544dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 5455f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller }); 546dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 547dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallback.dismiss(false); 548dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return true; 549dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 550dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return super.onClickHandler(view, pendingIntent, fillInIntent); 551dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 552dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 553dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 554dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 5550ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller private KeyguardStatusViewManager mKeyguardStatusViewManager; 5560ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 55763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller // Used to ignore callbacks from methods that are no longer current (e.g. face unlock). 55863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller // This avoids unwanted asynchronous events from messing with the state. 55963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() { 56063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 56163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 56263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void userActivity(long timeout) { 56363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 56463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 56563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 56663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void showBackupSecurity() { 56763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 56863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 56963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 57063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void setOnDismissRunnable(Runnable runnable) { 57163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 57263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 57363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 57463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void reportSuccessfulUnlockAttempt() { 57563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 57663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 57763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 57863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void reportFailedUnlockAttempt() { 57963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 58063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 58163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 58263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public boolean isVerifyUnlockOnly() { 58363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return false; 58463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 58563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 58663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 58763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public int getFailedAttempts() { 58863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return 0; 58963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 59063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 59163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 59263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void dismiss(boolean securityVerified) { 59363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 59463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller }; 59563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 596dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 597dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reset() { 598258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mIsVerifyUnlockOnly = false; 599ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_status_view)); 600dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 601dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 6025f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller /** 6035f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller * Sets a runnable to run when keyguard is dismissed 6045f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller * @param runnable 6055f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller */ 6065f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller protected void setOnDismissRunnable(Runnable runnable) { 6075f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller mLaunchRunnable = runnable; 6085f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 6095f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller 610e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private KeyguardSecurityView getSecurityView(SecurityMode securityMode) { 611e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 612e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView view = null; 613e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int children = mSecurityViewContainer.getChildCount(); 614dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller for (int child = 0; child < children; child++) { 615e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (mSecurityViewContainer.getChildAt(child).getId() == securityViewIdForMode) { 616e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller view = ((KeyguardSecurityView)mSecurityViewContainer.getChildAt(child)); 617e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller break; 618dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 619dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 620838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller boolean simPukFullScreen = getResources().getBoolean( 621838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller com.android.internal.R.bool.kg_sim_puk_account_full_screen); 62263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller int layoutId = getLayoutIdFor(securityMode); 62363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller if (view == null && layoutId != 0) { 624e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final LayoutInflater inflater = LayoutInflater.from(mContext); 625bdffd5c3a18e67443ebbd16d4f0349d0728285b1Jim Miller if (DEBUG) Log.v(TAG, "inflating id = " + layoutId); 62663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller View v = inflater.inflate(layoutId, this, false); 627e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mSecurityViewContainer.addView(v); 628e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityView(v); 6290ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 630e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller view = (KeyguardSecurityView) v; 6310ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller TextView navigationText = ((TextView) findViewById(R.id.keyguard_message_area)); 6320ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 6330ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // Some devices can fit a navigation area, others cannot. On devices that cannot, 6340ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // we display the security message in status area. 6350ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (navigationText != null) { 6360ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller view.setSecurityMessageDisplay(new KeyguardNavigationManager(navigationText)); 6370ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } else { 6380ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller view.setSecurityMessageDisplay(mKeyguardStatusViewManager); 6390ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 6400ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 6410ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 6426f131416ba4ff48067dc4e627971391a6b6778c4Adam Cohen if (securityMode == SecurityMode.SimPin || securityMode == SecurityMode.SimPuk || 6436f131416ba4ff48067dc4e627971391a6b6778c4Adam Cohen securityMode == SecurityMode.Account) { 6440ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (simPukFullScreen) { 645838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller mAppWidgetContainer.setVisibility(View.GONE); 6460ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 647e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 6480ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 6490ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (view instanceof KeyguardSelectorView) { 6500ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardSelectorView selectorView = (KeyguardSelectorView) view; 6510ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller View carrierText = selectorView.findViewById(R.id.keyguard_selector_fade_container); 6520ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller selectorView.setCarrierArea(carrierText); 6530ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 65468c2489457631f733f542e14058c6d1274c203deJim Miller 655e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller return view; 656dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 657dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 658258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller /** 659258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * Switches to the given security view unless it's already being shown, in which case 660258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * this is a no-op. 661258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * 662e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller * @param securityMode 663258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller */ 664e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void showSecurityScreen(SecurityMode securityMode) { 66568c2489457631f733f542e14058c6d1274c203deJim Miller if (DEBUG) Log.d(TAG, "showSecurityScreen(" + securityMode + ")"); 66668c2489457631f733f542e14058c6d1274c203deJim Miller 667e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (securityMode == mCurrentSecuritySelection) return; 668dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 669e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView oldView = getSecurityView(mCurrentSecuritySelection); 670e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView newView = getSecurityView(securityMode); 671dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 672dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Emulate Activity life cycle 67363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller if (oldView != null) { 67463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller oldView.onPause(); 67563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view 67663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 677dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller newView.onResume(); 67863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller newView.setKeyguardCallback(mCallback); 679dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 680cd03a26f4f5663b40d4679de102519ccc163fa10Craig Mautner final boolean needsInput = newView.needsInput(); 6817def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 682cd03a26f4f5663b40d4679de102519ccc163fa10Craig Mautner mViewMediatorCallback.setNeedsInput(needsInput); 6837def1db03943251fe8cb57ec514722026425479eCraig Mautner } 684dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 685dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Find and show this child. 686e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int childCount = mSecurityViewContainer.getChildCount(); 6874b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 68861413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett // Do flip animation to the next screen 68968c2489457631f733f542e14058c6d1274c203deJim Miller if (false) { 69068c2489457631f733f542e14058c6d1274c203deJim Miller mSecurityViewContainer.setInAnimation( 69168c2489457631f733f542e14058c6d1274c203deJim Miller AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_animate_in)); 69268c2489457631f733f542e14058c6d1274c203deJim Miller mSecurityViewContainer.setOutAnimation( 69368c2489457631f733f542e14058c6d1274c203deJim Miller AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_animate_out)); 69468c2489457631f733f542e14058c6d1274c203deJim Miller } 695e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 696dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller for (int i = 0; i < childCount; i++) { 697e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (mSecurityViewContainer.getChildAt(i).getId() == securityViewIdForMode) { 698e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mSecurityViewContainer.setDisplayedChild(i); 699dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller break; 700dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 701dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 702258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 703e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (securityMode == SecurityMode.None) { 704e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // Discard current runnable if we're switching back to the selector view 705258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller setOnDismissRunnable(null); 70668c2489457631f733f542e14058c6d1274c203deJim Miller } 707e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mCurrentSecuritySelection = securityMode; 708dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 709dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 710dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 711dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onScreenTurnedOn() { 712dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "screen on"); 7130ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 714e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller getSecurityView(mCurrentSecuritySelection).onResume(); 715d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller 716d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // This is a an attempt to fix bug 7137389 where the device comes back on but the entire 717d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // layout is blank but forcing a layout causes it to reappear (e.g. with with 718d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // hierarchyviewer). 719d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller requestLayout(); 7206fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 7216fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen if (mViewStateManager != null) { 7226fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mViewStateManager.showUsabilityHints(); 7236fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 724dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 725dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 726dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 727dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onScreenTurnedOff() { 728dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "screen off"); 7290ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(true); 730e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller getSecurityView(mCurrentSecuritySelection).onPause(); 731dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 732dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 733dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 734dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void show() { 735086977094d96ab9352432e0941a05b09cefc92acJim Miller if (DEBUG) Log.d(TAG, "show()"); 736086977094d96ab9352432e0941a05b09cefc92acJim Miller showPrimarySecurityScreen(false); 737dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 738dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 739dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private boolean isSecure() { 740dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller SecurityMode mode = mSecurityModel.getSecurityMode(); 741dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller switch (mode) { 742dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Pattern: 743dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mLockPatternUtils.isLockPatternEnabled(); 744dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Password: 74569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 746dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mLockPatternUtils.isLockPasswordEnabled(); 747dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case SimPin: 748dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case SimPuk: 749dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Account: 750dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return true; 751dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case None: 752dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return false; 753dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller default: 754dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller throw new IllegalStateException("Unknown security mode " + mode); 755dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 756dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 757dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 758dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 759dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void wakeWhenReadyTq(int keyCode) { 760dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "onWakeKey"); 761dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (keyCode == KeyEvent.KEYCODE_MENU && isSecure()) { 762dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "switching screens to unlock screen because wake key was MENU"); 763e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(SecurityMode.None); 764dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 765dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "poking wake lock immediately"); 7667def1db03943251fe8cb57ec514722026425479eCraig Mautner } 7677def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 7683dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mViewMediatorCallback.wakeUp(); 769dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 770dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 771dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 772dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 773dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void verifyUnlock() { 774dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 775dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (securityMode == KeyguardSecurityModel.SecurityMode.None) { 7767def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 7777def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDone(true); 7787def1db03943251fe8cb57ec514722026425479eCraig Mautner } 779dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else if (securityMode != KeyguardSecurityModel.SecurityMode.Pattern 78069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler && securityMode != KeyguardSecurityModel.SecurityMode.PIN 781dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller && securityMode != KeyguardSecurityModel.SecurityMode.Password) { 782dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // can only verify unlock when in pattern/password mode 7837def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 7847def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDone(false); 7857def1db03943251fe8cb57ec514722026425479eCraig Mautner } 786dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 787dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // otherwise, go to the unlock screen, see if they can verify it 788dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mIsVerifyUnlockOnly = true; 789e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); 790dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 791dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 792dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 793dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private int getSecurityViewIdForMode(SecurityMode securityMode) { 794dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller switch (securityMode) { 795e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case None: return R.id.keyguard_selector_view; 796e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: return R.id.keyguard_pattern_view; 79769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: return R.id.keyguard_pin_view; 798e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: return R.id.keyguard_password_view; 799e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: return R.id.keyguard_face_unlock_view; 800e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: return R.id.keyguard_account_view; 801e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: return R.id.keyguard_sim_pin_view; 802e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: return R.id.keyguard_sim_puk_view; 803dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 804dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return 0; 805dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 806dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 807e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private int getLayoutIdFor(SecurityMode securityMode) { 808e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller switch (securityMode) { 809e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case None: return R.layout.keyguard_selector_view; 810e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: return R.layout.keyguard_pattern_view; 81169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: return R.layout.keyguard_pin_view; 812e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: return R.layout.keyguard_password_view; 813e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: return R.layout.keyguard_face_unlock_view; 814e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: return R.layout.keyguard_account_view; 815e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: return R.layout.keyguard_sim_pin_view; 816e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: return R.layout.keyguard_sim_puk_view; 817e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller default: 81863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return 0; 819e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 820e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 821e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller 822d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller private void addWidget(int appId, int pageIndex) { 823dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext); 824dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appId); 82599a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller if (appWidgetInfo != null) { 82699a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller AppWidgetHostView view = getAppWidgetHost().createView(mContext, appId, appWidgetInfo); 827d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller addWidget(view, pageIndex); 82899a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller } else { 82999a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller Log.w(TAG, "AppWidgetInfo was null; not adding widget id " + appId); 83099a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller } 831dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 832dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 833dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock private final CameraWidgetFrame.Callbacks mCameraWidgetCallbacks = 834dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock new CameraWidgetFrame.Callbacks() { 835dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 836dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock public void onLaunchingCamera() { 837dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock SlidingChallengeLayout slider = locateSlider(); 838dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock if (slider != null) { 839dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock slider.showHandle(false); 840dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 841dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 842dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 843dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 844dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock public void onCameraLaunched() { 845dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock SlidingChallengeLayout slider = locateSlider(); 846dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock if (slider != null) { 847dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock slider.showHandle(true); 848dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 849dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock mAppWidgetContainer.scrollLeft(); 850dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 851dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 852dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock private SlidingChallengeLayout locateSlider() { 853dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return (SlidingChallengeLayout) findViewById(R.id.sliding_layout); 854dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 855dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock }; 856dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 857dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() { 858dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 859dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock Context getContext() { 860dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mContext; 861dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 862dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 863dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 864dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock KeyguardSecurityCallback getCallback() { 865dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mCallback; 866dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 867dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 868dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 869dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock LockPatternUtils getLockPatternUtils() { 870dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mLockPatternUtils; 871dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock }}; 872dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 8734e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller private void addDefaultWidgets() { 8744e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller LayoutInflater inflater = LayoutInflater.from(mContext); 875223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller inflater.inflate(R.layout.keyguard_transport_control_view, this, true); 8764e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 877d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller View addWidget = inflater.inflate(R.layout.keyguard_add_widget, null, true); 878d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.addWidget(addWidget); 879d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true); 880d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.addWidget(statusWidget); 88186b6357e5eb91950eac7de7ffe29e5a4ad32903bJohn Spurlock if (mContext.getResources().getBoolean(R.bool.kg_enable_camera_default_widget)) { 882dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock View cameraWidget = 883dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock CameraWidgetFrame.create(mContext, mCameraWidgetCallbacks, mActivityLauncher); 884dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock if (cameraWidget != null) { 885dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock mAppWidgetContainer.addWidget(cameraWidget); 886dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 88786b6357e5eb91950eac7de7ffe29e5a4ad32903bJohn Spurlock } 888838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 889b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view); 890b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller addWidgetButton.setOnClickListener(new OnClickListener() { 891b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller @Override 892b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller public void onClick(View v) { 893b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller mCallback.setOnDismissRunnable(new Runnable() { 894b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller 895b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller @Override 896b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller public void run() { 897b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); 898b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller intent.addFlags( 899b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller Intent.FLAG_ACTIVITY_NEW_TASK 900b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller | Intent.FLAG_ACTIVITY_SINGLE_TOP 901b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller | Intent.FLAG_ACTIVITY_CLEAR_TOP 902b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 903b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller mContext.startActivityAsUser(intent, 904b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller new UserHandle(UserHandle.USER_CURRENT)); 905b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller } 906b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller }); 907b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller mCallback.dismiss(false); 908b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller } 909b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller }); 910b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller 91119a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller enableUserSelectorIfNecessary(); 9127221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller initializeTransportControl(); 9137221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller } 9147221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller 9157221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller private void initializeTransportControl() { 9164e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl = 9174e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller (KeyguardTransportControlView) findViewById(R.id.keyguard_transport_control); 918223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportControl.setVisibility(View.GONE); 9194e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 9204e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller // This code manages showing/hiding the transport control. We keep it around and only 9214e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller // add it to the hierarchy if it needs to be present. 9224e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller if (mTransportControl != null) { 9234e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl.setKeyguardCallback(new TransportCallback() { 9244e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller @Override 925223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onListenerDetached() { 9264e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller int page = getWidgetPosition(R.id.keyguard_transport_control); 927223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (page != -1) { 9284e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mAppWidgetContainer.removeView(mTransportControl); 929e955121d6ee64502a938ff3bb3bba8058822d28fJim Miller // XXX keep view attached so we still get show/hide events from AudioManager 9304e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller KeyguardHostView.this.addView(mTransportControl); 9314e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl.setVisibility(View.GONE); 932223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportState = TRANSPORT_GONE; 933e955121d6ee64502a938ff3bb3bba8058822d28fJim Miller mTransportControl.post(mSwitchPageRunnable); 9344e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 9354e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 9364e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 9374e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller @Override 938223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onListenerAttached() { 9394e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller if (getWidgetPosition(R.id.keyguard_transport_control) == -1) { 9404e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller KeyguardHostView.this.removeView(mTransportControl); 941223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mAppWidgetContainer.addView(mTransportControl, 0); 9424e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl.setVisibility(View.VISIBLE); 9434e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 9444e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 945223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 946223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 947223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onPlayStateChanged() { 948223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportControl.post(mSwitchPageRunnable); 949223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 9504e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller }); 9514e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 9520ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 95368c2489457631f733f542e14058c6d1274c203deJim Miller mKeyguardStatusViewManager = ((KeyguardStatusView) 9540ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller findViewById(R.id.keyguard_status_view_face_palm)).getManager(); 9550ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 9564e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 9574e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 958b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller private void maybePopulateWidgets() { 959f73fbf79a1db4bc5ccc829c8a84f3431ab986cbcJim Miller DevicePolicyManager dpm = 960f73fbf79a1db4bc5ccc829c8a84f3431ab986cbcJim Miller (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); 96148b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller if (dpm != null) { 96248b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller final int currentUser = mLockPatternUtils.getCurrentUser(); 96348b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller final int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUser); 96448b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller if ((disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0) { 96548b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller Log.v(TAG, "Keyguard widgets disabled because of device policy admin"); 96648b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller return; 96748b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller } 968b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } 969f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller 970d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget); 971d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller int addPageIndex = mAppWidgetContainer.indexOfChild(addWidget); 972d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller // This shouldn't happen, but just to be safe! 973d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller if (addPageIndex < 0) { 974d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller addPageIndex = 0; 97520c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka } 97620c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka 97720c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka // Add user-selected widget 978aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka final int[] widgets = mLockPatternUtils.getAppWidgets(); 979aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka if (widgets == null) { 980aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka Log.d(TAG, "Problem reading widgets"); 981aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka } else { 982aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka for (int i = widgets.length -1; i >= 0; i--) { 983aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka if (widgets[i] != -1) { 984aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // We add the widgets from left to right, starting after the first page after 985aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // the add page. We count down, since the order will be persisted from right 986aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // to left, starting after camera. 987aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka addWidget(widgets[i], addPageIndex + 1); 988aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka } 989dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 990dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 9910207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen } 9920207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen 993223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller Runnable mSwitchPageRunnable = new Runnable() { 994223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 995223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void run() { 996223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller showAppropriateWidgetPage(); 997223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 998223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller }; 999223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1000223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller static class SavedState extends BaseSavedState { 1001223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller int transportState; 1002223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1003223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState(Parcelable superState) { 1004223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super(superState); 1005223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1006223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1007223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller private SavedState(Parcel in) { 1008223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super(in); 1009223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller this.transportState = in.readInt(); 1010223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1011223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1012223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1013223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void writeToParcel(Parcel out, int flags) { 1014223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.writeToParcel(out, flags); 1015223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller out.writeInt(this.transportState); 1016223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1017223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1018223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public static final Parcelable.Creator<SavedState> CREATOR 1019223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller = new Parcelable.Creator<SavedState>() { 1020223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public SavedState createFromParcel(Parcel in) { 1021223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return new SavedState(in); 1022223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1023223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1024223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public SavedState[] newArray(int size) { 1025223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return new SavedState[size]; 1026223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1027223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller }; 1028223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1029223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1030223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1031223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public Parcelable onSaveInstanceState() { 1032223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller Parcelable superState = super.onSaveInstanceState(); 1033223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState ss = new SavedState(superState); 1034223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller ss.transportState = mTransportState; 1035223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return ss; 1036223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1037223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1038223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1039223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onRestoreInstanceState(Parcelable state) { 1040223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (!(state instanceof SavedState)) { 1041223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.onRestoreInstanceState(state); 1042223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return; 1043223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1044223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState ss = (SavedState) state; 1045223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.onRestoreInstanceState(ss.getSuperState()); 1046223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportState = ss.transportState; 1047223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller post(mSwitchPageRunnable); 1048223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1049223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 10500207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen private void showAppropriateWidgetPage() { 1051223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1052223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller // The following sets the priority for showing widgets. Transport should be shown if 1053223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller // music is playing, followed by the multi-user widget if enabled, followed by the 1054223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller // status widget. 1055223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller final int pageToShow; 1056223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (mTransportControl.isMusicPlaying() || mTransportState == TRANSPORT_VISIBLE) { 1057223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportState = TRANSPORT_VISIBLE; 1058223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller pageToShow = mAppWidgetContainer.indexOfChild(mTransportControl); 1059223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } else { 1060223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 1061223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller final View multiUserView = findViewById(R.id.keyguard_multi_user_selector); 1062223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller final int multiUserPosition = mAppWidgetContainer.indexOfChild(multiUserView); 1063223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (multiUserPosition != -1 && mUm.getUsers(true).size() > 1) { 1064223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller pageToShow = multiUserPosition; 1065223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } else { 1066223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller final View statusView = findViewById(R.id.keyguard_status_view); 1067223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller pageToShow = mAppWidgetContainer.indexOfChild(statusView); 1068223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1069223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (mTransportState == TRANSPORT_VISIBLE) { 1070223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportState = TRANSPORT_INVISIBLE; 1071223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 10720207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen } 1073223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mAppWidgetContainer.setCurrentPage(pageToShow); 1074dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1075dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 107619a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller private void enableUserSelectorIfNecessary() { 107766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen // if there are multiple users, we need to add the multi-user switcher widget to the 107866b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen // keyguard. 107966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 1080920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani List<UserInfo> users = mUm.getUsers(true); 108166b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 108266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen if (users.size() > 1) { 108328c5ee9ea9b1dd6253a4ba782a5711263524bd41Chris Wren KeyguardMultiUserSelectorView multiUser = 108428c5ee9ea9b1dd6253a4ba782a5711263524bd41Chris Wren (KeyguardMultiUserSelectorView) findViewById(R.id.keyguard_user_selector); 108519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller multiUser.setVisibility(View.VISIBLE); 108628c5ee9ea9b1dd6253a4ba782a5711263524bd41Chris Wren multiUser.addUsers(mUm.getUsers(true)); 108724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen UserSwitcherCallback callback = new UserSwitcherCallback() { 108824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen @Override 108924b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen public void hideSecurityView(int duration) { 109024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mSecurityViewContainer.animate().alpha(0).setDuration(duration); 109124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 109224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen 109324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen @Override 109424b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen public void showSecurityView() { 109524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mSecurityViewContainer.setAlpha(1.0f); 109624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 10970a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 10980a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen @Override 10990a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen public void showUnlockHint() { 11000ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (mKeyguardSelectorView != null) { 11016fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mKeyguardSelectorView.showUsabilityHint(); 11020ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 11030a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 11040a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 110519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller @Override 110619a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller public void userActivity() { 110719a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller if (mViewMediatorCallback != null) { 110819a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller mViewMediatorCallback.userActivity(); 110919a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller } 111019a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller } 111124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen }; 111224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen multiUser.setCallback(callback); 111366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 111466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 111566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 1116dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 1117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void cleanUp() { 1118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 112195b005c196de2f99513da28fe9108b2dec200140Jim Miller /** 112295b005c196de2f99513da28fe9108b2dec200140Jim Miller * In general, we enable unlocking the insecure keyguard with the menu key. However, there are 112395b005c196de2f99513da28fe9108b2dec200140Jim Miller * some cases where we wish to disable it, notably when the menu button placement or technology 112495b005c196de2f99513da28fe9108b2dec200140Jim Miller * is prone to false positives. 112595b005c196de2f99513da28fe9108b2dec200140Jim Miller * 112695b005c196de2f99513da28fe9108b2dec200140Jim Miller * @return true if the menu key should be enabled 112795b005c196de2f99513da28fe9108b2dec200140Jim Miller */ 112895b005c196de2f99513da28fe9108b2dec200140Jim Miller private static final String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key"; 112995b005c196de2f99513da28fe9108b2dec200140Jim Miller private boolean shouldEnableMenuKey() { 113095b005c196de2f99513da28fe9108b2dec200140Jim Miller final Resources res = getResources(); 1131258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final boolean configDisabled = res.getBoolean( 1132258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller com.android.internal.R.bool.config_disableMenuKeyInLockScreen); 113395b005c196de2f99513da28fe9108b2dec200140Jim Miller final boolean isTestHarness = ActivityManager.isRunningInTestHarness(); 113495b005c196de2f99513da28fe9108b2dec200140Jim Miller final boolean fileOverride = (new File(ENABLE_MENU_KEY_FILE)).exists(); 113595b005c196de2f99513da28fe9108b2dec200140Jim Miller return !configDisabled || isTestHarness || fileOverride; 113695b005c196de2f99513da28fe9108b2dec200140Jim Miller } 113795b005c196de2f99513da28fe9108b2dec200140Jim Miller 113895b005c196de2f99513da28fe9108b2dec200140Jim Miller @Override 113995b005c196de2f99513da28fe9108b2dec200140Jim Miller public boolean onKeyDown(int keyCode, KeyEvent event) { 114095b005c196de2f99513da28fe9108b2dec200140Jim Miller if (keyCode == KeyEvent.KEYCODE_MENU && mEnableMenuKey) { 114195b005c196de2f99513da28fe9108b2dec200140Jim Miller showNextSecurityScreenOrFinish(false); 114295b005c196de2f99513da28fe9108b2dec200140Jim Miller return true; 114395b005c196de2f99513da28fe9108b2dec200140Jim Miller } else { 114495b005c196de2f99513da28fe9108b2dec200140Jim Miller return super.onKeyDown(keyCode, event); 114595b005c196de2f99513da28fe9108b2dec200140Jim Miller } 114695b005c196de2f99513da28fe9108b2dec200140Jim Miller } 114795b005c196de2f99513da28fe9108b2dec200140Jim Miller 11486bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller public void goToUserSwitcher() { 11496bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_multi_user_selector)); 11506bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller } 11516bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller 11520a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller public boolean handleBackKey() { 11530a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller if (mCurrentSecuritySelection != SecurityMode.None) { 11540a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller mCallback.dismiss(false); 11550a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller return true; 11560a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller } 11570a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller return false; 11580a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller } 11590a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller 1160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller} 1161