KeyguardHostView.java revision 147f9568afe645d9bfb91f3037f5336d8a2482cc
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; 234eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Millerimport android.app.SearchManager; 24258341c377b6aa9f1bd29a9b507a97967e432dfeJim Millerimport android.app.admin.DevicePolicyManager; 25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.appwidget.AppWidgetHost; 26dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.appwidget.AppWidgetHostView; 27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.appwidget.AppWidgetManager; 28dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.appwidget.AppWidgetProviderInfo; 29fc753c0cf676000b1c2d3cb2728af85a9b49f795Michael Jurkaimport android.content.ComponentName; 30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Context; 31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Intent; 32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.IntentSender; 3366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.content.pm.UserInfo; 3495b005c196de2f99513da28fe9108b2dec200140Jim Millerimport android.content.res.Resources; 35dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.graphics.Canvas; 365737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.graphics.Rect; 37f229e4d3eb8f910c181f96416c6798f6f305a395Jim Millerimport android.os.Looper; 38223ce5c7326f6d13a17ccf2624605bb62864a27aJim Millerimport android.os.Parcel; 39223ce5c7326f6d13a17ccf2624605bb62864a27aJim Millerimport android.os.Parcelable; 40dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlockimport android.os.SystemClock; 414eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Millerimport android.os.UserHandle; 4266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.os.UserManager; 43fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurkaimport android.provider.Settings; 44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet; 45dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Log; 46258341c377b6aa9f1bd29a9b507a97967e432dfeJim Millerimport android.util.Slog; 47dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.KeyEvent; 4866b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.view.LayoutInflater; 495737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.view.MotionEvent; 50dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.View; 51258341c377b6aa9f1bd29a9b507a97967e432dfeJim Millerimport android.view.WindowManager; 52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.animation.AnimationUtils; 53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.RemoteViews.OnClickHandler; 54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 5566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport com.android.internal.R; 56dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.policy.impl.keyguard.KeyguardSecurityModel.SecurityMode; 57dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternUtils; 58dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 5995b005c196de2f99513da28fe9108b2dec200140Jim Millerimport java.io.File; 6066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport java.util.List; 61dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 62dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardHostView extends KeyguardViewBase { 6351117262c8fadb6d227d137e83ad66996b013141Jim Miller private static final String TAG = "KeyguardHostView"; 64ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 65dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Use this to debug all of keyguard 66a71984f3da47c6e6e3164c170735362a3222d3adJim Miller public static boolean DEBUG = KeyguardViewMediator.DEBUG; 67dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 68192d6d4ee271c0782a3bf5d8c64e42eb22d1a6faMichael Jurka // Found in KeyguardAppWidgetPickActivity.java 69dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller static final int APPWIDGET_HOST_ID = 0x4B455947; 70dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 71eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka private final int MAX_WIDGETS = 5; 72eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka 73dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private AppWidgetHost mAppWidgetHost; 7467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka private AppWidgetManager mAppWidgetManager; 75f2dfc351dec58ad3c16f8496208b4e6e9c667efeJim Miller private KeyguardWidgetPager mAppWidgetContainer; 766fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen private KeyguardSecurityViewFlipper mSecurityViewContainer; 770a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen private KeyguardSelectorView mKeyguardSelectorView; 784e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller private KeyguardTransportControlView mTransportControl; 79dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private boolean mIsVerifyUnlockOnly; 80258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private boolean mEnableFallback; // TODO: This should get the value from KeyguardPatternView 8163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid; 8276017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka private int mAppWidgetToShow; 83dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 84efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen private boolean mCheckAppWidgetConsistencyOnBootCompleted = false; 85545043e59e906525af646b1ecad1797258797590Michael Jurka private boolean mCleanupAppWidgetsOnBootCompleted = false; 86efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen 8734c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock protected OnDismissAction mDismissAction; 88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected int mFailedAttempts; 90dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private LockPatternUtils mLockPatternUtils; 91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 92dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardSecurityModel mSecurityModel; 93d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller private KeyguardViewStateManager mViewStateManager; 94dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 955737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller private Rect mTempRect = new Rect(); 96ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 9751117262c8fadb6d227d137e83ad66996b013141Jim Miller private int mDisabledFeatures; 9851117262c8fadb6d227d137e83ad66996b013141Jim Miller 9951117262c8fadb6d227d137e83ad66996b013141Jim Miller private boolean mCameraDisabled; 10051117262c8fadb6d227d137e83ad66996b013141Jim Miller 10151117262c8fadb6d227d137e83ad66996b013141Jim Miller private boolean mSafeModeEnabled; 10251117262c8fadb6d227d137e83ad66996b013141Jim Miller 103fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka private boolean mUserSetupCompleted; 104fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka 105ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller /*package*/ interface TransportCallback { 106223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller void onListenerDetached(); 107223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller void onListenerAttached(); 108223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller void onPlayStateChanged(); 109ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 1105737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 11124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen /*package*/ interface UserSwitcherCallback { 11224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen void hideSecurityView(int duration); 11324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen void showSecurityView(); 1140a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen void showUnlockHint(); 11519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller void userActivity(); 11624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 11724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen 11814adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock /*package*/ interface OnDismissAction { 11914adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock /* returns true if the dismiss should be deferred */ 12014adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock boolean onDismiss(); 12114adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock } 12214adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock 123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardHostView(Context context) { 124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller this(context, null); 125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 126dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 127dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardHostView(Context context, AttributeSet attrs) { 128dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super(context, attrs); 129000464ac012471d301c6e48a8228291519915e17Jim Miller mLockPatternUtils = new LockPatternUtils(context); 130f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller mAppWidgetHost = new AppWidgetHost( 131f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller context, APPWIDGET_HOST_ID, mOnClickHandler, Looper.myLooper()); 13275b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka cleanupAppWidgetIds(); 13375b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka 13467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka mAppWidgetManager = AppWidgetManager.getInstance(mContext); 135f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller mSecurityModel = new KeyguardSecurityModel(context); 13695b005c196de2f99513da28fe9108b2dec200140Jim Miller 137d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen mViewStateManager = new KeyguardViewStateManager(this); 13851117262c8fadb6d227d137e83ad66996b013141Jim Miller 13951117262c8fadb6d227d137e83ad66996b013141Jim Miller DevicePolicyManager dpm = 14051117262c8fadb6d227d137e83ad66996b013141Jim Miller (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); 14151117262c8fadb6d227d137e83ad66996b013141Jim Miller if (dpm != null) { 14251117262c8fadb6d227d137e83ad66996b013141Jim Miller mDisabledFeatures = getDisabledFeatures(dpm); 14351117262c8fadb6d227d137e83ad66996b013141Jim Miller mCameraDisabled = dpm.getCameraDisabled(null); 14451117262c8fadb6d227d137e83ad66996b013141Jim Miller } 14551117262c8fadb6d227d137e83ad66996b013141Jim Miller 14651117262c8fadb6d227d137e83ad66996b013141Jim Miller mSafeModeEnabled = LockPatternUtils.isSafeModeEnabled(); 147fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka mUserSetupCompleted = Settings.Secure.getIntForUser(mContext.getContentResolver(), 148fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka Settings.Secure.USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) != 0; 14951117262c8fadb6d227d137e83ad66996b013141Jim Miller 15051117262c8fadb6d227d137e83ad66996b013141Jim Miller if (mSafeModeEnabled) { 15151117262c8fadb6d227d137e83ad66996b013141Jim Miller Log.v(TAG, "Keyguard widgets disabled by safe mode"); 15251117262c8fadb6d227d137e83ad66996b013141Jim Miller } 15351117262c8fadb6d227d137e83ad66996b013141Jim Miller if ((mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0) { 15451117262c8fadb6d227d137e83ad66996b013141Jim Miller Log.v(TAG, "Keyguard widgets disabled by DPM"); 15551117262c8fadb6d227d137e83ad66996b013141Jim Miller } 15651117262c8fadb6d227d137e83ad66996b013141Jim Miller if ((mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0) { 15751117262c8fadb6d227d137e83ad66996b013141Jim Miller Log.v(TAG, "Keyguard secure camera disabled by DPM"); 15851117262c8fadb6d227d137e83ad66996b013141Jim Miller } 159dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 16175b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka private void cleanupAppWidgetIds() { 162545043e59e906525af646b1ecad1797258797590Michael Jurka // Since this method may delete a widget (which we can't do until boot completed) we 163545043e59e906525af646b1ecad1797258797590Michael Jurka // may have to defer it until after boot complete. 164545043e59e906525af646b1ecad1797258797590Michael Jurka if (!KeyguardUpdateMonitor.getInstance(mContext).hasBootCompleted()) { 165545043e59e906525af646b1ecad1797258797590Michael Jurka mCleanupAppWidgetsOnBootCompleted = true; 166545043e59e906525af646b1ecad1797258797590Michael Jurka return; 167545043e59e906525af646b1ecad1797258797590Michael Jurka } 16875b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka // Clean up appWidgetIds that are bound to lockscreen, but not actually used 16975b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka // This is only to clean up after another bug: we used to not call 17075b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka // deleteAppWidgetId when a user manually deleted a widget in keyguard. This code 17175b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka // shouldn't have to run more than once per user. AppWidgetProviders rely on callbacks 17275b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka // that are triggered by deleteAppWidgetId, which is why we're doing this 17375b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka int[] appWidgetIdsInKeyguardSettings = mLockPatternUtils.getAppWidgets(); 17475b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka int[] appWidgetIdsBoundToHost = mAppWidgetHost.getAppWidgetIds(); 17575b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka for (int i = 0; i < appWidgetIdsBoundToHost.length; i++) { 17675b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka int appWidgetId = appWidgetIdsBoundToHost[i]; 17775b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka if (!contains(appWidgetIdsInKeyguardSettings, appWidgetId)) { 17875b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka Log.d(TAG, "Found a appWidgetId that's not being used by keyguard, deleting id " 17975b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka + appWidgetId); 18075b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka mAppWidgetHost.deleteAppWidgetId(appWidgetId); 18175b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka } 18275b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka } 18375b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka } 18475b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka 18575b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka private static boolean contains(int[] array, int target) { 18675b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka for (int value : array) { 18775b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka if (value == target) { 18875b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka return true; 18975b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka } 19075b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka } 19175b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka return false; 19275b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka } 19375b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka 194efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen private KeyguardUpdateMonitorCallback mUpdateMonitorCallbacks = 195efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen new KeyguardUpdateMonitorCallback() { 196efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen @Override 197efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen public void onBootCompleted() { 198efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen if (mCheckAppWidgetConsistencyOnBootCompleted) { 199efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen checkAppWidgetConsistency(); 200efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen mSwitchPageRunnable.run(); 201efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen mCheckAppWidgetConsistencyOnBootCompleted = false; 202efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen } 203545043e59e906525af646b1ecad1797258797590Michael Jurka if (mCleanupAppWidgetsOnBootCompleted) { 204545043e59e906525af646b1ecad1797258797590Michael Jurka cleanupAppWidgetIds(); 205545043e59e906525af646b1ecad1797258797590Michael Jurka mCleanupAppWidgetsOnBootCompleted = false; 206545043e59e906525af646b1ecad1797258797590Michael Jurka } 207efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen } 208efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen }; 209efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen 2102cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller private SlidingChallengeLayout mSlidingChallengeLayout; 2112cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller 212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 213d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller public boolean onTouchEvent(MotionEvent ev) { 214d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller boolean result = super.onTouchEvent(ev); 2155737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller mTempRect.set(0, 0, 0, 0); 2165737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller offsetRectIntoDescendantCoords(mSecurityViewContainer, mTempRect); 2175737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(mTempRect.left, mTempRect.top); 2185737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller result = mSecurityViewContainer.dispatchTouchEvent(ev) || result; 2195737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(-mTempRect.left, -mTempRect.top); 2205737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller return result; 2215737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 2225737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 2235737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller @Override 224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void dispatchDraw(Canvas canvas) { 225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.dispatchDraw(canvas); 2267def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 2277def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDoneDrawing(); 2287def1db03943251fe8cb57ec514722026425479eCraig Mautner } 229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 230dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 231ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller private int getWidgetPosition(int id) { 232ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller final int children = mAppWidgetContainer.getChildCount(); 233ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller for (int i = 0; i < children; i++) { 234bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller if (mAppWidgetContainer.getWidgetPageAt(i).getContent().getId() == id) { 235ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller return i; 236ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 237ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 238ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller return -1; 239ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 240ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 241dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 242dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onFinishInflate() { 243d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller // Grab instances of and make any necessary changes to the main layouts. Create 244d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller // view state manager and wire up necessary listeners / callbacks. 245f3b9ec8230298e8f707c2fc44a74fb9346ec3d12Winson Chung View deleteDropTarget = findViewById(R.id.keyguard_widget_pager_delete_target); 246f2dfc351dec58ad3c16f8496208b4e6e9c667efeJim Miller mAppWidgetContainer = (KeyguardWidgetPager) findViewById(R.id.app_widget_container); 247838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller mAppWidgetContainer.setVisibility(VISIBLE); 248838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller mAppWidgetContainer.setCallbacks(mWidgetCallbacks); 249f3b9ec8230298e8f707c2fc44a74fb9346ec3d12Winson Chung mAppWidgetContainer.setDeleteDropTarget(deleteDropTarget); 250d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.setMinScale(0.5f); 251d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 2522cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller mSlidingChallengeLayout = (SlidingChallengeLayout) findViewById(R.id.sliding_layout); 2532cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller if (mSlidingChallengeLayout != null) { 2542cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller mSlidingChallengeLayout.setOnChallengeScrolledListener(mViewStateManager); 25519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller } 256d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.setViewStateManager(mViewStateManager); 2571254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka mAppWidgetContainer.setLockPatternUtils(mLockPatternUtils); 258d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 2592cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller ChallengeLayout challenge = mSlidingChallengeLayout != null ? mSlidingChallengeLayout : 26048275d2de99ff2556031929c48f295d3f93447b6Winson Chung (ChallengeLayout) findViewById(R.id.multi_pane_challenge); 26148275d2de99ff2556031929c48f295d3f93447b6Winson Chung challenge.setOnBouncerStateChangedListener(mViewStateManager); 26270c2f8736437ebb6073c3b6dab2e08e6dd9f39a6Winson Chung mAppWidgetContainer.setBouncerAnimationDuration(challenge.getBouncerAnimationDuration()); 263d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mViewStateManager.setPagedView(mAppWidgetContainer); 26448275d2de99ff2556031929c48f295d3f93447b6Winson Chung mViewStateManager.setChallengeLayout(challenge); 2656fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mSecurityViewContainer = (KeyguardSecurityViewFlipper) findViewById(R.id.view_flipper); 2660a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen mKeyguardSelectorView = (KeyguardSelectorView) findViewById(R.id.keyguard_selector_view); 2676fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mViewStateManager.setSecurityViewContainer(mSecurityViewContainer); 268ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 269d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller if (!(mContext instanceof Activity)) { 270d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller setSystemUiVisibility(getSystemUiVisibility() | View.STATUS_BAR_DISABLE_BACK); 271d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 27268c2489457631f733f542e14058c6d1274c203deJim Miller 27367a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka addDefaultWidgets(); 27451117262c8fadb6d227d137e83ad66996b013141Jim Miller 27567a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka addWidgetsFromSettings(); 276fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka if (!shouldEnableAddWidget()) { 2774752e7d1a9ff83d946890b0020de091f4346a7aeWinson Chung mAppWidgetContainer.setAddWidgetEnabled(false); 278eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 27951117262c8fadb6d227d137e83ad66996b013141Jim Miller checkAppWidgetConsistency(); 28067a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka mSwitchPageRunnable.run(); 28145adaa70203a155beb786f22b251fe66b8d6fafdAdam Cohen // This needs to be called after the pages are all added. 28245adaa70203a155beb786f22b251fe66b8d6fafdAdam Cohen mViewStateManager.showUsabilityHints(); 28345adaa70203a155beb786f22b251fe66b8d6fafdAdam Cohen 28467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka showPrimarySecurityScreen(false); 2859b1db682c32d103974b0f1193b50e77e254d5589Jim Miller updateSecurityViews(); 286147f9568afe645d9bfb91f3037f5336d8a2482ccJim Miller 287147f9568afe645d9bfb91f3037f5336d8a2482ccJim Miller // Make sure at least this view is focusable in case nothing below it is. Otherwise, 288147f9568afe645d9bfb91f3037f5336d8a2482ccJim Miller // requestFocus() on this view will fail and allow events, such as volume keys, to be 289147f9568afe645d9bfb91f3037f5336d8a2482ccJim Miller // handled by the fallback handler. See bug 7546960 for details. 290147f9568afe645d9bfb91f3037f5336d8a2482ccJim Miller setFocusableInTouchMode(true); 291e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 292dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 293fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka private boolean shouldEnableAddWidget() { 294fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka return numWidgets() < MAX_WIDGETS && mUserSetupCompleted; 295fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka } 296fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka 29751117262c8fadb6d227d137e83ad66996b013141Jim Miller private int getDisabledFeatures(DevicePolicyManager dpm) { 29851117262c8fadb6d227d137e83ad66996b013141Jim Miller int disabledFeatures = DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE; 29951117262c8fadb6d227d137e83ad66996b013141Jim Miller if (dpm != null) { 30051117262c8fadb6d227d137e83ad66996b013141Jim Miller final int currentUser = mLockPatternUtils.getCurrentUser(); 30151117262c8fadb6d227d137e83ad66996b013141Jim Miller disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUser); 30251117262c8fadb6d227d137e83ad66996b013141Jim Miller } 30351117262c8fadb6d227d137e83ad66996b013141Jim Miller return disabledFeatures; 30451117262c8fadb6d227d137e83ad66996b013141Jim Miller } 30551117262c8fadb6d227d137e83ad66996b013141Jim Miller 30651117262c8fadb6d227d137e83ad66996b013141Jim Miller private boolean widgetsDisabledByDpm() { 30751117262c8fadb6d227d137e83ad66996b013141Jim Miller return (mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0; 30851117262c8fadb6d227d137e83ad66996b013141Jim Miller } 30951117262c8fadb6d227d137e83ad66996b013141Jim Miller 31051117262c8fadb6d227d137e83ad66996b013141Jim Miller private boolean cameraDisabledByDpm() { 31151117262c8fadb6d227d137e83ad66996b013141Jim Miller return mCameraDisabled 31251117262c8fadb6d227d137e83ad66996b013141Jim Miller || (mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0; 31351117262c8fadb6d227d137e83ad66996b013141Jim Miller } 31451117262c8fadb6d227d137e83ad66996b013141Jim Miller 315e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void updateSecurityViews() { 316e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller int children = mSecurityViewContainer.getChildCount(); 317e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller for (int i = 0; i < children; i++) { 318e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityView(mSecurityViewContainer.getChildAt(i)); 319e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 320e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 321dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 322e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void updateSecurityView(View view) { 323e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (view instanceof KeyguardSecurityView) { 324e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView ksv = (KeyguardSecurityView) view; 325e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller ksv.setKeyguardCallback(mCallback); 326e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller ksv.setLockPatternUtils(mLockPatternUtils); 327c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren if (mViewStateManager.isBouncing()) { 328c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren ksv.showBouncer(0); 329c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } else { 330c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren ksv.hideBouncer(0); 331c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 332e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } else { 333e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller Log.w(TAG, "View " + view + " is not a KeyguardSecurityView"); 334dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 335dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 336dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 337dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller void setLockPatternUtils(LockPatternUtils utils) { 338dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSecurityModel.setLockPatternUtils(utils); 339dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternUtils = utils; 340e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityViews(); 341dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 342dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 343dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 344dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onAttachedToWindow() { 345dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onAttachedToWindow(); 346dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mAppWidgetHost.startListening(); 347efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallbacks); 3487221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller } 3497221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller 350dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 351dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onDetachedFromWindow() { 352dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onDetachedFromWindow(); 353dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mAppWidgetHost.stopListening(); 354efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallbacks); 355dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 356dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 357f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller private AppWidgetHost getAppWidgetHost() { 358dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mAppWidgetHost; 359dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 360dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 361d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller void addWidget(AppWidgetHostView view, int pageIndex) { 362d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.addWidget(view, pageIndex); 363dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 364dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 365838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller private KeyguardWidgetPager.Callbacks mWidgetCallbacks 366838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller = new KeyguardWidgetPager.Callbacks() { 367c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 368c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public void userActivity() { 36908c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen KeyguardHostView.this.userActivity(); 370c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 371c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 372c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 373c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public void onUserActivityTimeoutChanged() { 37408c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen KeyguardHostView.this.onUserActivityTimeoutChanged(); 375c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 376eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka 377eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka @Override 37840f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung public void onAddView(View v) { 379fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka if (!shouldEnableAddWidget()) { 3804752e7d1a9ff83d946890b0020de091f4346a7aeWinson Chung mAppWidgetContainer.setAddWidgetEnabled(false); 38140f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung } 3824752e7d1a9ff83d946890b0020de091f4346a7aeWinson Chung } 38340f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung 38440f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung @Override 38575b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka public void onRemoveView(View v, boolean deletePermanently) { 38675b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka if (deletePermanently) { 38775b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka final int appWidgetId = ((KeyguardWidgetFrame) v).getContentAppWidgetId(); 38875b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID && 38975b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka appWidgetId != LockPatternUtils.ID_DEFAULT_STATUS_WIDGET) { 39075b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka mAppWidgetHost.deleteAppWidgetId(appWidgetId); 39175b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka } 39275b5cfb4a41030333820d072578a288d4ec9899cMichael Jurka } 393eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 3944752e7d1a9ff83d946890b0020de091f4346a7aeWinson Chung 3954752e7d1a9ff83d946890b0020de091f4346a7aeWinson Chung @Override 3964752e7d1a9ff83d946890b0020de091f4346a7aeWinson Chung public void onRemoveViewAnimationCompleted() { 397fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka if (shouldEnableAddWidget()) { 3984752e7d1a9ff83d946890b0020de091f4346a7aeWinson Chung mAppWidgetContainer.setAddWidgetEnabled(true); 3994752e7d1a9ff83d946890b0020de091f4346a7aeWinson Chung } 4004752e7d1a9ff83d946890b0020de091f4346a7aeWinson Chung } 401c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown }; 402c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 40308c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen public void userActivity() { 40408c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen if (mViewMediatorCallback != null) { 40508c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen mViewMediatorCallback.userActivity(); 40608c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen } 40708c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen } 40808c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen 40908c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen public void onUserActivityTimeoutChanged() { 41008c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen if (mViewMediatorCallback != null) { 41108c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen mViewMediatorCallback.onUserActivityTimeoutChanged(); 41208c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen } 41308c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen } 41408c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen 415c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 416c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public long getUserActivityTimeout() { 417c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown // Currently only considering user activity timeouts needed by widgets. 418c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown // Could also take into account longer timeouts for certain security views. 419838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller if (mAppWidgetContainer != null) { 420838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller return mAppWidgetContainer.getUserActivityTimeout(); 421c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 422c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown return -1; 423c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 424c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 425dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardSecurityCallback mCallback = new KeyguardSecurityCallback() { 426dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 427dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void userActivity(long timeout) { 4287def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 4293dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mViewMediatorCallback.userActivity(timeout); 4307def1db03943251fe8cb57ec514722026425479eCraig Mautner } 431dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 432dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 433dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void dismiss(boolean authenticated) { 434dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller showNextSecurityScreenOrFinish(authenticated); 435dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 436dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 437dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean isVerifyUnlockOnly() { 438258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller return mIsVerifyUnlockOnly; 439dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 440dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 441dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reportSuccessfulUnlockAttempt() { 442258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller KeyguardUpdateMonitor.getInstance(mContext).clearFailedUnlockAttempts(); 4437641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller mLockPatternUtils.reportSuccessfulPasswordAttempt(); 444dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 445dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 446dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reportFailedUnlockAttempt() { 4477641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller if (mCurrentSecuritySelection == SecurityMode.Biometric) { 4487641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller KeyguardUpdateMonitor.getInstance(mContext).reportFailedBiometricUnlockAttempt(); 4497641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller } else { 4507641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller KeyguardHostView.this.reportFailedUnlockAttempt(); 4517641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller } 452dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 453dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 454dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public int getFailedAttempts() { 455258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller return KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(); 456dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 457dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 458258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller @Override 459258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller public void showBackupSecurity() { 4600ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardHostView.this.showBackupSecurityScreen(); 461dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 462dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 4635f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller @Override 46434c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock public void setOnDismissAction(OnDismissAction action) { 46534c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock KeyguardHostView.this.setOnDismissAction(action); 4665f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 4675f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller 468dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 469dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 470258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showDialog(String title, String message) { 471258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final AlertDialog dialog = new AlertDialog.Builder(mContext) 472258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setTitle(title) 473258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setMessage(message) 474258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setNeutralButton(com.android.internal.R.string.ok, null) 475258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .create(); 476258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (!(mContext instanceof Activity)) { 477258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 478258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 479258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller dialog.show(); 480258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 481258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 482258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showTimeoutDialog() { 483258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 484258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int messageId = 0; 485258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 486258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller switch (mSecurityModel.getSecurityMode()) { 487258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller case Pattern: 488258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller messageId = R.string.kg_too_many_failed_pattern_attempts_dialog_message; 489258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller break; 49069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 49169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler messageId = R.string.kg_too_many_failed_pin_attempts_dialog_message; 49269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler break; 49369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case Password: 49469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler messageId = R.string.kg_too_many_failed_password_attempts_dialog_message; 495258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller break; 496258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 497258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 498258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (messageId != 0) { 499258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final String message = mContext.getString(messageId, 500258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(), 501258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller timeoutInSeconds); 502258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 503258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 504258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 505258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 506258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showAlmostAtWipeDialog(int attempts, int remaining) { 507258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 508258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_almost_at_wipe, 509258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller attempts, remaining); 510258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 511258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 512258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 513258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showWipeDialog(int attempts) { 514258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_now_wiping, attempts); 515258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 516258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 517258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 518258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showAlmostAtAccountLoginDialog() { 519258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 520258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int count = LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET 521258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller - LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT; 522258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_almost_at_login, 523258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller count, LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT, timeoutInSeconds); 524258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 525258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 526258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 527258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void reportFailedUnlockAttempt() { 528258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 529258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttempts = monitor.getFailedUnlockAttempts() + 1; // +1 for this time 530258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 531258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (DEBUG) Log.d(TAG, "reportFailedPatternAttempt: #" + failedAttempts); 532258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 533258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller SecurityMode mode = mSecurityModel.getSecurityMode(); 534258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final boolean usingPattern = mode == KeyguardSecurityModel.SecurityMode.Pattern; 535258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 536258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttemptsBeforeWipe = mLockPatternUtils.getDevicePolicyManager() 537599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani .getMaximumFailedPasswordsForWipe(null, mLockPatternUtils.getCurrentUser()); 538258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 539258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttemptWarning = LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET 540258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller - LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT; 541258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 542258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int remainingBeforeWipe = failedAttemptsBeforeWipe > 0 ? 543258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller (failedAttemptsBeforeWipe - failedAttempts) 544258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller : Integer.MAX_VALUE; // because DPM returns 0 if no restriction 545258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 54608b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller boolean showTimeout = false; 547258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (remainingBeforeWipe < LockPatternUtils.FAILED_ATTEMPTS_BEFORE_WIPE_GRACE) { 548258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // If we reach this code, it means the user has installed a DevicePolicyManager 549258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // that requests device wipe after N attempts. Once we get below the grace 550258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // period, we'll post this dialog every time as a clear warning until the 551258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // bombshell hits and the device is wiped. 552258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (remainingBeforeWipe > 0) { 553258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showAlmostAtWipeDialog(failedAttempts, remainingBeforeWipe); 554258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else { 555258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // Too many attempts. The device will be wiped shortly. 556258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller Slog.i(TAG, "Too many unlock attempts; device will be wiped!"); 557258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showWipeDialog(failedAttempts); 558258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 559258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else { 56008b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller showTimeout = 561258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller (failedAttempts % LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) == 0; 562258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (usingPattern && mEnableFallback) { 563258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (failedAttempts == failedAttemptWarning) { 564258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showAlmostAtAccountLoginDialog(); 565258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showTimeout = false; // don't show both dialogs 566258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else if (failedAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET) { 567258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mLockPatternUtils.setPermanentlyLocked(true); 568e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(SecurityMode.Account); 569258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // don't show timeout dialog because we show account unlock screen next 570258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showTimeout = false; 571258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 572258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 573258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 574258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller monitor.reportFailedUnlockAttempt(); 575258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mLockPatternUtils.reportFailedPasswordAttempt(); 57608b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller if (showTimeout) { 57708b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller showTimeoutDialog(); 57808b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller } 579258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 580258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 581258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller /** 5820ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * Shows the primary security screen for the user. This will be either the multi-selector 5830ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * or the user's security method. 5840ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * @param turningOff true if the device is being turned off 5850ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller */ 5860ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller void showPrimarySecurityScreen(boolean turningOff) { 5870ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 5880ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")"); 589078f5919a9584cc3f1c7eb3a78862bfa40396de9Brian Colonna if (!turningOff && 590078f5919a9584cc3f1c7eb3a78862bfa40396de9Brian Colonna KeyguardUpdateMonitor.getInstance(mContext).isAlternateUnlockEnabled()) { 5910ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // If we're not turning off, then allow biometric alternate. 5920ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // We'll reload it when the device comes back on. 5930ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller securityMode = mSecurityModel.getAlternateFor(securityMode); 5940ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 5950ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showSecurityScreen(securityMode); 5960ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 59768c2489457631f733f542e14058c6d1274c203deJim Miller 5980ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller /** 599258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * Shows the backup security screen for the current security mode. This could be used for 600258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * password recovery screens but is currently only used for pattern unlock to show the 601258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * account unlock screen and biometric unlock to show the user's normal unlock. 602258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller */ 6030ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller private void showBackupSecurityScreen() { 60461413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett if (DEBUG) Log.d(TAG, "showBackupSecurity()"); 60563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller SecurityMode backup = mSecurityModel.getBackupSecurityMode(mCurrentSecuritySelection); 60663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller showSecurityScreen(backup); 607258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 608258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 6090a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen public boolean showNextSecurityScreenIfPresent() { 6100a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen SecurityMode securityMode = mSecurityModel.getSecurityMode(); 6110a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen // Allow an alternate, such as biometric unlock 6120a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen securityMode = mSecurityModel.getAlternateFor(securityMode); 6130a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen if (SecurityMode.None == securityMode) { 6140a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen return false; 6150a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } else { 6160a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen showSecurityScreen(securityMode); // switch to the alternate security view 6170a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen return true; 6180a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 6190a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 6200a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 621258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showNextSecurityScreenOrFinish(boolean authenticated) { 62261413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")"); 623dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller boolean finish = false; 624e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (SecurityMode.None == mCurrentSecuritySelection) { 625258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 626258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // Allow an alternate, such as biometric unlock 627000464ac012471d301c6e48a8228291519915e17Jim Miller securityMode = mSecurityModel.getAlternateFor(securityMode); 628e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (SecurityMode.None == securityMode) { 629dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller finish = true; // no security required 630dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 631e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); // switch to the alternate security view 632dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 633dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else if (authenticated) { 634e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller switch (mCurrentSecuritySelection) { 635e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: 636e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: 63769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 638e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: 639e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: 6404b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller finish = true; 6414b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 6424b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 643e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: 644e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: 6454b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home 6464b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 6474b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (securityMode != SecurityMode.None) { 648e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); 6494b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 6504b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller finish = true; 6514b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 6524b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 6534b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 6544b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller default: 6550ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller Log.v(TAG, "Bad security screen " + mCurrentSecuritySelection + ", fail safe"); 6560ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 6574b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 658dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 659dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 6600ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 661dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 662dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (finish) { 6630ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // If the alternate unlock was suppressed, it can now be safely 6640ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // enabled because the user has left keyguard. 6650ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); 66668c2489457631f733f542e14058c6d1274c203deJim Miller 667dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // If there's a pending runnable because the user interacted with a widget 668dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // and we're leaving keyguard, then run it. 66934c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock boolean deferKeyguardDone = false; 67034c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock if (mDismissAction != null) { 67134c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock deferKeyguardDone = mDismissAction.onDismiss(); 67234c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock mDismissAction = null; 673dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 6747def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 67534c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock if (deferKeyguardDone) { 67634c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock mViewMediatorCallback.keyguardDonePending(); 67734c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } else { 67834c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock mViewMediatorCallback.keyguardDone(true); 67934c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } 6807def1db03943251fe8cb57ec514722026425479eCraig Mautner } 681b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller } else { 682b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller mViewStateManager.showBouncer(true); 683dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 684dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 685dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 686dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private OnClickHandler mOnClickHandler = new OnClickHandler() { 687dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 688dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean onClickHandler(final View view, 689dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final android.app.PendingIntent pendingIntent, 690dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final Intent fillInIntent) { 691dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (pendingIntent.isActivity()) { 69234c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock setOnDismissAction(new OnDismissAction() { 69334c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock public boolean onDismiss() { 694dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 695dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? 696dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Context context = view.getContext(); 697dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, 698dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 0, 0, 699dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller view.getMeasuredWidth(), view.getMeasuredHeight()); 700dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller context.startIntentSender( 701dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller pendingIntent.getIntentSender(), fillInIntent, 702dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent.FLAG_ACTIVITY_NEW_TASK, 703dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle()); 70434c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } catch (IntentSender.SendIntentException e) { 70534c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock android.util.Log.e(TAG, "Cannot send pending intent: ", e); 70634c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } catch (Exception e) { 70734c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock android.util.Log.e(TAG, "Cannot send pending intent due to " + 70834c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock "unknown exception: ", e); 70934c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } 71034c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock return false; 711dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 7125f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller }); 713dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 71408898375fba7cc776857ebf0846c7183563a300fJim Miller if (mViewStateManager.isChallengeShowing()) { 71508898375fba7cc776857ebf0846c7183563a300fJim Miller mViewStateManager.showBouncer(true); 71608898375fba7cc776857ebf0846c7183563a300fJim Miller } else { 71708898375fba7cc776857ebf0846c7183563a300fJim Miller mCallback.dismiss(false); 71808898375fba7cc776857ebf0846c7183563a300fJim Miller } 719dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return true; 720dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 721dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return super.onClickHandler(view, pendingIntent, fillInIntent); 722dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 723dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 724dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 725dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 72663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller // Used to ignore callbacks from methods that are no longer current (e.g. face unlock). 72763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller // This avoids unwanted asynchronous events from messing with the state. 72863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() { 72963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 73063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 73163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void userActivity(long timeout) { 73263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 73363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 73463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 73563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void showBackupSecurity() { 73663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 73763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 73863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 73934c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock public void setOnDismissAction(OnDismissAction action) { 74063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 74163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 74263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 74363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void reportSuccessfulUnlockAttempt() { 74463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 74563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 74663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 74763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void reportFailedUnlockAttempt() { 74863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 74963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 75063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 75163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public boolean isVerifyUnlockOnly() { 75263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return false; 75363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 75463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 75563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 75663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public int getFailedAttempts() { 75763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return 0; 75863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 75963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 76063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 76163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void dismiss(boolean securityVerified) { 76263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 76363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller }; 76463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 765aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller protected boolean mShowSecurityWhenReturn; 766aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller 767dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 768dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reset() { 769258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mIsVerifyUnlockOnly = false; 770ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_status_view)); 771dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 772dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 7735f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller /** 77434c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock * Sets an action to perform when keyguard is dismissed. 77534c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock * @param action 7765f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller */ 77734c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock protected void setOnDismissAction(OnDismissAction action) { 77834c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock mDismissAction = action; 7795f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 7805f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller 781e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private KeyguardSecurityView getSecurityView(SecurityMode securityMode) { 782e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 783e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView view = null; 784e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int children = mSecurityViewContainer.getChildCount(); 785dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller for (int child = 0; child < children; child++) { 786e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (mSecurityViewContainer.getChildAt(child).getId() == securityViewIdForMode) { 787e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller view = ((KeyguardSecurityView)mSecurityViewContainer.getChildAt(child)); 788e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller break; 789dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 790dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 79163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller int layoutId = getLayoutIdFor(securityMode); 79263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller if (view == null && layoutId != 0) { 793e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final LayoutInflater inflater = LayoutInflater.from(mContext); 794bdffd5c3a18e67443ebbd16d4f0349d0728285b1Jim Miller if (DEBUG) Log.v(TAG, "inflating id = " + layoutId); 7959799714f6c69efe50e21a6073b879140e5e792b7Adam Powell View v = inflater.inflate(layoutId, mSecurityViewContainer, false); 796e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mSecurityViewContainer.addView(v); 797e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityView(v); 7980b728244dc87b4a453f2191c2cb37a86e91aee0aJim Miller view = (KeyguardSecurityView)v; 7990ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 8000ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 8010ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (view instanceof KeyguardSelectorView) { 8020ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardSelectorView selectorView = (KeyguardSelectorView) view; 8030ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller View carrierText = selectorView.findViewById(R.id.keyguard_selector_fade_container); 8040ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller selectorView.setCarrierArea(carrierText); 8050ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 80668c2489457631f733f542e14058c6d1274c203deJim Miller 807e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller return view; 808dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 809dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 810258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller /** 811258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * Switches to the given security view unless it's already being shown, in which case 812258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * this is a no-op. 813258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * 814e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller * @param securityMode 815258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller */ 816e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void showSecurityScreen(SecurityMode securityMode) { 81768c2489457631f733f542e14058c6d1274c203deJim Miller if (DEBUG) Log.d(TAG, "showSecurityScreen(" + securityMode + ")"); 81868c2489457631f733f542e14058c6d1274c203deJim Miller 819e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (securityMode == mCurrentSecuritySelection) return; 820dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 821e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView oldView = getSecurityView(mCurrentSecuritySelection); 822e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView newView = getSecurityView(securityMode); 823dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 824a71984f3da47c6e6e3164c170735362a3222d3adJim Miller // Enter full screen mode if we're in SIM or Account screen 825a71984f3da47c6e6e3164c170735362a3222d3adJim Miller boolean fullScreenEnabled = getResources().getBoolean( 826a71984f3da47c6e6e3164c170735362a3222d3adJim Miller com.android.internal.R.bool.kg_sim_puk_account_full_screen); 827a71984f3da47c6e6e3164c170735362a3222d3adJim Miller boolean isSimOrAccount = securityMode == SecurityMode.SimPin 828a71984f3da47c6e6e3164c170735362a3222d3adJim Miller || securityMode == SecurityMode.SimPuk 829a71984f3da47c6e6e3164c170735362a3222d3adJim Miller || securityMode == SecurityMode.Account; 830a71984f3da47c6e6e3164c170735362a3222d3adJim Miller mAppWidgetContainer.setVisibility( 831a71984f3da47c6e6e3164c170735362a3222d3adJim Miller isSimOrAccount && fullScreenEnabled ? View.GONE : View.VISIBLE); 832a71984f3da47c6e6e3164c170735362a3222d3adJim Miller 8332cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller if (mSlidingChallengeLayout != null) { 8342cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller mSlidingChallengeLayout.setChallengeInteractive(!fullScreenEnabled); 8352cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller } 8362cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller 837dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Emulate Activity life cycle 83863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller if (oldView != null) { 83963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller oldView.onPause(); 84063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view 84163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 842a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren newView.onResume(KeyguardSecurityView.VIEW_REVEALED); 84363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller newView.setKeyguardCallback(mCallback); 844dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 845cd03a26f4f5663b40d4679de102519ccc163fa10Craig Mautner final boolean needsInput = newView.needsInput(); 8467def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 847cd03a26f4f5663b40d4679de102519ccc163fa10Craig Mautner mViewMediatorCallback.setNeedsInput(needsInput); 8487def1db03943251fe8cb57ec514722026425479eCraig Mautner } 849dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 850dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Find and show this child. 851e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int childCount = mSecurityViewContainer.getChildCount(); 8524b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 85322ae05d50c7011b389a5dba7a2f717e407328bf8Jim Miller mSecurityViewContainer.setInAnimation( 85422ae05d50c7011b389a5dba7a2f717e407328bf8Jim Miller AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_fade_in)); 85522ae05d50c7011b389a5dba7a2f717e407328bf8Jim Miller mSecurityViewContainer.setOutAnimation( 85622ae05d50c7011b389a5dba7a2f717e407328bf8Jim Miller AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_fade_out)); 857e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 858dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller for (int i = 0; i < childCount; i++) { 859e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (mSecurityViewContainer.getChildAt(i).getId() == securityViewIdForMode) { 860e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mSecurityViewContainer.setDisplayedChild(i); 861dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller break; 862dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 863dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 864258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 865e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (securityMode == SecurityMode.None) { 866e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // Discard current runnable if we're switching back to the selector view 86734c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock setOnDismissAction(null); 86868c2489457631f733f542e14058c6d1274c203deJim Miller } 869e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mCurrentSecuritySelection = securityMode; 870dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 871dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 872dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 873dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onScreenTurnedOn() { 874358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock if (DEBUG) Log.d(TAG, "screen on, instance " + Integer.toHexString(hashCode())); 8750ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 876a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren getSecurityView(mCurrentSecuritySelection).onResume(KeyguardSecurityView.SCREEN_ON); 877d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller 878d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // This is a an attempt to fix bug 7137389 where the device comes back on but the entire 879d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // layout is blank but forcing a layout causes it to reappear (e.g. with with 880d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // hierarchyviewer). 881d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller requestLayout(); 8826fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 8836fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen if (mViewStateManager != null) { 8846fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mViewStateManager.showUsabilityHints(); 8856fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 886147f9568afe645d9bfb91f3037f5336d8a2482ccJim Miller requestFocus(); 887dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 888dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 889dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 890dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onScreenTurnedOff() { 891dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock if (DEBUG) Log.d(TAG, String.format("screen off, instance %s at %s", 892dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock Integer.toHexString(hashCode()), SystemClock.uptimeMillis())); 893078f5919a9584cc3f1c7eb3a78862bfa40396de9Brian Colonna // Once the screen turns off, we no longer consider this to be first boot and we want the 894078f5919a9584cc3f1c7eb3a78862bfa40396de9Brian Colonna // biometric unlock to start next time keyguard is shown. 895078f5919a9584cc3f1c7eb3a78862bfa40396de9Brian Colonna KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); 8961413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka // We use mAppWidgetToShow to show a particular widget after you add it-- once the screen 8971413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka // turns off we reset that behavior 8981413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka clearAppWidgetToShow(); 89967a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka checkAppWidgetConsistency(); 9000ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(true); 901e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller getSecurityView(mCurrentSecuritySelection).onPause(); 902dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock CameraWidgetFrame cameraPage = findCameraPage(); 903dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock if (cameraPage != null) { 904dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock cameraPage.onScreenTurnedOff(); 905dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock } 906147f9568afe645d9bfb91f3037f5336d8a2482ccJim Miller clearFocus(); 907dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 908dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 9091413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka public void clearAppWidgetToShow() { 9101413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka mAppWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID; 9111413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka } 9121413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka 913dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 914dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void show() { 915086977094d96ab9352432e0941a05b09cefc92acJim Miller if (DEBUG) Log.d(TAG, "show()"); 916086977094d96ab9352432e0941a05b09cefc92acJim Miller showPrimarySecurityScreen(false); 917dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 918dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 919dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private boolean isSecure() { 920dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller SecurityMode mode = mSecurityModel.getSecurityMode(); 921dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller switch (mode) { 922dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Pattern: 923dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mLockPatternUtils.isLockPatternEnabled(); 924dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Password: 92569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 926dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mLockPatternUtils.isLockPasswordEnabled(); 927dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case SimPin: 928dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case SimPuk: 929dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Account: 930dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return true; 931dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case None: 932dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return false; 933dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller default: 934dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller throw new IllegalStateException("Unknown security mode " + mode); 935dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 936dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 937dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 938dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 939dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void wakeWhenReadyTq(int keyCode) { 940dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "onWakeKey"); 941dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (keyCode == KeyEvent.KEYCODE_MENU && isSecure()) { 942dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "switching screens to unlock screen because wake key was MENU"); 943e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(SecurityMode.None); 944dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 945dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "poking wake lock immediately"); 9467def1db03943251fe8cb57ec514722026425479eCraig Mautner } 9477def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 9483dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mViewMediatorCallback.wakeUp(); 949dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 950dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 951dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 952dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 953dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void verifyUnlock() { 954dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 955dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (securityMode == KeyguardSecurityModel.SecurityMode.None) { 9567def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 9577def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDone(true); 9587def1db03943251fe8cb57ec514722026425479eCraig Mautner } 959dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else if (securityMode != KeyguardSecurityModel.SecurityMode.Pattern 96069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler && securityMode != KeyguardSecurityModel.SecurityMode.PIN 961dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller && securityMode != KeyguardSecurityModel.SecurityMode.Password) { 962dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // can only verify unlock when in pattern/password mode 9637def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 9647def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDone(false); 9657def1db03943251fe8cb57ec514722026425479eCraig Mautner } 966dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 967dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // otherwise, go to the unlock screen, see if they can verify it 968dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mIsVerifyUnlockOnly = true; 969e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); 970dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 971dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 972dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 973dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private int getSecurityViewIdForMode(SecurityMode securityMode) { 974dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller switch (securityMode) { 975e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case None: return R.id.keyguard_selector_view; 976e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: return R.id.keyguard_pattern_view; 97769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: return R.id.keyguard_pin_view; 978e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: return R.id.keyguard_password_view; 979e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: return R.id.keyguard_face_unlock_view; 980e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: return R.id.keyguard_account_view; 981e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: return R.id.keyguard_sim_pin_view; 982e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: return R.id.keyguard_sim_puk_view; 983dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 984dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return 0; 985dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 986dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 987e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private int getLayoutIdFor(SecurityMode securityMode) { 988e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller switch (securityMode) { 989e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case None: return R.layout.keyguard_selector_view; 990e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: return R.layout.keyguard_pattern_view; 99169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: return R.layout.keyguard_pin_view; 992e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: return R.layout.keyguard_password_view; 993e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: return R.layout.keyguard_face_unlock_view; 994e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: return R.layout.keyguard_account_view; 995e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: return R.layout.keyguard_sim_pin_view; 996e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: return R.layout.keyguard_sim_puk_view; 997e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller default: 99863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return 0; 999e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 1000e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 1001e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller 100251117262c8fadb6d227d137e83ad66996b013141Jim Miller private boolean addWidget(int appId, int pageIndex, boolean updateDbIfFailed) { 100367a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appId); 100499a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller if (appWidgetInfo != null) { 100599a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller AppWidgetHostView view = getAppWidgetHost().createView(mContext, appId, appWidgetInfo); 1006d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller addWidget(view, pageIndex); 100767a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka return true; 100899a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller } else { 100951117262c8fadb6d227d137e83ad66996b013141Jim Miller if (updateDbIfFailed) { 101051117262c8fadb6d227d137e83ad66996b013141Jim Miller Log.w(TAG, "AppWidgetInfo for app widget id " + appId + " was null, deleting"); 101151117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetHost.deleteAppWidgetId(appId); 101251117262c8fadb6d227d137e83ad66996b013141Jim Miller mLockPatternUtils.removeAppWidget(appId); 101351117262c8fadb6d227d137e83ad66996b013141Jim Miller } 101467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka return false; 101599a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller } 1016dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1017dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1018dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock private final CameraWidgetFrame.Callbacks mCameraWidgetCallbacks = 1019dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock new CameraWidgetFrame.Callbacks() { 1020dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 1021dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock public void onLaunchingCamera() { 102257f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock setSliderHandleAlpha(0); 1023dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 1024dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 1025dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 102657f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock public void onCameraLaunchedSuccessfully() { 10276cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung if (mAppWidgetContainer.isCameraPage(mAppWidgetContainer.getCurrentPage())) { 10284b976ea1af04f8c340ef7e0d79f73d7cdb5eb72eJohn Spurlock mAppWidgetContainer.scrollLeft(); 10294b976ea1af04f8c340ef7e0d79f73d7cdb5eb72eJohn Spurlock } 103057f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock setSliderHandleAlpha(1); 1031aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller mShowSecurityWhenReturn = true; 1032dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 1033dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 103457f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock @Override 103557f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock public void onCameraLaunchedUnsuccessfully() { 103657f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock setSliderHandleAlpha(1); 103757f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock } 103857f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock 103957f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock private void setSliderHandleAlpha(float alpha) { 104057f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock SlidingChallengeLayout slider = 104157f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock (SlidingChallengeLayout) findViewById(R.id.sliding_layout); 104257f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock if (slider != null) { 104357f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock slider.setHandleAlpha(alpha); 104457f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock } 1045dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 1046dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock }; 1047dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 1048dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() { 1049dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 1050dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock Context getContext() { 1051dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mContext; 1052dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 1053dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 1054dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 1055dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock KeyguardSecurityCallback getCallback() { 1056dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mCallback; 1057dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 1058dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 1059dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 1060dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock LockPatternUtils getLockPatternUtils() { 1061dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mLockPatternUtils; 1062bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 1063bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller }; 1064dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 1065eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka private int numWidgets() { 1066eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka final int childCount = mAppWidgetContainer.getChildCount(); 1067eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka int widgetCount = 0; 1068eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka for (int i = 0; i < childCount; i++) { 1069eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka if (mAppWidgetContainer.isWidgetPage(i)) { 1070eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka widgetCount++; 1071eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 1072eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 1073eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka return widgetCount; 1074eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 1075eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka 10764e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller private void addDefaultWidgets() { 10774e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller LayoutInflater inflater = LayoutInflater.from(mContext); 1078223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller inflater.inflate(R.layout.keyguard_transport_control_view, this, true); 10794e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 108051117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!mSafeModeEnabled && !widgetsDisabledByDpm()) { 108151117262c8fadb6d227d137e83ad66996b013141Jim Miller View addWidget = inflater.inflate(R.layout.keyguard_add_widget, this, false); 1082eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka mAppWidgetContainer.addWidget(addWidget, 0); 108351117262c8fadb6d227d137e83ad66996b013141Jim Miller View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view); 108451117262c8fadb6d227d137e83ad66996b013141Jim Miller addWidgetButton.setOnClickListener(new OnClickListener() { 108551117262c8fadb6d227d137e83ad66996b013141Jim Miller @Override 108651117262c8fadb6d227d137e83ad66996b013141Jim Miller public void onClick(View v) { 1087192d6d4ee271c0782a3bf5d8c64e42eb22d1a6faMichael Jurka // Pass in an invalid widget id... the picker will allocate an ID for us 1088192d6d4ee271c0782a3bf5d8c64e42eb22d1a6faMichael Jurka mActivityLauncher.launchWidgetPicker(AppWidgetManager.INVALID_APPWIDGET_ID); 108951117262c8fadb6d227d137e83ad66996b013141Jim Miller } 109051117262c8fadb6d227d137e83ad66996b013141Jim Miller }); 109151117262c8fadb6d227d137e83ad66996b013141Jim Miller } 109251117262c8fadb6d227d137e83ad66996b013141Jim Miller 109351117262c8fadb6d227d137e83ad66996b013141Jim Miller // We currently disable cameras in safe mode because we support loading 3rd party 109451117262c8fadb6d227d137e83ad66996b013141Jim Miller // cameras we can't trust. TODO: plumb safe mode into camera creation code and only 109551117262c8fadb6d227d137e83ad66996b013141Jim Miller // inflate system-provided camera? 1096371f3408d6d9c3c3781d6e35e591f61026b42240John Spurlock if (!mSafeModeEnabled && !cameraDisabledByDpm() && mUserSetupCompleted 109751117262c8fadb6d227d137e83ad66996b013141Jim Miller && mContext.getResources().getBoolean(R.bool.kg_enable_camera_default_widget)) { 1098dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock View cameraWidget = 1099dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock CameraWidgetFrame.create(mContext, mCameraWidgetCallbacks, mActivityLauncher); 1100dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock if (cameraWidget != null) { 1101dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock mAppWidgetContainer.addWidget(cameraWidget); 1102dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 110386b6357e5eb91950eac7de7ffe29e5a4ad32903bJohn Spurlock } 1104838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 110519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller enableUserSelectorIfNecessary(); 11067221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller initializeTransportControl(); 11077221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller } 11087221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller 110976017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka private boolean removeTransportFromWidgetPager() { 1110bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller int page = getWidgetPosition(R.id.keyguard_transport_control); 1111bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller if (page != -1) { 1112bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller mAppWidgetContainer.removeWidget(mTransportControl); 1113bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller 1114bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller // XXX keep view attached so we still get show/hide events from AudioManager 1115bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller KeyguardHostView.this.addView(mTransportControl); 1116bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller mTransportControl.setVisibility(View.GONE); 1117e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller mViewStateManager.setTransportState(KeyguardViewStateManager.TRANSPORT_GONE); 111876017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka return true; 1119bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 112076017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka return false; 1121bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 1122bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller 1123bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller private void addTransportToWidgetPager() { 1124bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller if (getWidgetPosition(R.id.keyguard_transport_control) == -1) { 1125bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller KeyguardHostView.this.removeView(mTransportControl); 1126bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller // insert to left of camera if it exists, otherwise after right-most widget 1127bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller int lastWidget = mAppWidgetContainer.getChildCount() - 1; 1128bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller int position = 0; // handle no widget case 1129bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller if (lastWidget >= 0) { 11306cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung position = mAppWidgetContainer.isCameraPage(lastWidget) ? 11316cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung lastWidget : lastWidget + 1; 1132bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 1133bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller mAppWidgetContainer.addWidget(mTransportControl, position); 1134bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller mTransportControl.setVisibility(View.VISIBLE); 1135bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 1136bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 1137bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller 11387221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller private void initializeTransportControl() { 11394e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl = 11404e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller (KeyguardTransportControlView) findViewById(R.id.keyguard_transport_control); 1141223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportControl.setVisibility(View.GONE); 11424e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 11434e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller // This code manages showing/hiding the transport control. We keep it around and only 11444e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller // add it to the hierarchy if it needs to be present. 11454e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller if (mTransportControl != null) { 11464e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl.setKeyguardCallback(new TransportCallback() { 11474e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller @Override 1148223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onListenerDetached() { 114976017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka if (removeTransportFromWidgetPager()) { 115076017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka mTransportControl.post(mSwitchPageRunnable); 115176017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka } 11524e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 11534e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 11544e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller @Override 1155223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onListenerAttached() { 1156bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller // Transport will be added when playstate changes... 1157bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller mTransportControl.post(mSwitchPageRunnable); 11584e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 1159223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1160223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1161223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onPlayStateChanged() { 1162223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportControl.post(mSwitchPageRunnable); 1163223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 11644e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller }); 11654e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 11664e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 11674e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 116851117262c8fadb6d227d137e83ad66996b013141Jim Miller private int getInsertPageIndex() { 116967a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget); 117051117262c8fadb6d227d137e83ad66996b013141Jim Miller int insertionIndex = mAppWidgetContainer.indexOfChild(addWidget); 117151117262c8fadb6d227d137e83ad66996b013141Jim Miller if (insertionIndex < 0) { 117251117262c8fadb6d227d137e83ad66996b013141Jim Miller insertionIndex = 0; // no add widget page found 117351117262c8fadb6d227d137e83ad66996b013141Jim Miller } else { 117451117262c8fadb6d227d137e83ad66996b013141Jim Miller insertionIndex++; // place after add widget 117567a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 117651117262c8fadb6d227d137e83ad66996b013141Jim Miller return insertionIndex; 117767a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 117867a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka 117967a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka private void addDefaultStatusWidget(int index) { 118067a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka LayoutInflater inflater = LayoutInflater.from(mContext); 118167a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true); 118267a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka mAppWidgetContainer.addWidget(statusWidget, index); 118367a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 118467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka 11851254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka private void addWidgetsFromSettings() { 118651117262c8fadb6d227d137e83ad66996b013141Jim Miller if (mSafeModeEnabled || widgetsDisabledByDpm()) { 118751117262c8fadb6d227d137e83ad66996b013141Jim Miller return; 1188b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } 1189f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller 119051117262c8fadb6d227d137e83ad66996b013141Jim Miller int insertionIndex = getInsertPageIndex(); 119120c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka 119220c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka // Add user-selected widget 1193aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka final int[] widgets = mLockPatternUtils.getAppWidgets(); 119467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka 1195aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka if (widgets == null) { 1196aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka Log.d(TAG, "Problem reading widgets"); 1197aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka } else { 1198aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka for (int i = widgets.length -1; i >= 0; i--) { 11991254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka if (widgets[i] == LockPatternUtils.ID_DEFAULT_STATUS_WIDGET) { 120051117262c8fadb6d227d137e83ad66996b013141Jim Miller addDefaultStatusWidget(insertionIndex); 12011254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka } else { 1202aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // We add the widgets from left to right, starting after the first page after 1203aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // the add page. We count down, since the order will be persisted from right 1204aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // to left, starting after camera. 120551117262c8fadb6d227d137e83ad66996b013141Jim Miller addWidget(widgets[i], insertionIndex, true); 1206aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka } 1207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 120951117262c8fadb6d227d137e83ad66996b013141Jim Miller } 121051117262c8fadb6d227d137e83ad66996b013141Jim Miller 121151117262c8fadb6d227d137e83ad66996b013141Jim Miller private int allocateIdForDefaultAppWidget() { 121251117262c8fadb6d227d137e83ad66996b013141Jim Miller int appWidgetId; 121351117262c8fadb6d227d137e83ad66996b013141Jim Miller Resources res = getContext().getResources(); 121451117262c8fadb6d227d137e83ad66996b013141Jim Miller ComponentName defaultAppWidget = new ComponentName( 121551117262c8fadb6d227d137e83ad66996b013141Jim Miller res.getString(R.string.widget_default_package_name), 121651117262c8fadb6d227d137e83ad66996b013141Jim Miller res.getString(R.string.widget_default_class_name)); 121751117262c8fadb6d227d137e83ad66996b013141Jim Miller 121851117262c8fadb6d227d137e83ad66996b013141Jim Miller // Note: we don't support configuring the widget 121951117262c8fadb6d227d137e83ad66996b013141Jim Miller appWidgetId = mAppWidgetHost.allocateAppWidgetId(); 122051117262c8fadb6d227d137e83ad66996b013141Jim Miller 122151117262c8fadb6d227d137e83ad66996b013141Jim Miller try { 122251117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetManager.bindAppWidgetId(appWidgetId, defaultAppWidget); 122351117262c8fadb6d227d137e83ad66996b013141Jim Miller 122451117262c8fadb6d227d137e83ad66996b013141Jim Miller } catch (IllegalArgumentException e) { 122551117262c8fadb6d227d137e83ad66996b013141Jim Miller Log.e(TAG, "Error when trying to bind default AppWidget: " + e); 122651117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetHost.deleteAppWidgetId(appWidgetId); 122751117262c8fadb6d227d137e83ad66996b013141Jim Miller appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; 122851117262c8fadb6d227d137e83ad66996b013141Jim Miller } 122951117262c8fadb6d227d137e83ad66996b013141Jim Miller return appWidgetId; 123067a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 123167a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka public void checkAppWidgetConsistency() { 1232efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen // Since this method may bind a widget (which we can't do until boot completed) we 1233efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen // may have to defer it until after boot complete. 12344eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen if (!KeyguardUpdateMonitor.getInstance(mContext).hasBootCompleted()) { 1235efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen mCheckAppWidgetConsistencyOnBootCompleted = true; 1236efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen return; 1237efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen } 123867a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka final int childCount = mAppWidgetContainer.getChildCount(); 123967a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka boolean widgetPageExists = false; 124067a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka for (int i = 0; i < childCount; i++) { 124151117262c8fadb6d227d137e83ad66996b013141Jim Miller if (mAppWidgetContainer.isWidgetPage(i)) { 124267a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka widgetPageExists = true; 124367a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka break; 124467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 124567a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 124667a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka if (!widgetPageExists) { 124751117262c8fadb6d227d137e83ad66996b013141Jim Miller final int insertPageIndex = getInsertPageIndex(); 124851117262c8fadb6d227d137e83ad66996b013141Jim Miller 124951117262c8fadb6d227d137e83ad66996b013141Jim Miller final boolean userAddedWidgetsEnabled = !widgetsDisabledByDpm(); 125051117262c8fadb6d227d137e83ad66996b013141Jim Miller boolean addedDefaultAppWidget = false; 125151117262c8fadb6d227d137e83ad66996b013141Jim Miller 125251117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!mSafeModeEnabled) { 125351117262c8fadb6d227d137e83ad66996b013141Jim Miller if (userAddedWidgetsEnabled) { 125451117262c8fadb6d227d137e83ad66996b013141Jim Miller int appWidgetId = allocateIdForDefaultAppWidget(); 125551117262c8fadb6d227d137e83ad66996b013141Jim Miller if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 125651117262c8fadb6d227d137e83ad66996b013141Jim Miller addedDefaultAppWidget = addWidget(appWidgetId, insertPageIndex, true); 125751117262c8fadb6d227d137e83ad66996b013141Jim Miller } 125851117262c8fadb6d227d137e83ad66996b013141Jim Miller } else { 125951117262c8fadb6d227d137e83ad66996b013141Jim Miller // note: even if widgetsDisabledByDpm() returns true, we still bind/create 126051117262c8fadb6d227d137e83ad66996b013141Jim Miller // the default appwidget if possible 126151117262c8fadb6d227d137e83ad66996b013141Jim Miller int appWidgetId = mLockPatternUtils.getFallbackAppWidgetId(); 126251117262c8fadb6d227d137e83ad66996b013141Jim Miller if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { 126351117262c8fadb6d227d137e83ad66996b013141Jim Miller appWidgetId = allocateIdForDefaultAppWidget(); 126451117262c8fadb6d227d137e83ad66996b013141Jim Miller if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 126551117262c8fadb6d227d137e83ad66996b013141Jim Miller mLockPatternUtils.writeFallbackAppWidgetId(appWidgetId); 126651117262c8fadb6d227d137e83ad66996b013141Jim Miller } 126751117262c8fadb6d227d137e83ad66996b013141Jim Miller } 126851117262c8fadb6d227d137e83ad66996b013141Jim Miller if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 126951117262c8fadb6d227d137e83ad66996b013141Jim Miller addedDefaultAppWidget = addWidget(appWidgetId, insertPageIndex, false); 127051117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!addedDefaultAppWidget) { 127151117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetHost.deleteAppWidgetId(appWidgetId); 127251117262c8fadb6d227d137e83ad66996b013141Jim Miller mLockPatternUtils.writeFallbackAppWidgetId( 127351117262c8fadb6d227d137e83ad66996b013141Jim Miller AppWidgetManager.INVALID_APPWIDGET_ID); 127451117262c8fadb6d227d137e83ad66996b013141Jim Miller } 127551117262c8fadb6d227d137e83ad66996b013141Jim Miller } 127651117262c8fadb6d227d137e83ad66996b013141Jim Miller } 127767a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 127851117262c8fadb6d227d137e83ad66996b013141Jim Miller 127967a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka // Use the built-in status/clock view if we can't inflate the default widget 128051117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!addedDefaultAppWidget) { 128151117262c8fadb6d227d137e83ad66996b013141Jim Miller addDefaultStatusWidget(insertPageIndex); 128251117262c8fadb6d227d137e83ad66996b013141Jim Miller } 128351117262c8fadb6d227d137e83ad66996b013141Jim Miller 128451117262c8fadb6d227d137e83ad66996b013141Jim Miller // trigger DB updates only if user-added widgets are enabled 128551117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!mSafeModeEnabled && userAddedWidgetsEnabled) { 128651117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetContainer.onAddView( 128751117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetContainer.getChildAt(insertPageIndex), insertPageIndex); 128867a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 128967a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 12900207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen } 12910207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen 1292223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller Runnable mSwitchPageRunnable = new Runnable() { 1293223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1294223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void run() { 1295223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller showAppropriateWidgetPage(); 1296223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1297223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller }; 1298223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1299223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller static class SavedState extends BaseSavedState { 1300223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller int transportState; 13011413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka int appWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID; 1302223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1303223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState(Parcelable superState) { 1304223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super(superState); 1305223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1306223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1307223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller private SavedState(Parcel in) { 1308223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super(in); 1309223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller this.transportState = in.readInt(); 13101413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka this.appWidgetToShow = in.readInt(); 1311223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1312223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1313223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1314223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void writeToParcel(Parcel out, int flags) { 1315223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.writeToParcel(out, flags); 1316223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller out.writeInt(this.transportState); 13171413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka out.writeInt(this.appWidgetToShow); 1318223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1319223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1320223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public static final Parcelable.Creator<SavedState> CREATOR 1321223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller = new Parcelable.Creator<SavedState>() { 1322223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public SavedState createFromParcel(Parcel in) { 1323223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return new SavedState(in); 1324223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1325223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1326223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public SavedState[] newArray(int size) { 1327223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return new SavedState[size]; 1328223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1329223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller }; 1330223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1331223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1332223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1333223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public Parcelable onSaveInstanceState() { 13345f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (DEBUG) Log.d(TAG, "onSaveInstanceState"); 1335223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller Parcelable superState = super.onSaveInstanceState(); 1336223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState ss = new SavedState(superState); 1337e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller ss.transportState = mViewStateManager.getTransportState(); 13381413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka ss.appWidgetToShow = mAppWidgetToShow; 1339223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return ss; 1340223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1341223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1342223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1343223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onRestoreInstanceState(Parcelable state) { 13445f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (DEBUG) Log.d(TAG, "onRestoreInstanceState"); 1345223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (!(state instanceof SavedState)) { 1346223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.onRestoreInstanceState(state); 1347223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return; 1348223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1349223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState ss = (SavedState) state; 1350223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.onRestoreInstanceState(ss.getSuperState()); 1351e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller mViewStateManager.setTransportState(ss.transportState); 13521413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka mAppWidgetToShow = ss.appWidgetToShow; 1353223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller post(mSwitchPageRunnable); 1354223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1355223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 13565f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock @Override 13575f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock public void onWindowFocusChanged(boolean hasWindowFocus) { 13585f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock super.onWindowFocusChanged(hasWindowFocus); 13595f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (DEBUG) Log.d(TAG, "Window is " + (hasWindowFocus ? "focused" : "unfocused")); 136076017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka if (hasWindowFocus && mShowSecurityWhenReturn) { 1361aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller SlidingChallengeLayout slider = 1362aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller (SlidingChallengeLayout) findViewById(R.id.sliding_layout); 1363aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller if (slider != null) { 1364aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller slider.setHandleAlpha(1); 1365aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller slider.showChallenge(true); 1366aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller } 1367aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller mShowSecurityWhenReturn = false; 13685f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock } 13695f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock } 13705f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock 13710207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen private void showAppropriateWidgetPage() { 1372e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller int state = mViewStateManager.getTransportState(); 1373e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller boolean isMusicPlaying = mTransportControl.isMusicPlaying() 1374e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller || state == KeyguardViewStateManager.TRANSPORT_VISIBLE; 13755f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (isMusicPlaying) { 1376e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller mViewStateManager.setTransportState(KeyguardViewStateManager.TRANSPORT_VISIBLE); 1377bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller addTransportToWidgetPager(); 1378e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller } else if (state == KeyguardViewStateManager.TRANSPORT_VISIBLE) { 1379e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller mViewStateManager.setTransportState(KeyguardViewStateManager.TRANSPORT_INVISIBLE); 13800207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen } 13815f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock int pageToShow = getAppropriateWidgetPage(isMusicPlaying); 1382223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mAppWidgetContainer.setCurrentPage(pageToShow); 1383dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1384dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1385dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock private CameraWidgetFrame findCameraPage() { 1386dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock for (int i = mAppWidgetContainer.getChildCount() - 1; i >= 0; i--) { 13876cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung if (mAppWidgetContainer.isCameraPage(i)) { 1388dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock return (CameraWidgetFrame) mAppWidgetContainer.getChildAt(i); 1389dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock } 1390dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock } 1391dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock return null; 1392dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock } 1393dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock 13946cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung boolean isMusicPage(int pageIndex) { 13956cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung return pageIndex >= 0 && pageIndex == getWidgetPosition(R.id.keyguard_transport_control); 13966cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung } 13976cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung 13985f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock private int getAppropriateWidgetPage(boolean isMusicPlaying) { 1399358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock // assumes at least one widget (besides camera + add) 140076017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka if (mAppWidgetToShow != AppWidgetManager.INVALID_APPWIDGET_ID) { 140176017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka final int childCount = mAppWidgetContainer.getChildCount(); 140276017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka for (int i = 0; i < childCount; i++) { 140376017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka if (mAppWidgetContainer.getWidgetPageAt(i).getContentAppWidgetId() 140476017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka == mAppWidgetToShow) { 140576017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka return i; 140676017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka } 140776017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka } 140876017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka mAppWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID; 140976017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka } 1410358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock // if music playing, show transport 14115f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (isMusicPlaying) { 1412358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock if (DEBUG) Log.d(TAG, "Music playing, show transport"); 1413bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller return mAppWidgetContainer.getWidgetPageIndex(mTransportControl); 1414358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock } 1415358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock 14165f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock // else show the right-most widget (except for camera) 1417358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock int rightMost = mAppWidgetContainer.getChildCount() - 1; 14186cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung if (mAppWidgetContainer.isCameraPage(rightMost)) { 1419358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock rightMost--; 1420358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock } 14215f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (DEBUG) Log.d(TAG, "Show right-most page " + rightMost); 1422358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock return rightMost; 1423358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock } 1424358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock 142519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller private void enableUserSelectorIfNecessary() { 142626e6c2e44235428717d7152b9e6398649452f1d2Jim Miller if (!UserManager.supportsMultipleUsers()) { 142726e6c2e44235428717d7152b9e6398649452f1d2Jim Miller return; // device doesn't support multi-user mode 142826e6c2e44235428717d7152b9e6398649452f1d2Jim Miller } 1429f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 1430d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren if (um == null) { 1431d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Throwable t = new Throwable(); 1432d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren t.fillInStackTrace(); 1433d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Log.e(TAG, "user service is null.", t); 1434d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren return; 1435d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren } 143626e6c2e44235428717d7152b9e6398649452f1d2Jim Miller 14375f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock // if there are multiple users, we need to enable to multi-user switcher 1438f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller final List<UserInfo> users = um.getUsers(true); 1439d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren if (users == null) { 1440d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Throwable t = new Throwable(); 1441d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren t.fillInStackTrace(); 1442d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Log.e(TAG, "list of users is null.", t); 1443d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren return; 1444d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren } 144566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 1446f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller final View multiUserView = findViewById(R.id.keyguard_user_selector); 1447f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller if (multiUserView == null) { 1448f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller Throwable t = new Throwable(); 1449f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller t.fillInStackTrace(); 1450f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller Log.e(TAG, "can't find user_selector in layout.", t); 1451f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller return; 1452f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller } 1453f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller 1454d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren if (users.size() > 1) { 145591f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren if (multiUserView instanceof KeyguardMultiUserSelectorView) { 145691f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren KeyguardMultiUserSelectorView multiUser = 145791f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren (KeyguardMultiUserSelectorView) multiUserView; 145891f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren multiUser.setVisibility(View.VISIBLE); 1459d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren multiUser.addUsers(users); 146091f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren UserSwitcherCallback callback = new UserSwitcherCallback() { 146191f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren @Override 146291f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren public void hideSecurityView(int duration) { 146391f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren mSecurityViewContainer.animate().alpha(0).setDuration(duration); 146491f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren } 146524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen 146691f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren @Override 146791f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren public void showSecurityView() { 146891f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren mSecurityViewContainer.setAlpha(1.0f); 146991f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren } 14700a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 147191f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren @Override 147291f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren public void showUnlockHint() { 147391f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren if (mKeyguardSelectorView != null) { 147491f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren mKeyguardSelectorView.showUsabilityHint(); 147591f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren } 14760ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 14770a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 147891f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren @Override 147991f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren public void userActivity() { 148091f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren if (mViewMediatorCallback != null) { 148191f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren mViewMediatorCallback.userActivity(); 148291f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren } 148319a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller } 148491f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren }; 148591f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren multiUser.setCallback(callback); 1486d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren } else { 1487d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Throwable t = new Throwable(); 1488d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren t.fillInStackTrace(); 1489d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren if (multiUserView == null) { 1490d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Log.e(TAG, "could not find the user_selector.", t); 1491d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren } else { 1492d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Log.e(TAG, "user_selector is the wrong type.", t); 1493d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren } 149491f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren } 149566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 149666b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 149766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 1498dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 1499dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void cleanUp() { 1500dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1501dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1502dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 150395b005c196de2f99513da28fe9108b2dec200140Jim Miller /** 150495b005c196de2f99513da28fe9108b2dec200140Jim Miller * In general, we enable unlocking the insecure keyguard with the menu key. However, there are 150595b005c196de2f99513da28fe9108b2dec200140Jim Miller * some cases where we wish to disable it, notably when the menu button placement or technology 150695b005c196de2f99513da28fe9108b2dec200140Jim Miller * is prone to false positives. 150795b005c196de2f99513da28fe9108b2dec200140Jim Miller * 150895b005c196de2f99513da28fe9108b2dec200140Jim Miller * @return true if the menu key should be enabled 150995b005c196de2f99513da28fe9108b2dec200140Jim Miller */ 151095b005c196de2f99513da28fe9108b2dec200140Jim Miller private static final String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key"; 151195b005c196de2f99513da28fe9108b2dec200140Jim Miller private boolean shouldEnableMenuKey() { 151295b005c196de2f99513da28fe9108b2dec200140Jim Miller final Resources res = getResources(); 1513258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final boolean configDisabled = res.getBoolean( 1514258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller com.android.internal.R.bool.config_disableMenuKeyInLockScreen); 151595b005c196de2f99513da28fe9108b2dec200140Jim Miller final boolean isTestHarness = ActivityManager.isRunningInTestHarness(); 151695b005c196de2f99513da28fe9108b2dec200140Jim Miller final boolean fileOverride = (new File(ENABLE_MENU_KEY_FILE)).exists(); 151795b005c196de2f99513da28fe9108b2dec200140Jim Miller return !configDisabled || isTestHarness || fileOverride; 151895b005c196de2f99513da28fe9108b2dec200140Jim Miller } 151995b005c196de2f99513da28fe9108b2dec200140Jim Miller 152075931e05470992d51d135d09031902fd1b3fdbc7Jim Miller 152195b005c196de2f99513da28fe9108b2dec200140Jim Miller 15226bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller public void goToUserSwitcher() { 15236bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_multi_user_selector)); 15246bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller } 15256bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller 152676017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka public void goToWidget(int appWidgetId) { 152776017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka mAppWidgetToShow = appWidgetId; 152876017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka mSwitchPageRunnable.run(); 152976017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka } 153076017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka 153175931e05470992d51d135d09031902fd1b3fdbc7Jim Miller public boolean handleMenuKey() { 153275931e05470992d51d135d09031902fd1b3fdbc7Jim Miller // The following enables the MENU key to work for testing automation 153375931e05470992d51d135d09031902fd1b3fdbc7Jim Miller if (shouldEnableMenuKey()) { 153475931e05470992d51d135d09031902fd1b3fdbc7Jim Miller showNextSecurityScreenOrFinish(false); 153575931e05470992d51d135d09031902fd1b3fdbc7Jim Miller return true; 153675931e05470992d51d135d09031902fd1b3fdbc7Jim Miller } 153775931e05470992d51d135d09031902fd1b3fdbc7Jim Miller return false; 153875931e05470992d51d135d09031902fd1b3fdbc7Jim Miller } 153975931e05470992d51d135d09031902fd1b3fdbc7Jim Miller 15400a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller public boolean handleBackKey() { 15410a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller if (mCurrentSecuritySelection != SecurityMode.None) { 15420a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller mCallback.dismiss(false); 15430a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller return true; 15440a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller } 15450a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller return false; 15460a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller } 15470a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller 1548ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner /** 1549ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner * Dismisses the keyguard by going to the next screen or making it gone. 1550ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner */ 1551ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner public void dismiss() { 1552ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner showNextSecurityScreenOrFinish(false); 1553ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner } 15544eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller 15554eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller public void showAssistant() { 15564eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) 15574eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller .getAssistIntent(mContext, UserHandle.USER_CURRENT); 15584eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller 15594eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller if (intent == null) return; 15604eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller 15614eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, 15624eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller R.anim.keyguard_action_assist_enter, R.anim.keyguard_action_assist_exit, 15634eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller getHandler(), null); 15644eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller 15654eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 15664eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller 15676ed3fcafdbdeda9a10a62bbd0e5997017e8e2635Daniel Sandler mActivityLauncher.launchActivityWithAnimation( 15686ed3fcafdbdeda9a10a62bbd0e5997017e8e2635Daniel Sandler intent, false, opts.toBundle(), null, null); 15694eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller } 1570dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller} 1571