KeyguardHostView.java revision 1254f2f42f7173ef51d0034975ab5cb7d44f8209
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(); 1641254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka addWidgetsFromSettings(); 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); 1731254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka mAppWidgetContainer.setLockPatternUtils(mLockPatternUtils); 174d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 175d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mViewStateManager.setPagedView(mAppWidgetContainer); 17619a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller mViewStateManager.setChallengeLayout(slider != null ? slider : 17719a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller (ChallengeLayout) findViewById(R.id.multi_pane_challenge)); 1786fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mSecurityViewContainer = (KeyguardSecurityViewFlipper) findViewById(R.id.view_flipper); 1790a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen mKeyguardSelectorView = (KeyguardSelectorView) findViewById(R.id.keyguard_selector_view); 1806fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mViewStateManager.setSecurityViewContainer(mSecurityViewContainer); 181ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 1826fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mViewStateManager.showUsabilityHints(); 183d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 184e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityViews(); 185d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller if (!(mContext instanceof Activity)) { 186d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller setSystemUiVisibility(getSystemUiVisibility() | View.STATUS_BAR_DISABLE_BACK); 187d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 18868c2489457631f733f542e14058c6d1274c203deJim Miller 1890ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (KeyguardUpdateMonitor.getInstance(mContext).getIsFirstBoot()) { 1900ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 1910ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 192e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 193dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 194e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void updateSecurityViews() { 195e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller int children = mSecurityViewContainer.getChildCount(); 196e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller for (int i = 0; i < children; i++) { 197e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityView(mSecurityViewContainer.getChildAt(i)); 198e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 199e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 201e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void updateSecurityView(View view) { 202e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (view instanceof KeyguardSecurityView) { 203e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView ksv = (KeyguardSecurityView) view; 204e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller ksv.setKeyguardCallback(mCallback); 205e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller ksv.setLockPatternUtils(mLockPatternUtils); 206e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } else { 207e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller Log.w(TAG, "View " + view + " is not a KeyguardSecurityView"); 208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller void setLockPatternUtils(LockPatternUtils utils) { 212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSecurityModel.setLockPatternUtils(utils); 213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternUtils = utils; 214e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityViews(); 215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onAttachedToWindow() { 219dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onAttachedToWindow(); 220dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mAppWidgetHost.startListening(); 221223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller post(mSwitchPageRunnable); 2227221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller } 2237221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller 224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onDetachedFromWindow() { 226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onDetachedFromWindow(); 227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mAppWidgetHost.stopListening(); 228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 230f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller private AppWidgetHost getAppWidgetHost() { 231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mAppWidgetHost; 232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 233dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 234d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller void addWidget(AppWidgetHostView view, int pageIndex) { 235d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.addWidget(view, pageIndex); 236dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 237dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 238838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller private KeyguardWidgetPager.Callbacks mWidgetCallbacks 239838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller = new KeyguardWidgetPager.Callbacks() { 240c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 241c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public void userActivity() { 242c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown if (mViewMediatorCallback != null) { 243c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown mViewMediatorCallback.userActivity(); 244c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 245c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 246c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 247c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 248c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public void onUserActivityTimeoutChanged() { 249c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown if (mViewMediatorCallback != null) { 250c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown mViewMediatorCallback.onUserActivityTimeoutChanged(); 251c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 252c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 253c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown }; 254c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 255c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 256c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public long getUserActivityTimeout() { 257c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown // Currently only considering user activity timeouts needed by widgets. 258c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown // Could also take into account longer timeouts for certain security views. 259838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller if (mAppWidgetContainer != null) { 260838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller return mAppWidgetContainer.getUserActivityTimeout(); 261c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 262c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown return -1; 263c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 264c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardSecurityCallback mCallback = new KeyguardSecurityCallback() { 266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void userActivity(long timeout) { 2687def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 2693dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mViewMediatorCallback.userActivity(timeout); 2707def1db03943251fe8cb57ec514722026425479eCraig Mautner } 271dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 272dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 273dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void dismiss(boolean authenticated) { 274dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller showNextSecurityScreenOrFinish(authenticated); 275dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 276dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 277dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean isVerifyUnlockOnly() { 278258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller return mIsVerifyUnlockOnly; 279dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 280dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 281dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reportSuccessfulUnlockAttempt() { 282258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller KeyguardUpdateMonitor.getInstance(mContext).clearFailedUnlockAttempts(); 2837641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller mLockPatternUtils.reportSuccessfulPasswordAttempt(); 284dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 285dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 286dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reportFailedUnlockAttempt() { 2877641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller if (mCurrentSecuritySelection == SecurityMode.Biometric) { 2887641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller KeyguardUpdateMonitor.getInstance(mContext).reportFailedBiometricUnlockAttempt(); 2897641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller } else { 2907641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller KeyguardHostView.this.reportFailedUnlockAttempt(); 2917641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller } 292dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 293dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 294dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public int getFailedAttempts() { 295258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller return KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(); 296dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 297dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 298258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller @Override 299258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller public void showBackupSecurity() { 3000ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardHostView.this.showBackupSecurityScreen(); 301dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 302dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 3035f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller @Override 3045f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller public void setOnDismissRunnable(Runnable runnable) { 3055f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller KeyguardHostView.this.setOnDismissRunnable(runnable); 3065f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 3075f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller 308dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 309dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 310258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showDialog(String title, String message) { 311258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final AlertDialog dialog = new AlertDialog.Builder(mContext) 312258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setTitle(title) 313258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setMessage(message) 314258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setNeutralButton(com.android.internal.R.string.ok, null) 315258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .create(); 316258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (!(mContext instanceof Activity)) { 317258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 318258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 319258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller dialog.show(); 320258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 321258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 322258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showTimeoutDialog() { 323258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 324258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int messageId = 0; 325258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 326258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller switch (mSecurityModel.getSecurityMode()) { 327258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller case Pattern: 328258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller messageId = R.string.kg_too_many_failed_pattern_attempts_dialog_message; 329258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller break; 33069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 33169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler messageId = R.string.kg_too_many_failed_pin_attempts_dialog_message; 33269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler break; 33369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case Password: 33469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler messageId = R.string.kg_too_many_failed_password_attempts_dialog_message; 335258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller break; 336258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 337258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 338258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (messageId != 0) { 339258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final String message = mContext.getString(messageId, 340258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(), 341258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller timeoutInSeconds); 342258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 343258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 344258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 345258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 346258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showAlmostAtWipeDialog(int attempts, int remaining) { 347258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 348258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_almost_at_wipe, 349258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller attempts, remaining); 350258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 351258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 352258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 353258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showWipeDialog(int attempts) { 354258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_now_wiping, attempts); 355258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 356258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 357258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 358258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showAlmostAtAccountLoginDialog() { 359258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 360258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int count = LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET 361258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller - LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT; 362258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_almost_at_login, 363258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller count, LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT, timeoutInSeconds); 364258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 365258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 366258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 367258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void reportFailedUnlockAttempt() { 368258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 369258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttempts = monitor.getFailedUnlockAttempts() + 1; // +1 for this time 370258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 371258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (DEBUG) Log.d(TAG, "reportFailedPatternAttempt: #" + failedAttempts); 372258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 373258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller SecurityMode mode = mSecurityModel.getSecurityMode(); 374258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final boolean usingPattern = mode == KeyguardSecurityModel.SecurityMode.Pattern; 375258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 376258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttemptsBeforeWipe = mLockPatternUtils.getDevicePolicyManager() 377599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani .getMaximumFailedPasswordsForWipe(null, mLockPatternUtils.getCurrentUser()); 378258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 379258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttemptWarning = LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET 380258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller - LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT; 381258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 382258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int remainingBeforeWipe = failedAttemptsBeforeWipe > 0 ? 383258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller (failedAttemptsBeforeWipe - failedAttempts) 384258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller : Integer.MAX_VALUE; // because DPM returns 0 if no restriction 385258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 38608b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller boolean showTimeout = false; 387258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (remainingBeforeWipe < LockPatternUtils.FAILED_ATTEMPTS_BEFORE_WIPE_GRACE) { 388258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // If we reach this code, it means the user has installed a DevicePolicyManager 389258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // that requests device wipe after N attempts. Once we get below the grace 390258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // period, we'll post this dialog every time as a clear warning until the 391258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // bombshell hits and the device is wiped. 392258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (remainingBeforeWipe > 0) { 393258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showAlmostAtWipeDialog(failedAttempts, remainingBeforeWipe); 394258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else { 395258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // Too many attempts. The device will be wiped shortly. 396258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller Slog.i(TAG, "Too many unlock attempts; device will be wiped!"); 397258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showWipeDialog(failedAttempts); 398258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 399258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else { 40008b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller showTimeout = 401258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller (failedAttempts % LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) == 0; 402258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (usingPattern && mEnableFallback) { 403258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (failedAttempts == failedAttemptWarning) { 404258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showAlmostAtAccountLoginDialog(); 405258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showTimeout = false; // don't show both dialogs 406258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else if (failedAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET) { 407258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mLockPatternUtils.setPermanentlyLocked(true); 408e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(SecurityMode.Account); 409258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // don't show timeout dialog because we show account unlock screen next 410258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showTimeout = false; 411258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 412258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 413258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 414258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller monitor.reportFailedUnlockAttempt(); 415258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mLockPatternUtils.reportFailedPasswordAttempt(); 41608b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller if (showTimeout) { 41708b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller showTimeoutDialog(); 41808b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller } 419258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 420258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 421258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller /** 4220ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * Shows the primary security screen for the user. This will be either the multi-selector 4230ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * or the user's security method. 4240ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * @param turningOff true if the device is being turned off 4250ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller */ 4260ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller void showPrimarySecurityScreen(boolean turningOff) { 4270ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 4280ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")"); 4290ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (!turningOff && KeyguardUpdateMonitor.getInstance(mContext).isAlternateUnlockEnabled()) { 4300ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // If we're not turning off, then allow biometric alternate. 4310ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // We'll reload it when the device comes back on. 4320ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller securityMode = mSecurityModel.getAlternateFor(securityMode); 4330ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 4340ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showSecurityScreen(securityMode); 4350ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 43668c2489457631f733f542e14058c6d1274c203deJim Miller 4370ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller /** 438258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * Shows the backup security screen for the current security mode. This could be used for 439258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * password recovery screens but is currently only used for pattern unlock to show the 440258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * account unlock screen and biometric unlock to show the user's normal unlock. 441258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller */ 4420ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller private void showBackupSecurityScreen() { 44361413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett if (DEBUG) Log.d(TAG, "showBackupSecurity()"); 44463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller SecurityMode backup = mSecurityModel.getBackupSecurityMode(mCurrentSecuritySelection); 44563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller showSecurityScreen(backup); 446258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 447258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 4480a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen public boolean showNextSecurityScreenIfPresent() { 4490a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen SecurityMode securityMode = mSecurityModel.getSecurityMode(); 4500a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen // Allow an alternate, such as biometric unlock 4510a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen securityMode = mSecurityModel.getAlternateFor(securityMode); 4520a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen if (SecurityMode.None == securityMode) { 4530a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen return false; 4540a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } else { 4550a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen showSecurityScreen(securityMode); // switch to the alternate security view 4560a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen return true; 4570a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 4580a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 4590a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 460258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showNextSecurityScreenOrFinish(boolean authenticated) { 46161413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")"); 462dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller boolean finish = false; 463e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (SecurityMode.None == mCurrentSecuritySelection) { 464258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 465258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // Allow an alternate, such as biometric unlock 466000464ac012471d301c6e48a8228291519915e17Jim Miller securityMode = mSecurityModel.getAlternateFor(securityMode); 467e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (SecurityMode.None == securityMode) { 468dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller finish = true; // no security required 469dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 470e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); // switch to the alternate security view 471dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 472dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else if (authenticated) { 473e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller switch (mCurrentSecuritySelection) { 474e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: 475e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: 47669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 477e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: 478e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: 4794b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller finish = true; 4804b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 4814b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 482e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: 483e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: 4844b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home 4854b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 4864b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (securityMode != SecurityMode.None) { 487e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); 4884b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 4894b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller finish = true; 4904b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 4914b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 4924b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 4934b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller default: 4940ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller Log.v(TAG, "Bad security screen " + mCurrentSecuritySelection + ", fail safe"); 4950ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 4964b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 497dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 498dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 4990ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 500dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 501dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (finish) { 5020ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // If the alternate unlock was suppressed, it can now be safely 5030ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // enabled because the user has left keyguard. 5040ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); 5050ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardUpdateMonitor.getInstance(mContext).setIsFirstBoot(false); 50668c2489457631f733f542e14058c6d1274c203deJim Miller 507dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // If there's a pending runnable because the user interacted with a widget 508dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // and we're leaving keyguard, then run it. 509dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mLaunchRunnable != null) { 510dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLaunchRunnable.run(); 511dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLaunchRunnable = null; 512dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 5137def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 5147def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDone(true); 5157def1db03943251fe8cb57ec514722026425479eCraig Mautner } 516b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller } else { 517b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller mViewStateManager.showBouncer(true); 518dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 519dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 520dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 521dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private OnClickHandler mOnClickHandler = new OnClickHandler() { 522dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 523dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean onClickHandler(final View view, 524dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final android.app.PendingIntent pendingIntent, 525dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final Intent fillInIntent) { 526dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (pendingIntent.isActivity()) { 5275f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller setOnDismissRunnable(new Runnable() { 528dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 529dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 530dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? 531dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Context context = view.getContext(); 532dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, 533dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 0, 0, 534dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller view.getMeasuredWidth(), view.getMeasuredHeight()); 535dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller context.startIntentSender( 536dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller pendingIntent.getIntentSender(), fillInIntent, 537dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent.FLAG_ACTIVITY_NEW_TASK, 538dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle()); 539dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (IntentSender.SendIntentException e) { 540dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller android.util.Log.e(TAG, "Cannot send pending intent: ", e); 541dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (Exception e) { 542dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller android.util.Log.e(TAG, "Cannot send pending intent due to " + 543dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller "unknown exception: ", e); 544dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 545dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 5465f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller }); 547dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 548dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallback.dismiss(false); 549dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return true; 550dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 551dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return super.onClickHandler(view, pendingIntent, fillInIntent); 552dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 553dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 554dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 555dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 5560ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller private KeyguardStatusViewManager mKeyguardStatusViewManager; 5570ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 55863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller // Used to ignore callbacks from methods that are no longer current (e.g. face unlock). 55963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller // This avoids unwanted asynchronous events from messing with the state. 56063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() { 56163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 56263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 56363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void userActivity(long timeout) { 56463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 56563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 56663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 56763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void showBackupSecurity() { 56863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 56963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 57063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 57163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void setOnDismissRunnable(Runnable runnable) { 57263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 57363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 57463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 57563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void reportSuccessfulUnlockAttempt() { 57663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 57763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 57863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 57963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void reportFailedUnlockAttempt() { 58063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 58163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 58263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 58363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public boolean isVerifyUnlockOnly() { 58463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return false; 58563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 58663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 58763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 58863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public int getFailedAttempts() { 58963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return 0; 59063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 59163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 59263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 59363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void dismiss(boolean securityVerified) { 59463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 59563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller }; 59663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 597dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 598dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reset() { 599258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mIsVerifyUnlockOnly = false; 600ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_status_view)); 601dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 602dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 6035f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller /** 6045f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller * Sets a runnable to run when keyguard is dismissed 6055f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller * @param runnable 6065f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller */ 6075f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller protected void setOnDismissRunnable(Runnable runnable) { 6085f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller mLaunchRunnable = runnable; 6095f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 6105f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller 611e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private KeyguardSecurityView getSecurityView(SecurityMode securityMode) { 612e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 613e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView view = null; 614e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int children = mSecurityViewContainer.getChildCount(); 615dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller for (int child = 0; child < children; child++) { 616e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (mSecurityViewContainer.getChildAt(child).getId() == securityViewIdForMode) { 617e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller view = ((KeyguardSecurityView)mSecurityViewContainer.getChildAt(child)); 618e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller break; 619dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 620dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 621838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller boolean simPukFullScreen = getResources().getBoolean( 622838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller com.android.internal.R.bool.kg_sim_puk_account_full_screen); 62363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller int layoutId = getLayoutIdFor(securityMode); 62463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller if (view == null && layoutId != 0) { 625e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final LayoutInflater inflater = LayoutInflater.from(mContext); 626bdffd5c3a18e67443ebbd16d4f0349d0728285b1Jim Miller if (DEBUG) Log.v(TAG, "inflating id = " + layoutId); 62763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller View v = inflater.inflate(layoutId, this, false); 628e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mSecurityViewContainer.addView(v); 629e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityView(v); 6300ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 631e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller view = (KeyguardSecurityView) v; 6320ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller TextView navigationText = ((TextView) findViewById(R.id.keyguard_message_area)); 6330ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 6340ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // Some devices can fit a navigation area, others cannot. On devices that cannot, 6350ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // we display the security message in status area. 6360ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (navigationText != null) { 6370ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller view.setSecurityMessageDisplay(new KeyguardNavigationManager(navigationText)); 6380ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } else { 6391254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka if (mKeyguardStatusViewManager != null) { 6401254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka view.setSecurityMessageDisplay(mKeyguardStatusViewManager); 6411254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka } 6420ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 6430ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 6440ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 6456f131416ba4ff48067dc4e627971391a6b6778c4Adam Cohen if (securityMode == SecurityMode.SimPin || securityMode == SecurityMode.SimPuk || 6466f131416ba4ff48067dc4e627971391a6b6778c4Adam Cohen securityMode == SecurityMode.Account) { 6470ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (simPukFullScreen) { 648838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller mAppWidgetContainer.setVisibility(View.GONE); 6490ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 650e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 6510ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 6520ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (view instanceof KeyguardSelectorView) { 6530ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardSelectorView selectorView = (KeyguardSelectorView) view; 6540ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller View carrierText = selectorView.findViewById(R.id.keyguard_selector_fade_container); 6550ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller selectorView.setCarrierArea(carrierText); 6560ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 65768c2489457631f733f542e14058c6d1274c203deJim Miller 658e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller return view; 659dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 660dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 661258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller /** 662258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * Switches to the given security view unless it's already being shown, in which case 663258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * this is a no-op. 664258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * 665e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller * @param securityMode 666258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller */ 667e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void showSecurityScreen(SecurityMode securityMode) { 66868c2489457631f733f542e14058c6d1274c203deJim Miller if (DEBUG) Log.d(TAG, "showSecurityScreen(" + securityMode + ")"); 66968c2489457631f733f542e14058c6d1274c203deJim Miller 670e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (securityMode == mCurrentSecuritySelection) return; 671dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 672e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView oldView = getSecurityView(mCurrentSecuritySelection); 673e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView newView = getSecurityView(securityMode); 674dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 675dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Emulate Activity life cycle 67663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller if (oldView != null) { 67763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller oldView.onPause(); 67863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view 67963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 680dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller newView.onResume(); 68163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller newView.setKeyguardCallback(mCallback); 682dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 683cd03a26f4f5663b40d4679de102519ccc163fa10Craig Mautner final boolean needsInput = newView.needsInput(); 6847def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 685cd03a26f4f5663b40d4679de102519ccc163fa10Craig Mautner mViewMediatorCallback.setNeedsInput(needsInput); 6867def1db03943251fe8cb57ec514722026425479eCraig Mautner } 687dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 688dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Find and show this child. 689e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int childCount = mSecurityViewContainer.getChildCount(); 6904b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 69161413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett // Do flip animation to the next screen 69268c2489457631f733f542e14058c6d1274c203deJim Miller if (false) { 69368c2489457631f733f542e14058c6d1274c203deJim Miller mSecurityViewContainer.setInAnimation( 69468c2489457631f733f542e14058c6d1274c203deJim Miller AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_animate_in)); 69568c2489457631f733f542e14058c6d1274c203deJim Miller mSecurityViewContainer.setOutAnimation( 69668c2489457631f733f542e14058c6d1274c203deJim Miller AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_animate_out)); 69768c2489457631f733f542e14058c6d1274c203deJim Miller } 698e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 699dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller for (int i = 0; i < childCount; i++) { 700e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (mSecurityViewContainer.getChildAt(i).getId() == securityViewIdForMode) { 701e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mSecurityViewContainer.setDisplayedChild(i); 702dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller break; 703dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 704dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 705258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 706e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (securityMode == SecurityMode.None) { 707e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // Discard current runnable if we're switching back to the selector view 708258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller setOnDismissRunnable(null); 70968c2489457631f733f542e14058c6d1274c203deJim Miller } 710e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mCurrentSecuritySelection = securityMode; 711dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 712dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 713dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 714dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onScreenTurnedOn() { 715dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "screen on"); 7160ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 717e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller getSecurityView(mCurrentSecuritySelection).onResume(); 718d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller 719d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // This is a an attempt to fix bug 7137389 where the device comes back on but the entire 720d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // layout is blank but forcing a layout causes it to reappear (e.g. with with 721d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // hierarchyviewer). 722d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller requestLayout(); 7236fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 7246fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen if (mViewStateManager != null) { 7256fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mViewStateManager.showUsabilityHints(); 7266fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 727dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 728dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 729dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 730dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onScreenTurnedOff() { 731dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "screen off"); 7320ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(true); 733e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller getSecurityView(mCurrentSecuritySelection).onPause(); 734dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 735dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 736dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 737dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void show() { 738086977094d96ab9352432e0941a05b09cefc92acJim Miller if (DEBUG) Log.d(TAG, "show()"); 739086977094d96ab9352432e0941a05b09cefc92acJim Miller showPrimarySecurityScreen(false); 740dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 741dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 742dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private boolean isSecure() { 743dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller SecurityMode mode = mSecurityModel.getSecurityMode(); 744dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller switch (mode) { 745dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Pattern: 746dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mLockPatternUtils.isLockPatternEnabled(); 747dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Password: 74869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 749dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mLockPatternUtils.isLockPasswordEnabled(); 750dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case SimPin: 751dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case SimPuk: 752dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Account: 753dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return true; 754dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case None: 755dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return false; 756dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller default: 757dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller throw new IllegalStateException("Unknown security mode " + mode); 758dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 759dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 760dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 761dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 762dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void wakeWhenReadyTq(int keyCode) { 763dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "onWakeKey"); 764dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (keyCode == KeyEvent.KEYCODE_MENU && isSecure()) { 765dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "switching screens to unlock screen because wake key was MENU"); 766e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(SecurityMode.None); 767dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 768dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "poking wake lock immediately"); 7697def1db03943251fe8cb57ec514722026425479eCraig Mautner } 7707def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 7713dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mViewMediatorCallback.wakeUp(); 772dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 773dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 774dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 775dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 776dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void verifyUnlock() { 777dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 778dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (securityMode == KeyguardSecurityModel.SecurityMode.None) { 7797def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 7807def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDone(true); 7817def1db03943251fe8cb57ec514722026425479eCraig Mautner } 782dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else if (securityMode != KeyguardSecurityModel.SecurityMode.Pattern 78369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler && securityMode != KeyguardSecurityModel.SecurityMode.PIN 784dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller && securityMode != KeyguardSecurityModel.SecurityMode.Password) { 785dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // can only verify unlock when in pattern/password mode 7867def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 7877def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDone(false); 7887def1db03943251fe8cb57ec514722026425479eCraig Mautner } 789dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 790dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // otherwise, go to the unlock screen, see if they can verify it 791dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mIsVerifyUnlockOnly = true; 792e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); 793dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 794dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 795dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 796dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private int getSecurityViewIdForMode(SecurityMode securityMode) { 797dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller switch (securityMode) { 798e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case None: return R.id.keyguard_selector_view; 799e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: return R.id.keyguard_pattern_view; 80069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: return R.id.keyguard_pin_view; 801e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: return R.id.keyguard_password_view; 802e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: return R.id.keyguard_face_unlock_view; 803e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: return R.id.keyguard_account_view; 804e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: return R.id.keyguard_sim_pin_view; 805e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: return R.id.keyguard_sim_puk_view; 806dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 807dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return 0; 808dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 809dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 810e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private int getLayoutIdFor(SecurityMode securityMode) { 811e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller switch (securityMode) { 812e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case None: return R.layout.keyguard_selector_view; 813e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: return R.layout.keyguard_pattern_view; 81469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: return R.layout.keyguard_pin_view; 815e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: return R.layout.keyguard_password_view; 816e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: return R.layout.keyguard_face_unlock_view; 817e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: return R.layout.keyguard_account_view; 818e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: return R.layout.keyguard_sim_pin_view; 819e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: return R.layout.keyguard_sim_puk_view; 820e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller default: 82163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return 0; 822e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 823e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 824e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller 825d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller private void addWidget(int appId, int pageIndex) { 826dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext); 827dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appId); 82899a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller if (appWidgetInfo != null) { 82999a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller AppWidgetHostView view = getAppWidgetHost().createView(mContext, appId, appWidgetInfo); 830d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller addWidget(view, pageIndex); 83199a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller } else { 8321254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka Log.w(TAG, "AppWidgetInfo for app widget id " + appId + " was null, deleting"); 8331254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka mLockPatternUtils.removeAppWidget(appId); 83499a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller } 835dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 836dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 837dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock private final CameraWidgetFrame.Callbacks mCameraWidgetCallbacks = 838dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock new CameraWidgetFrame.Callbacks() { 839dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 840dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock public void onLaunchingCamera() { 841dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock SlidingChallengeLayout slider = locateSlider(); 842dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock if (slider != null) { 843dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock slider.showHandle(false); 844dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 845dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 846dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 847dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 848dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock public void onCameraLaunched() { 849dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock SlidingChallengeLayout slider = locateSlider(); 850dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock if (slider != null) { 851dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock slider.showHandle(true); 852dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 853dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock mAppWidgetContainer.scrollLeft(); 854dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 855dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 856dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock private SlidingChallengeLayout locateSlider() { 857dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return (SlidingChallengeLayout) findViewById(R.id.sliding_layout); 858dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 859dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock }; 860dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 861dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() { 862dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 863dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock Context getContext() { 864dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mContext; 865dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 866dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 867dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 868dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock KeyguardSecurityCallback getCallback() { 869dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mCallback; 870dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 871dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 872dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 873dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock LockPatternUtils getLockPatternUtils() { 874dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mLockPatternUtils; 875dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock }}; 876dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 8774e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller private void addDefaultWidgets() { 8784e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller LayoutInflater inflater = LayoutInflater.from(mContext); 879223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller inflater.inflate(R.layout.keyguard_transport_control_view, this, true); 8804e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 881d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller View addWidget = inflater.inflate(R.layout.keyguard_add_widget, null, true); 882d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.addWidget(addWidget); 88386b6357e5eb91950eac7de7ffe29e5a4ad32903bJohn Spurlock if (mContext.getResources().getBoolean(R.bool.kg_enable_camera_default_widget)) { 884dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock View cameraWidget = 885dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock CameraWidgetFrame.create(mContext, mCameraWidgetCallbacks, mActivityLauncher); 886dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock if (cameraWidget != null) { 887dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock mAppWidgetContainer.addWidget(cameraWidget); 888dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 88986b6357e5eb91950eac7de7ffe29e5a4ad32903bJohn Spurlock } 890838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 891b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view); 892b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller addWidgetButton.setOnClickListener(new OnClickListener() { 893b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller @Override 894b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller public void onClick(View v) { 895b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller mCallback.setOnDismissRunnable(new Runnable() { 896b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller 897b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller @Override 898b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller public void run() { 899b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); 900b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller intent.addFlags( 901b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller Intent.FLAG_ACTIVITY_NEW_TASK 902b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller | Intent.FLAG_ACTIVITY_SINGLE_TOP 903b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller | Intent.FLAG_ACTIVITY_CLEAR_TOP 904b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 905b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller mContext.startActivityAsUser(intent, 906b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller new UserHandle(UserHandle.USER_CURRENT)); 907b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller } 908b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller }); 909b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller mCallback.dismiss(false); 910b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller } 911b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller }); 912b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller 91319a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller enableUserSelectorIfNecessary(); 9147221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller initializeTransportControl(); 9157221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller } 9167221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller 9177221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller private void initializeTransportControl() { 9184e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl = 9194e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller (KeyguardTransportControlView) findViewById(R.id.keyguard_transport_control); 920223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportControl.setVisibility(View.GONE); 9214e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 9224e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller // This code manages showing/hiding the transport control. We keep it around and only 9234e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller // add it to the hierarchy if it needs to be present. 9244e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller if (mTransportControl != null) { 9254e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl.setKeyguardCallback(new TransportCallback() { 9264e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller @Override 927223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onListenerDetached() { 9284e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller int page = getWidgetPosition(R.id.keyguard_transport_control); 929223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (page != -1) { 9304e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mAppWidgetContainer.removeView(mTransportControl); 931e955121d6ee64502a938ff3bb3bba8058822d28fJim Miller // XXX keep view attached so we still get show/hide events from AudioManager 9324e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller KeyguardHostView.this.addView(mTransportControl); 9334e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl.setVisibility(View.GONE); 934223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportState = TRANSPORT_GONE; 935e955121d6ee64502a938ff3bb3bba8058822d28fJim Miller mTransportControl.post(mSwitchPageRunnable); 9364e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 9374e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 9384e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 9394e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller @Override 940223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onListenerAttached() { 9414e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller if (getWidgetPosition(R.id.keyguard_transport_control) == -1) { 9424e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller KeyguardHostView.this.removeView(mTransportControl); 943223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mAppWidgetContainer.addView(mTransportControl, 0); 9444e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl.setVisibility(View.VISIBLE); 9454e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 9464e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 947223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 948223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 949223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onPlayStateChanged() { 950223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportControl.post(mSwitchPageRunnable); 951223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 9524e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller }); 9534e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 9540ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 9551254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka KeyguardStatusView ksv = (KeyguardStatusView) 9561254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka findViewById(R.id.keyguard_status_view_face_palm); 9571254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka if (ksv != null) { 9581254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka mKeyguardStatusViewManager = ksv.getManager(); 9591254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka } 9600ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 9614e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 9624e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 9631254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka private void addWidgetsFromSettings() { 964f73fbf79a1db4bc5ccc829c8a84f3431ab986cbcJim Miller DevicePolicyManager dpm = 965f73fbf79a1db4bc5ccc829c8a84f3431ab986cbcJim Miller (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); 96648b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller if (dpm != null) { 96748b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller final int currentUser = mLockPatternUtils.getCurrentUser(); 96848b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller final int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUser); 96948b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller if ((disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0) { 97048b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller Log.v(TAG, "Keyguard widgets disabled because of device policy admin"); 97148b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller return; 97248b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller } 973b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } 974f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller 975d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget); 976d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller int addPageIndex = mAppWidgetContainer.indexOfChild(addWidget); 977d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller // This shouldn't happen, but just to be safe! 978d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller if (addPageIndex < 0) { 979d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller addPageIndex = 0; 98020c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka } 98120c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka 98220c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka // Add user-selected widget 983aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka final int[] widgets = mLockPatternUtils.getAppWidgets(); 984aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka if (widgets == null) { 985aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka Log.d(TAG, "Problem reading widgets"); 986aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka } else { 987aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka for (int i = widgets.length -1; i >= 0; i--) { 9881254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka if (widgets[i] == LockPatternUtils.ID_DEFAULT_STATUS_WIDGET) { 9891254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka LayoutInflater inflater = LayoutInflater.from(mContext); 9901254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true); 9911254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka mAppWidgetContainer.addWidget(statusWidget, addPageIndex + 1); 9921254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka } else { 993aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // We add the widgets from left to right, starting after the first page after 994aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // the add page. We count down, since the order will be persisted from right 995aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // to left, starting after camera. 996aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka addWidget(widgets[i], addPageIndex + 1); 997aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka } 998dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 999dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 10000207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen } 10010207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen 1002223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller Runnable mSwitchPageRunnable = new Runnable() { 1003223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1004223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void run() { 1005223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller showAppropriateWidgetPage(); 1006223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1007223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller }; 1008223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1009223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller static class SavedState extends BaseSavedState { 1010223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller int transportState; 1011223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1012223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState(Parcelable superState) { 1013223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super(superState); 1014223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1015223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1016223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller private SavedState(Parcel in) { 1017223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super(in); 1018223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller this.transportState = in.readInt(); 1019223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1020223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1021223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1022223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void writeToParcel(Parcel out, int flags) { 1023223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.writeToParcel(out, flags); 1024223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller out.writeInt(this.transportState); 1025223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1026223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1027223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public static final Parcelable.Creator<SavedState> CREATOR 1028223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller = new Parcelable.Creator<SavedState>() { 1029223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public SavedState createFromParcel(Parcel in) { 1030223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return new SavedState(in); 1031223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1032223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1033223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public SavedState[] newArray(int size) { 1034223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return new SavedState[size]; 1035223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1036223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller }; 1037223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1038223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1039223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1040223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public Parcelable onSaveInstanceState() { 1041223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller Parcelable superState = super.onSaveInstanceState(); 1042223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState ss = new SavedState(superState); 1043223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller ss.transportState = mTransportState; 1044223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return ss; 1045223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1046223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1047223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1048223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onRestoreInstanceState(Parcelable state) { 1049223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (!(state instanceof SavedState)) { 1050223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.onRestoreInstanceState(state); 1051223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return; 1052223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1053223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState ss = (SavedState) state; 1054223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.onRestoreInstanceState(ss.getSuperState()); 1055223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportState = ss.transportState; 1056223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller post(mSwitchPageRunnable); 1057223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1058223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 10590207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen private void showAppropriateWidgetPage() { 1060223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1061223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller // The following sets the priority for showing widgets. Transport should be shown if 1062223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller // music is playing, followed by the multi-user widget if enabled, followed by the 1063223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller // status widget. 1064223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller final int pageToShow; 1065223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (mTransportControl.isMusicPlaying() || mTransportState == TRANSPORT_VISIBLE) { 1066223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportState = TRANSPORT_VISIBLE; 1067223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller pageToShow = mAppWidgetContainer.indexOfChild(mTransportControl); 1068223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } else { 1069223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 1070223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller final View multiUserView = findViewById(R.id.keyguard_multi_user_selector); 1071223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller final int multiUserPosition = mAppWidgetContainer.indexOfChild(multiUserView); 1072223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (multiUserPosition != -1 && mUm.getUsers(true).size() > 1) { 1073223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller pageToShow = multiUserPosition; 1074223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } else { 1075223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller final View statusView = findViewById(R.id.keyguard_status_view); 10761254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka int statusViewIndex = mAppWidgetContainer.indexOfChild(statusView); 10771254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka if (statusViewIndex == -1) { 10781254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka // TEMP code for default page 10791254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka if (mAppWidgetContainer.getChildCount() > 2) { 10801254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka pageToShow = mAppWidgetContainer.getChildCount() - 2; 10811254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka } else { 10821254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka pageToShow = 0; 10831254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka } 10841254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka } else { 10851254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka pageToShow = mAppWidgetContainer.indexOfChild(statusView); 10861254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka } 1087223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1088223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (mTransportState == TRANSPORT_VISIBLE) { 1089223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportState = TRANSPORT_INVISIBLE; 1090223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 10910207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen } 1092223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mAppWidgetContainer.setCurrentPage(pageToShow); 1093dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1094dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 109519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller private void enableUserSelectorIfNecessary() { 109666b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen // if there are multiple users, we need to add the multi-user switcher widget to the 109766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen // keyguard. 109866b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 1099920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani List<UserInfo> users = mUm.getUsers(true); 110066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 110166b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen if (users.size() > 1) { 110228c5ee9ea9b1dd6253a4ba782a5711263524bd41Chris Wren KeyguardMultiUserSelectorView multiUser = 110328c5ee9ea9b1dd6253a4ba782a5711263524bd41Chris Wren (KeyguardMultiUserSelectorView) findViewById(R.id.keyguard_user_selector); 110419a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller multiUser.setVisibility(View.VISIBLE); 110528c5ee9ea9b1dd6253a4ba782a5711263524bd41Chris Wren multiUser.addUsers(mUm.getUsers(true)); 110624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen UserSwitcherCallback callback = new UserSwitcherCallback() { 110724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen @Override 110824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen public void hideSecurityView(int duration) { 110924b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mSecurityViewContainer.animate().alpha(0).setDuration(duration); 111024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 111124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen 111224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen @Override 111324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen public void showSecurityView() { 111424b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mSecurityViewContainer.setAlpha(1.0f); 111524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 11160a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 11170a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen @Override 11180a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen public void showUnlockHint() { 11190ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (mKeyguardSelectorView != null) { 11206fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mKeyguardSelectorView.showUsabilityHint(); 11210ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 11220a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 11230a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 112419a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller @Override 112519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller public void userActivity() { 112619a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller if (mViewMediatorCallback != null) { 112719a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller mViewMediatorCallback.userActivity(); 112819a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller } 112919a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller } 113024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen }; 113124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen multiUser.setCallback(callback); 113266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 113366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 113466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 1135dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 1136dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void cleanUp() { 1137dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1138dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1139dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 114095b005c196de2f99513da28fe9108b2dec200140Jim Miller /** 114195b005c196de2f99513da28fe9108b2dec200140Jim Miller * In general, we enable unlocking the insecure keyguard with the menu key. However, there are 114295b005c196de2f99513da28fe9108b2dec200140Jim Miller * some cases where we wish to disable it, notably when the menu button placement or technology 114395b005c196de2f99513da28fe9108b2dec200140Jim Miller * is prone to false positives. 114495b005c196de2f99513da28fe9108b2dec200140Jim Miller * 114595b005c196de2f99513da28fe9108b2dec200140Jim Miller * @return true if the menu key should be enabled 114695b005c196de2f99513da28fe9108b2dec200140Jim Miller */ 114795b005c196de2f99513da28fe9108b2dec200140Jim Miller private static final String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key"; 114895b005c196de2f99513da28fe9108b2dec200140Jim Miller private boolean shouldEnableMenuKey() { 114995b005c196de2f99513da28fe9108b2dec200140Jim Miller final Resources res = getResources(); 1150258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final boolean configDisabled = res.getBoolean( 1151258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller com.android.internal.R.bool.config_disableMenuKeyInLockScreen); 115295b005c196de2f99513da28fe9108b2dec200140Jim Miller final boolean isTestHarness = ActivityManager.isRunningInTestHarness(); 115395b005c196de2f99513da28fe9108b2dec200140Jim Miller final boolean fileOverride = (new File(ENABLE_MENU_KEY_FILE)).exists(); 115495b005c196de2f99513da28fe9108b2dec200140Jim Miller return !configDisabled || isTestHarness || fileOverride; 115595b005c196de2f99513da28fe9108b2dec200140Jim Miller } 115695b005c196de2f99513da28fe9108b2dec200140Jim Miller 115795b005c196de2f99513da28fe9108b2dec200140Jim Miller @Override 115895b005c196de2f99513da28fe9108b2dec200140Jim Miller public boolean onKeyDown(int keyCode, KeyEvent event) { 115995b005c196de2f99513da28fe9108b2dec200140Jim Miller if (keyCode == KeyEvent.KEYCODE_MENU && mEnableMenuKey) { 116095b005c196de2f99513da28fe9108b2dec200140Jim Miller showNextSecurityScreenOrFinish(false); 116195b005c196de2f99513da28fe9108b2dec200140Jim Miller return true; 116295b005c196de2f99513da28fe9108b2dec200140Jim Miller } else { 116395b005c196de2f99513da28fe9108b2dec200140Jim Miller return super.onKeyDown(keyCode, event); 116495b005c196de2f99513da28fe9108b2dec200140Jim Miller } 116595b005c196de2f99513da28fe9108b2dec200140Jim Miller } 116695b005c196de2f99513da28fe9108b2dec200140Jim Miller 11676bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller public void goToUserSwitcher() { 11686bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_multi_user_selector)); 11696bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller } 11706bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller 11710a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller public boolean handleBackKey() { 11720a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller if (mCurrentSecuritySelection != SecurityMode.None) { 11730a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller mCallback.dismiss(false); 11740a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller return true; 11750a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller } 11760a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller return false; 11770a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller } 11780a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller 1179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller} 1180