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; 294eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Millerimport android.content.ActivityNotFoundException; 30fc753c0cf676000b1c2d3cb2728af85a9b49f795Michael Jurkaimport android.content.ComponentName; 31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Context; 32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Intent; 33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.IntentSender; 3466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.content.pm.UserInfo; 3595b005c196de2f99513da28fe9108b2dec200140Jim Millerimport android.content.res.Resources; 36dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.graphics.Canvas; 375737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.graphics.Rect; 38f229e4d3eb8f910c181f96416c6798f6f305a395Jim Millerimport android.os.Looper; 39223ce5c7326f6d13a17ccf2624605bb62864a27aJim Millerimport android.os.Parcel; 40223ce5c7326f6d13a17ccf2624605bb62864a27aJim Millerimport android.os.Parcelable; 41dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlockimport android.os.SystemClock; 424eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Millerimport android.os.UserHandle; 4366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.os.UserManager; 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; 85efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen 8634c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock protected OnDismissAction mDismissAction; 87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected int mFailedAttempts; 89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private LockPatternUtils mLockPatternUtils; 90dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardSecurityModel mSecurityModel; 92d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller private KeyguardViewStateManager mViewStateManager; 93dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 94d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen boolean mPersitentStickyWidgetLoaded = false; 95d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen 965737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller private Rect mTempRect = new Rect(); 97ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 9851117262c8fadb6d227d137e83ad66996b013141Jim Miller private int mDisabledFeatures; 9951117262c8fadb6d227d137e83ad66996b013141Jim Miller 10051117262c8fadb6d227d137e83ad66996b013141Jim Miller private boolean mCameraDisabled; 10151117262c8fadb6d227d137e83ad66996b013141Jim Miller 10251117262c8fadb6d227d137e83ad66996b013141Jim Miller private boolean mSafeModeEnabled; 10351117262c8fadb6d227d137e83ad66996b013141Jim Miller 104ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller /*package*/ interface TransportCallback { 105223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller void onListenerDetached(); 106223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller void onListenerAttached(); 107223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller void onPlayStateChanged(); 108ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 1095737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 11024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen /*package*/ interface UserSwitcherCallback { 11124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen void hideSecurityView(int duration); 11224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen void showSecurityView(); 1130a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen void showUnlockHint(); 11419a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller void userActivity(); 11524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 11624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen 11714adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock /*package*/ interface OnDismissAction { 11814adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock /* returns true if the dismiss should be deferred */ 11914adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock boolean onDismiss(); 12014adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock } 12114adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock 122dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardHostView(Context context) { 123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller this(context, null); 124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 126dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardHostView(Context context, AttributeSet attrs) { 127dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super(context, attrs); 128000464ac012471d301c6e48a8228291519915e17Jim Miller mLockPatternUtils = new LockPatternUtils(context); 129f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller mAppWidgetHost = new AppWidgetHost( 130f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller context, APPWIDGET_HOST_ID, mOnClickHandler, Looper.myLooper()); 13167a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka mAppWidgetManager = AppWidgetManager.getInstance(mContext); 132f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller mSecurityModel = new KeyguardSecurityModel(context); 13395b005c196de2f99513da28fe9108b2dec200140Jim Miller 134d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen mViewStateManager = new KeyguardViewStateManager(this); 13551117262c8fadb6d227d137e83ad66996b013141Jim Miller 13651117262c8fadb6d227d137e83ad66996b013141Jim Miller DevicePolicyManager dpm = 13751117262c8fadb6d227d137e83ad66996b013141Jim Miller (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); 13851117262c8fadb6d227d137e83ad66996b013141Jim Miller if (dpm != null) { 13951117262c8fadb6d227d137e83ad66996b013141Jim Miller mDisabledFeatures = getDisabledFeatures(dpm); 14051117262c8fadb6d227d137e83ad66996b013141Jim Miller mCameraDisabled = dpm.getCameraDisabled(null); 14151117262c8fadb6d227d137e83ad66996b013141Jim Miller } 14251117262c8fadb6d227d137e83ad66996b013141Jim Miller 14351117262c8fadb6d227d137e83ad66996b013141Jim Miller mSafeModeEnabled = LockPatternUtils.isSafeModeEnabled(); 14451117262c8fadb6d227d137e83ad66996b013141Jim Miller 14551117262c8fadb6d227d137e83ad66996b013141Jim Miller if (mSafeModeEnabled) { 14651117262c8fadb6d227d137e83ad66996b013141Jim Miller Log.v(TAG, "Keyguard widgets disabled by safe mode"); 14751117262c8fadb6d227d137e83ad66996b013141Jim Miller } 14851117262c8fadb6d227d137e83ad66996b013141Jim Miller if ((mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0) { 14951117262c8fadb6d227d137e83ad66996b013141Jim Miller Log.v(TAG, "Keyguard widgets disabled by DPM"); 15051117262c8fadb6d227d137e83ad66996b013141Jim Miller } 15151117262c8fadb6d227d137e83ad66996b013141Jim Miller if ((mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0) { 15251117262c8fadb6d227d137e83ad66996b013141Jim Miller Log.v(TAG, "Keyguard secure camera disabled by DPM"); 15351117262c8fadb6d227d137e83ad66996b013141Jim Miller } 154dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 156efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen private KeyguardUpdateMonitorCallback mUpdateMonitorCallbacks = 157efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen new KeyguardUpdateMonitorCallback() { 158efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen @Override 159efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen public void onBootCompleted() { 160efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen if (mCheckAppWidgetConsistencyOnBootCompleted) { 161efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen checkAppWidgetConsistency(); 162efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen mSwitchPageRunnable.run(); 163efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen mCheckAppWidgetConsistencyOnBootCompleted = false; 164efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen } 165efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen } 166efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen }; 167efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen 1682cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller private SlidingChallengeLayout mSlidingChallengeLayout; 1692cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller 170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 171d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller public boolean onTouchEvent(MotionEvent ev) { 172d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller boolean result = super.onTouchEvent(ev); 1735737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller mTempRect.set(0, 0, 0, 0); 1745737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller offsetRectIntoDescendantCoords(mSecurityViewContainer, mTempRect); 1755737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(mTempRect.left, mTempRect.top); 1765737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller result = mSecurityViewContainer.dispatchTouchEvent(ev) || result; 1775737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(-mTempRect.left, -mTempRect.top); 1785737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller return result; 1795737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 1805737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 1815737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller @Override 182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void dispatchDraw(Canvas canvas) { 183dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.dispatchDraw(canvas); 1847def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 1857def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDoneDrawing(); 1867def1db03943251fe8cb57ec514722026425479eCraig Mautner } 187dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 189ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller private int getWidgetPosition(int id) { 190ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller final int children = mAppWidgetContainer.getChildCount(); 191ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller for (int i = 0; i < children; i++) { 192bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller if (mAppWidgetContainer.getWidgetPageAt(i).getContent().getId() == id) { 193ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller return i; 194ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 195ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 196ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller return -1; 197ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller } 198ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onFinishInflate() { 201d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller // Grab instances of and make any necessary changes to the main layouts. Create 202d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller // view state manager and wire up necessary listeners / callbacks. 203f3b9ec8230298e8f707c2fc44a74fb9346ec3d12Winson Chung View deleteDropTarget = findViewById(R.id.keyguard_widget_pager_delete_target); 204f2dfc351dec58ad3c16f8496208b4e6e9c667efeJim Miller mAppWidgetContainer = (KeyguardWidgetPager) findViewById(R.id.app_widget_container); 205838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller mAppWidgetContainer.setVisibility(VISIBLE); 206838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller mAppWidgetContainer.setCallbacks(mWidgetCallbacks); 207f3b9ec8230298e8f707c2fc44a74fb9346ec3d12Winson Chung mAppWidgetContainer.setDeleteDropTarget(deleteDropTarget); 208d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.setMinScale(0.5f); 209d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 2102cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller mSlidingChallengeLayout = (SlidingChallengeLayout) findViewById(R.id.sliding_layout); 2112cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller if (mSlidingChallengeLayout != null) { 2122cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller mSlidingChallengeLayout.setOnChallengeScrolledListener(mViewStateManager); 21319a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller } 214d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.setViewStateManager(mViewStateManager); 2151254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka mAppWidgetContainer.setLockPatternUtils(mLockPatternUtils); 216d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 2172cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller ChallengeLayout challenge = mSlidingChallengeLayout != null ? mSlidingChallengeLayout : 21848275d2de99ff2556031929c48f295d3f93447b6Winson Chung (ChallengeLayout) findViewById(R.id.multi_pane_challenge); 21948275d2de99ff2556031929c48f295d3f93447b6Winson Chung challenge.setOnBouncerStateChangedListener(mViewStateManager); 22070c2f8736437ebb6073c3b6dab2e08e6dd9f39a6Winson Chung mAppWidgetContainer.setBouncerAnimationDuration(challenge.getBouncerAnimationDuration()); 221d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mViewStateManager.setPagedView(mAppWidgetContainer); 22248275d2de99ff2556031929c48f295d3f93447b6Winson Chung mViewStateManager.setChallengeLayout(challenge); 2236fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mSecurityViewContainer = (KeyguardSecurityViewFlipper) findViewById(R.id.view_flipper); 2240a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen mKeyguardSelectorView = (KeyguardSelectorView) findViewById(R.id.keyguard_selector_view); 2256fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mViewStateManager.setSecurityViewContainer(mSecurityViewContainer); 226ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller 227d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller if (!(mContext instanceof Activity)) { 228d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller setSystemUiVisibility(getSystemUiVisibility() | View.STATUS_BAR_DISABLE_BACK); 229d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 23068c2489457631f733f542e14058c6d1274c203deJim Miller 23167a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka addDefaultWidgets(); 23251117262c8fadb6d227d137e83ad66996b013141Jim Miller 23367a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka addWidgetsFromSettings(); 234eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka if (numWidgets() >= MAX_WIDGETS) { 235eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka setAddWidgetEnabled(false); 236eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 23751117262c8fadb6d227d137e83ad66996b013141Jim Miller checkAppWidgetConsistency(); 23867a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka mSwitchPageRunnable.run(); 23945adaa70203a155beb786f22b251fe66b8d6fafdAdam Cohen // This needs to be called after the pages are all added. 24045adaa70203a155beb786f22b251fe66b8d6fafdAdam Cohen mViewStateManager.showUsabilityHints(); 24145adaa70203a155beb786f22b251fe66b8d6fafdAdam Cohen 24267a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka showPrimarySecurityScreen(false); 2439b1db682c32d103974b0f1193b50e77e254d5589Jim Miller updateSecurityViews(); 244e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 24651117262c8fadb6d227d137e83ad66996b013141Jim Miller private int getDisabledFeatures(DevicePolicyManager dpm) { 24751117262c8fadb6d227d137e83ad66996b013141Jim Miller int disabledFeatures = DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE; 24851117262c8fadb6d227d137e83ad66996b013141Jim Miller if (dpm != null) { 24951117262c8fadb6d227d137e83ad66996b013141Jim Miller final int currentUser = mLockPatternUtils.getCurrentUser(); 25051117262c8fadb6d227d137e83ad66996b013141Jim Miller disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUser); 25151117262c8fadb6d227d137e83ad66996b013141Jim Miller } 25251117262c8fadb6d227d137e83ad66996b013141Jim Miller return disabledFeatures; 25351117262c8fadb6d227d137e83ad66996b013141Jim Miller } 25451117262c8fadb6d227d137e83ad66996b013141Jim Miller 25551117262c8fadb6d227d137e83ad66996b013141Jim Miller private boolean widgetsDisabledByDpm() { 25651117262c8fadb6d227d137e83ad66996b013141Jim Miller return (mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0; 25751117262c8fadb6d227d137e83ad66996b013141Jim Miller } 25851117262c8fadb6d227d137e83ad66996b013141Jim Miller 25951117262c8fadb6d227d137e83ad66996b013141Jim Miller private boolean cameraDisabledByDpm() { 26051117262c8fadb6d227d137e83ad66996b013141Jim Miller return mCameraDisabled 26151117262c8fadb6d227d137e83ad66996b013141Jim Miller || (mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0; 26251117262c8fadb6d227d137e83ad66996b013141Jim Miller } 26351117262c8fadb6d227d137e83ad66996b013141Jim Miller 264e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void updateSecurityViews() { 265e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller int children = mSecurityViewContainer.getChildCount(); 266e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller for (int i = 0; i < children; i++) { 267e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityView(mSecurityViewContainer.getChildAt(i)); 268e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 269e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 270dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 271e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void updateSecurityView(View view) { 272e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (view instanceof KeyguardSecurityView) { 273e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView ksv = (KeyguardSecurityView) view; 274e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller ksv.setKeyguardCallback(mCallback); 275e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller ksv.setLockPatternUtils(mLockPatternUtils); 276c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren if (mViewStateManager.isBouncing()) { 277c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren ksv.showBouncer(0); 278c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } else { 279c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren ksv.hideBouncer(0); 280c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 281e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } else { 282e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller Log.w(TAG, "View " + view + " is not a KeyguardSecurityView"); 283dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 284dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 285dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 286dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller void setLockPatternUtils(LockPatternUtils utils) { 287dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSecurityModel.setLockPatternUtils(utils); 288dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternUtils = utils; 289e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityViews(); 290dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 291dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 292dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 293dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onAttachedToWindow() { 294dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onAttachedToWindow(); 295dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mAppWidgetHost.startListening(); 296efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallbacks); 2977221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller } 2987221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller 299dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 300dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onDetachedFromWindow() { 301dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onDetachedFromWindow(); 302dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mAppWidgetHost.stopListening(); 303efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallbacks); 304dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 305dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 306f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller private AppWidgetHost getAppWidgetHost() { 307dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mAppWidgetHost; 308dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 309dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 310d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller void addWidget(AppWidgetHostView view, int pageIndex) { 311d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mAppWidgetContainer.addWidget(view, pageIndex); 312dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 313dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 314838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller private KeyguardWidgetPager.Callbacks mWidgetCallbacks 315838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller = new KeyguardWidgetPager.Callbacks() { 316c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 317c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public void userActivity() { 31808c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen KeyguardHostView.this.userActivity(); 319c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 320c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 321c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 322c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public void onUserActivityTimeoutChanged() { 32308c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen KeyguardHostView.this.onUserActivityTimeoutChanged(); 324c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 325eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka 326eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka @Override 32740f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung public void onAddView(View v) { 32840f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung if (numWidgets() >= MAX_WIDGETS) { 32940f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung setAddWidgetEnabled(false); 33040f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung } 33140f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung }; 33240f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung 33340f8211e6849c4c7948d7fc19127f29f0cebbeb9Winson Chung @Override 334eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka public void onRemoveView(View v) { 335eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka if (numWidgets() < MAX_WIDGETS) { 336eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka setAddWidgetEnabled(true); 337eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 338eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 339c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown }; 340c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 34108c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen public void userActivity() { 34208c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen if (mViewMediatorCallback != null) { 34308c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen mViewMediatorCallback.userActivity(); 34408c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen } 34508c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen } 34608c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen 34708c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen public void onUserActivityTimeoutChanged() { 34808c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen if (mViewMediatorCallback != null) { 34908c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen mViewMediatorCallback.onUserActivityTimeoutChanged(); 35008c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen } 35108c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen } 35208c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen 353c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 354c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public long getUserActivityTimeout() { 355c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown // Currently only considering user activity timeouts needed by widgets. 356c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown // Could also take into account longer timeouts for certain security views. 357838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller if (mAppWidgetContainer != null) { 358838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller return mAppWidgetContainer.getUserActivityTimeout(); 359c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 360c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown return -1; 361c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 362c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 363dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardSecurityCallback mCallback = new KeyguardSecurityCallback() { 364dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 365dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void userActivity(long timeout) { 3667def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 3673dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mViewMediatorCallback.userActivity(timeout); 3687def1db03943251fe8cb57ec514722026425479eCraig Mautner } 369dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 370dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 371dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void dismiss(boolean authenticated) { 372dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller showNextSecurityScreenOrFinish(authenticated); 373dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 374dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 375dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean isVerifyUnlockOnly() { 376258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller return mIsVerifyUnlockOnly; 377dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 378dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 379dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reportSuccessfulUnlockAttempt() { 380258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller KeyguardUpdateMonitor.getInstance(mContext).clearFailedUnlockAttempts(); 3817641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller mLockPatternUtils.reportSuccessfulPasswordAttempt(); 382dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 383dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 384dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reportFailedUnlockAttempt() { 3857641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller if (mCurrentSecuritySelection == SecurityMode.Biometric) { 3867641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller KeyguardUpdateMonitor.getInstance(mContext).reportFailedBiometricUnlockAttempt(); 3877641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller } else { 3887641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller KeyguardHostView.this.reportFailedUnlockAttempt(); 3897641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller } 390dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 391dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 392dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public int getFailedAttempts() { 393258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller return KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(); 394dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 395dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 396258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller @Override 397258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller public void showBackupSecurity() { 3980ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardHostView.this.showBackupSecurityScreen(); 399dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 400dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 4015f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller @Override 40234c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock public void setOnDismissAction(OnDismissAction action) { 40334c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock KeyguardHostView.this.setOnDismissAction(action); 4045f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 4055f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller 406dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 407dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 408258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showDialog(String title, String message) { 409258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final AlertDialog dialog = new AlertDialog.Builder(mContext) 410258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setTitle(title) 411258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setMessage(message) 412258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .setNeutralButton(com.android.internal.R.string.ok, null) 413258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller .create(); 414258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (!(mContext instanceof Activity)) { 415258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 416258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 417258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller dialog.show(); 418258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 419258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 420258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showTimeoutDialog() { 421258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 422258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int messageId = 0; 423258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 424258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller switch (mSecurityModel.getSecurityMode()) { 425258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller case Pattern: 426258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller messageId = R.string.kg_too_many_failed_pattern_attempts_dialog_message; 427258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller break; 42869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 42969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler messageId = R.string.kg_too_many_failed_pin_attempts_dialog_message; 43069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler break; 43169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case Password: 43269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler messageId = R.string.kg_too_many_failed_password_attempts_dialog_message; 433258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller break; 434258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 435258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 436258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (messageId != 0) { 437258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final String message = mContext.getString(messageId, 438258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(), 439258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller timeoutInSeconds); 440258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 441258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 442258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 443258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 444258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showAlmostAtWipeDialog(int attempts, int remaining) { 445258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 446258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_almost_at_wipe, 447258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller attempts, remaining); 448258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 449258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 450258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 451258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showWipeDialog(int attempts) { 452258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_now_wiping, attempts); 453258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 454258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 455258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 456258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showAlmostAtAccountLoginDialog() { 457258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000; 458258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int count = LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET 459258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller - LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT; 460258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller String message = mContext.getString(R.string.kg_failed_attempts_almost_at_login, 461258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller count, LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT, timeoutInSeconds); 462258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showDialog(null, message); 463258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 464258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 465258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void reportFailedUnlockAttempt() { 466258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 467258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttempts = monitor.getFailedUnlockAttempts() + 1; // +1 for this time 468258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 469258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (DEBUG) Log.d(TAG, "reportFailedPatternAttempt: #" + failedAttempts); 470258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 471258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller SecurityMode mode = mSecurityModel.getSecurityMode(); 472258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final boolean usingPattern = mode == KeyguardSecurityModel.SecurityMode.Pattern; 473258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 474258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttemptsBeforeWipe = mLockPatternUtils.getDevicePolicyManager() 475599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani .getMaximumFailedPasswordsForWipe(null, mLockPatternUtils.getCurrentUser()); 476258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 477258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int failedAttemptWarning = LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET 478258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller - LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT; 479258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 480258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final int remainingBeforeWipe = failedAttemptsBeforeWipe > 0 ? 481258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller (failedAttemptsBeforeWipe - failedAttempts) 482258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller : Integer.MAX_VALUE; // because DPM returns 0 if no restriction 483258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 48408b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller boolean showTimeout = false; 485258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (remainingBeforeWipe < LockPatternUtils.FAILED_ATTEMPTS_BEFORE_WIPE_GRACE) { 486258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // If we reach this code, it means the user has installed a DevicePolicyManager 487258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // that requests device wipe after N attempts. Once we get below the grace 488258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // period, we'll post this dialog every time as a clear warning until the 489258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // bombshell hits and the device is wiped. 490258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (remainingBeforeWipe > 0) { 491258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showAlmostAtWipeDialog(failedAttempts, remainingBeforeWipe); 492258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else { 493258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // Too many attempts. The device will be wiped shortly. 494258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller Slog.i(TAG, "Too many unlock attempts; device will be wiped!"); 495258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showWipeDialog(failedAttempts); 496258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 497258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else { 49808b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller showTimeout = 499258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller (failedAttempts % LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) == 0; 500258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (usingPattern && mEnableFallback) { 501258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller if (failedAttempts == failedAttemptWarning) { 502258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showAlmostAtAccountLoginDialog(); 503258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showTimeout = false; // don't show both dialogs 504258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } else if (failedAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET) { 505258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mLockPatternUtils.setPermanentlyLocked(true); 506e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(SecurityMode.Account); 507258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // don't show timeout dialog because we show account unlock screen next 508258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller showTimeout = false; 509258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 510258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 511258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 512258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller monitor.reportFailedUnlockAttempt(); 513258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mLockPatternUtils.reportFailedPasswordAttempt(); 51408b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller if (showTimeout) { 51508b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller showTimeoutDialog(); 51608b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller } 517258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 518258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 519258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller /** 5200ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * Shows the primary security screen for the user. This will be either the multi-selector 5210ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * or the user's security method. 5220ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller * @param turningOff true if the device is being turned off 5230ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller */ 5240ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller void showPrimarySecurityScreen(boolean turningOff) { 5250ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 5260ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")"); 527078f5919a9584cc3f1c7eb3a78862bfa40396de9Brian Colonna if (!turningOff && 528078f5919a9584cc3f1c7eb3a78862bfa40396de9Brian Colonna KeyguardUpdateMonitor.getInstance(mContext).isAlternateUnlockEnabled()) { 5290ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // If we're not turning off, then allow biometric alternate. 5300ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // We'll reload it when the device comes back on. 5310ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller securityMode = mSecurityModel.getAlternateFor(securityMode); 5320ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 5330ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showSecurityScreen(securityMode); 5340ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 53568c2489457631f733f542e14058c6d1274c203deJim Miller 5360ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller /** 537258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * Shows the backup security screen for the current security mode. This could be used for 538258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * password recovery screens but is currently only used for pattern unlock to show the 539258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * account unlock screen and biometric unlock to show the user's normal unlock. 540258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller */ 5410ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller private void showBackupSecurityScreen() { 54261413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett if (DEBUG) Log.d(TAG, "showBackupSecurity()"); 54363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller SecurityMode backup = mSecurityModel.getBackupSecurityMode(mCurrentSecuritySelection); 54463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller showSecurityScreen(backup); 545258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller } 546258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 5470a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen public boolean showNextSecurityScreenIfPresent() { 5480a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen SecurityMode securityMode = mSecurityModel.getSecurityMode(); 5490a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen // Allow an alternate, such as biometric unlock 5500a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen securityMode = mSecurityModel.getAlternateFor(securityMode); 5510a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen if (SecurityMode.None == securityMode) { 5520a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen return false; 5530a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } else { 5540a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen showSecurityScreen(securityMode); // switch to the alternate security view 5550a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen return true; 5560a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 5570a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 5580a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 559258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller private void showNextSecurityScreenOrFinish(boolean authenticated) { 56061413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")"); 561dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller boolean finish = false; 562e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (SecurityMode.None == mCurrentSecuritySelection) { 563258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 564258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller // Allow an alternate, such as biometric unlock 565000464ac012471d301c6e48a8228291519915e17Jim Miller securityMode = mSecurityModel.getAlternateFor(securityMode); 566e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (SecurityMode.None == securityMode) { 567dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller finish = true; // no security required 568dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 569e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); // switch to the alternate security view 570dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 571dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else if (authenticated) { 572e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller switch (mCurrentSecuritySelection) { 573e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: 574e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: 57569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 576e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: 577e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: 5784b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller finish = true; 5794b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 5804b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 581e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: 582e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: 5834b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home 5844b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 5854b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (securityMode != SecurityMode.None) { 586e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); 5874b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 5884b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller finish = true; 5894b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 5904b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 5914b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 5924b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller default: 5930ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller Log.v(TAG, "Bad security screen " + mCurrentSecuritySelection + ", fail safe"); 5940ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 5954b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller break; 596dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 597dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 5980ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 599dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 600dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (finish) { 6010ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // If the alternate unlock was suppressed, it can now be safely 6020ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller // enabled because the user has left keyguard. 6030ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); 60468c2489457631f733f542e14058c6d1274c203deJim Miller 605dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // If there's a pending runnable because the user interacted with a widget 606dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // and we're leaving keyguard, then run it. 60734c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock boolean deferKeyguardDone = false; 60834c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock if (mDismissAction != null) { 60934c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock deferKeyguardDone = mDismissAction.onDismiss(); 61034c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock mDismissAction = null; 611dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 6127def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 61334c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock if (deferKeyguardDone) { 61434c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock mViewMediatorCallback.keyguardDonePending(); 61534c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } else { 61634c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock mViewMediatorCallback.keyguardDone(true); 61734c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } 6187def1db03943251fe8cb57ec514722026425479eCraig Mautner } 619b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller } else { 620b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller mViewStateManager.showBouncer(true); 621dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 622dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 623dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 624dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private OnClickHandler mOnClickHandler = new OnClickHandler() { 625dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 626dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean onClickHandler(final View view, 627dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final android.app.PendingIntent pendingIntent, 628dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final Intent fillInIntent) { 629dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (pendingIntent.isActivity()) { 63034c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock setOnDismissAction(new OnDismissAction() { 63134c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock public boolean onDismiss() { 632dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 633dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? 634dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Context context = view.getContext(); 635dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, 636dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 0, 0, 637dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller view.getMeasuredWidth(), view.getMeasuredHeight()); 638dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller context.startIntentSender( 639dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller pendingIntent.getIntentSender(), fillInIntent, 640dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent.FLAG_ACTIVITY_NEW_TASK, 641dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle()); 64234c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } catch (IntentSender.SendIntentException e) { 64334c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock android.util.Log.e(TAG, "Cannot send pending intent: ", e); 64434c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } catch (Exception e) { 64534c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock android.util.Log.e(TAG, "Cannot send pending intent due to " + 64634c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock "unknown exception: ", e); 64734c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } 64834c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock return false; 649dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 6505f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller }); 651dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 65208898375fba7cc776857ebf0846c7183563a300fJim Miller if (mViewStateManager.isChallengeShowing()) { 65308898375fba7cc776857ebf0846c7183563a300fJim Miller mViewStateManager.showBouncer(true); 65408898375fba7cc776857ebf0846c7183563a300fJim Miller } else { 65508898375fba7cc776857ebf0846c7183563a300fJim Miller mCallback.dismiss(false); 65608898375fba7cc776857ebf0846c7183563a300fJim Miller } 657dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return true; 658dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 659dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return super.onClickHandler(view, pendingIntent, fillInIntent); 660dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 661dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 662dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 663dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 66463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller // Used to ignore callbacks from methods that are no longer current (e.g. face unlock). 66563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller // This avoids unwanted asynchronous events from messing with the state. 66663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() { 66763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 66863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 66963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void userActivity(long timeout) { 67063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 67163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 67263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 67363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void showBackupSecurity() { 67463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 67563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 67663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 67734c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock public void setOnDismissAction(OnDismissAction action) { 67863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 67963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 68063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 68163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void reportSuccessfulUnlockAttempt() { 68263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 68363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 68463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 68563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void reportFailedUnlockAttempt() { 68663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 68763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 68863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 68963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public boolean isVerifyUnlockOnly() { 69063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return false; 69163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 69263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 69363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 69463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public int getFailedAttempts() { 69563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return 0; 69663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 69763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 69863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller @Override 69963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller public void dismiss(boolean securityVerified) { 70063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 70163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller }; 70263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller 703aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller protected boolean mShowSecurityWhenReturn; 704aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller 705dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 706dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reset() { 707258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller mIsVerifyUnlockOnly = false; 708ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_status_view)); 709dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 710dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 7115f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller /** 71234c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock * Sets an action to perform when keyguard is dismissed. 71334c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock * @param action 7145f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller */ 71534c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock protected void setOnDismissAction(OnDismissAction action) { 71634c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock mDismissAction = action; 7175f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 7185f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller 719e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private KeyguardSecurityView getSecurityView(SecurityMode securityMode) { 720e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 721e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView view = null; 722e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int children = mSecurityViewContainer.getChildCount(); 723dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller for (int child = 0; child < children; child++) { 724e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (mSecurityViewContainer.getChildAt(child).getId() == securityViewIdForMode) { 725e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller view = ((KeyguardSecurityView)mSecurityViewContainer.getChildAt(child)); 726e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller break; 727dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 728dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 72963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller int layoutId = getLayoutIdFor(securityMode); 73063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller if (view == null && layoutId != 0) { 731e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final LayoutInflater inflater = LayoutInflater.from(mContext); 732bdffd5c3a18e67443ebbd16d4f0349d0728285b1Jim Miller if (DEBUG) Log.v(TAG, "inflating id = " + layoutId); 7339799714f6c69efe50e21a6073b879140e5e792b7Adam Powell View v = inflater.inflate(layoutId, mSecurityViewContainer, false); 734e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mSecurityViewContainer.addView(v); 735e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller updateSecurityView(v); 7360b728244dc87b4a453f2191c2cb37a86e91aee0aJim Miller view = (KeyguardSecurityView)v; 7370ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 7380ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 7390ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller if (view instanceof KeyguardSelectorView) { 7400ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller KeyguardSelectorView selectorView = (KeyguardSelectorView) view; 7410ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller View carrierText = selectorView.findViewById(R.id.keyguard_selector_fade_container); 7420ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller selectorView.setCarrierArea(carrierText); 7430ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 74468c2489457631f733f542e14058c6d1274c203deJim Miller 745e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller return view; 746dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 747dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 748258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller /** 749258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * Switches to the given security view unless it's already being shown, in which case 750258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * this is a no-op. 751258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * 752e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller * @param securityMode 753258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller */ 754e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private void showSecurityScreen(SecurityMode securityMode) { 75568c2489457631f733f542e14058c6d1274c203deJim Miller if (DEBUG) Log.d(TAG, "showSecurityScreen(" + securityMode + ")"); 75668c2489457631f733f542e14058c6d1274c203deJim Miller 757e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (securityMode == mCurrentSecuritySelection) return; 758dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 759e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView oldView = getSecurityView(mCurrentSecuritySelection); 760e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller KeyguardSecurityView newView = getSecurityView(securityMode); 761dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 762a71984f3da47c6e6e3164c170735362a3222d3adJim Miller // Enter full screen mode if we're in SIM or Account screen 763a71984f3da47c6e6e3164c170735362a3222d3adJim Miller boolean fullScreenEnabled = getResources().getBoolean( 764a71984f3da47c6e6e3164c170735362a3222d3adJim Miller com.android.internal.R.bool.kg_sim_puk_account_full_screen); 765a71984f3da47c6e6e3164c170735362a3222d3adJim Miller boolean isSimOrAccount = securityMode == SecurityMode.SimPin 766a71984f3da47c6e6e3164c170735362a3222d3adJim Miller || securityMode == SecurityMode.SimPuk 767a71984f3da47c6e6e3164c170735362a3222d3adJim Miller || securityMode == SecurityMode.Account; 768a71984f3da47c6e6e3164c170735362a3222d3adJim Miller mAppWidgetContainer.setVisibility( 769a71984f3da47c6e6e3164c170735362a3222d3adJim Miller isSimOrAccount && fullScreenEnabled ? View.GONE : View.VISIBLE); 770a71984f3da47c6e6e3164c170735362a3222d3adJim Miller 7712cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller if (mSlidingChallengeLayout != null) { 7722cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller mSlidingChallengeLayout.setChallengeInteractive(!fullScreenEnabled); 7732cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller } 7742cacda5fc92a28a44a37e25b96093a9cc1346080Jim Miller 775dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Emulate Activity life cycle 77663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller if (oldView != null) { 77763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller oldView.onPause(); 77863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view 77963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller } 780a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren newView.onResume(KeyguardSecurityView.VIEW_REVEALED); 78163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller newView.setKeyguardCallback(mCallback); 782dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 783cd03a26f4f5663b40d4679de102519ccc163fa10Craig Mautner final boolean needsInput = newView.needsInput(); 7847def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 785cd03a26f4f5663b40d4679de102519ccc163fa10Craig Mautner mViewMediatorCallback.setNeedsInput(needsInput); 7867def1db03943251fe8cb57ec514722026425479eCraig Mautner } 787dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 788dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Find and show this child. 789e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int childCount = mSecurityViewContainer.getChildCount(); 7904b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 79122ae05d50c7011b389a5dba7a2f717e407328bf8Jim Miller mSecurityViewContainer.setInAnimation( 79222ae05d50c7011b389a5dba7a2f717e407328bf8Jim Miller AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_fade_in)); 79322ae05d50c7011b389a5dba7a2f717e407328bf8Jim Miller mSecurityViewContainer.setOutAnimation( 79422ae05d50c7011b389a5dba7a2f717e407328bf8Jim Miller AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_fade_out)); 795e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 796dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller for (int i = 0; i < childCount; i++) { 797e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (mSecurityViewContainer.getChildAt(i).getId() == securityViewIdForMode) { 798e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mSecurityViewContainer.setDisplayedChild(i); 799dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller break; 800dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 801dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 802258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller 803e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller if (securityMode == SecurityMode.None) { 804e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // Discard current runnable if we're switching back to the selector view 80534c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock setOnDismissAction(null); 80668c2489457631f733f542e14058c6d1274c203deJim Miller } 807e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller mCurrentSecuritySelection = securityMode; 808dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 809dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 810dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 811dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onScreenTurnedOn() { 812358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock if (DEBUG) Log.d(TAG, "screen on, instance " + Integer.toHexString(hashCode())); 8130ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(false); 814a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren getSecurityView(mCurrentSecuritySelection).onResume(KeyguardSecurityView.SCREEN_ON); 815d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller 816d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // This is a an attempt to fix bug 7137389 where the device comes back on but the entire 817d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // layout is blank but forcing a layout causes it to reappear (e.g. with with 818d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller // hierarchyviewer). 819d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller requestLayout(); 8206fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 8216fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen if (mViewStateManager != null) { 8226fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mViewStateManager.showUsabilityHints(); 8236fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 824dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 825dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 826dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 827dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onScreenTurnedOff() { 828dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock if (DEBUG) Log.d(TAG, String.format("screen off, instance %s at %s", 829dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock Integer.toHexString(hashCode()), SystemClock.uptimeMillis())); 830078f5919a9584cc3f1c7eb3a78862bfa40396de9Brian Colonna // Once the screen turns off, we no longer consider this to be first boot and we want the 831078f5919a9584cc3f1c7eb3a78862bfa40396de9Brian Colonna // biometric unlock to start next time keyguard is shown. 832078f5919a9584cc3f1c7eb3a78862bfa40396de9Brian Colonna KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); 8331413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka // We use mAppWidgetToShow to show a particular widget after you add it-- once the screen 8341413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka // turns off we reset that behavior 8351413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka clearAppWidgetToShow(); 83667a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka checkAppWidgetConsistency(); 8370ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller showPrimarySecurityScreen(true); 838e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller getSecurityView(mCurrentSecuritySelection).onPause(); 839dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock CameraWidgetFrame cameraPage = findCameraPage(); 840dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock if (cameraPage != null) { 841dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock cameraPage.onScreenTurnedOff(); 842dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock } 843dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 844dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 8451413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka public void clearAppWidgetToShow() { 8461413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka mAppWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID; 8471413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka } 8481413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka 849dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 850dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void show() { 851086977094d96ab9352432e0941a05b09cefc92acJim Miller if (DEBUG) Log.d(TAG, "show()"); 852086977094d96ab9352432e0941a05b09cefc92acJim Miller showPrimarySecurityScreen(false); 853dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 854dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 855dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private boolean isSecure() { 856dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller SecurityMode mode = mSecurityModel.getSecurityMode(); 857dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller switch (mode) { 858dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Pattern: 859dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mLockPatternUtils.isLockPatternEnabled(); 860dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Password: 86169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: 862dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mLockPatternUtils.isLockPasswordEnabled(); 863dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case SimPin: 864dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case SimPuk: 865dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case Account: 866dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return true; 867dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case None: 868dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return false; 869dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller default: 870dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller throw new IllegalStateException("Unknown security mode " + mode); 871dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 872dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 873dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 874dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 875dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void wakeWhenReadyTq(int keyCode) { 876dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "onWakeKey"); 877dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (keyCode == KeyEvent.KEYCODE_MENU && isSecure()) { 878dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "switching screens to unlock screen because wake key was MENU"); 879e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(SecurityMode.None); 880dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 881dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "poking wake lock immediately"); 8827def1db03943251fe8cb57ec514722026425479eCraig Mautner } 8837def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 8843dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mViewMediatorCallback.wakeUp(); 885dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 886dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 887dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 888dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 889dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void verifyUnlock() { 890dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 891dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (securityMode == KeyguardSecurityModel.SecurityMode.None) { 8927def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 8937def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDone(true); 8947def1db03943251fe8cb57ec514722026425479eCraig Mautner } 895dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else if (securityMode != KeyguardSecurityModel.SecurityMode.Pattern 89669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler && securityMode != KeyguardSecurityModel.SecurityMode.PIN 897dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller && securityMode != KeyguardSecurityModel.SecurityMode.Password) { 898dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // can only verify unlock when in pattern/password mode 8997def1db03943251fe8cb57ec514722026425479eCraig Mautner if (mViewMediatorCallback != null) { 9007def1db03943251fe8cb57ec514722026425479eCraig Mautner mViewMediatorCallback.keyguardDone(false); 9017def1db03943251fe8cb57ec514722026425479eCraig Mautner } 902dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 903dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // otherwise, go to the unlock screen, see if they can verify it 904dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mIsVerifyUnlockOnly = true; 905e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller showSecurityScreen(securityMode); 906dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 907dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 908dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 909dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private int getSecurityViewIdForMode(SecurityMode securityMode) { 910dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller switch (securityMode) { 911e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case None: return R.id.keyguard_selector_view; 912e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: return R.id.keyguard_pattern_view; 91369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: return R.id.keyguard_pin_view; 914e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: return R.id.keyguard_password_view; 915e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: return R.id.keyguard_face_unlock_view; 916e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: return R.id.keyguard_account_view; 917e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: return R.id.keyguard_sim_pin_view; 918e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: return R.id.keyguard_sim_puk_view; 919dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 920dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return 0; 921dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 922dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 923e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller private int getLayoutIdFor(SecurityMode securityMode) { 924e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller switch (securityMode) { 925e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case None: return R.layout.keyguard_selector_view; 926e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Pattern: return R.layout.keyguard_pattern_view; 92769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler case PIN: return R.layout.keyguard_pin_view; 928e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Password: return R.layout.keyguard_password_view; 929e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Biometric: return R.layout.keyguard_face_unlock_view; 930e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case Account: return R.layout.keyguard_account_view; 931e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPin: return R.layout.keyguard_sim_pin_view; 932e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller case SimPuk: return R.layout.keyguard_sim_puk_view; 933e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller default: 93463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller return 0; 935e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 936e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller } 937e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller 93851117262c8fadb6d227d137e83ad66996b013141Jim Miller private boolean addWidget(int appId, int pageIndex, boolean updateDbIfFailed) { 93967a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appId); 94099a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller if (appWidgetInfo != null) { 94199a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller AppWidgetHostView view = getAppWidgetHost().createView(mContext, appId, appWidgetInfo); 942d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller addWidget(view, pageIndex); 94367a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka return true; 94499a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller } else { 94551117262c8fadb6d227d137e83ad66996b013141Jim Miller if (updateDbIfFailed) { 94651117262c8fadb6d227d137e83ad66996b013141Jim Miller Log.w(TAG, "AppWidgetInfo for app widget id " + appId + " was null, deleting"); 94751117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetHost.deleteAppWidgetId(appId); 94851117262c8fadb6d227d137e83ad66996b013141Jim Miller mLockPatternUtils.removeAppWidget(appId); 94951117262c8fadb6d227d137e83ad66996b013141Jim Miller } 95067a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka return false; 95199a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller } 952dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 953dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 954dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock private final CameraWidgetFrame.Callbacks mCameraWidgetCallbacks = 955dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock new CameraWidgetFrame.Callbacks() { 956dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 957dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock public void onLaunchingCamera() { 95857f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock setSliderHandleAlpha(0); 959dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 960dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 961dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 96257f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock public void onCameraLaunchedSuccessfully() { 9636cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung if (mAppWidgetContainer.isCameraPage(mAppWidgetContainer.getCurrentPage())) { 9644b976ea1af04f8c340ef7e0d79f73d7cdb5eb72eJohn Spurlock mAppWidgetContainer.scrollLeft(); 9654b976ea1af04f8c340ef7e0d79f73d7cdb5eb72eJohn Spurlock } 96657f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock setSliderHandleAlpha(1); 967aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller mShowSecurityWhenReturn = true; 968dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 969dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 97057f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock @Override 97157f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock public void onCameraLaunchedUnsuccessfully() { 97257f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock setSliderHandleAlpha(1); 97357f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock } 97457f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock 97557f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock private void setSliderHandleAlpha(float alpha) { 97657f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock SlidingChallengeLayout slider = 97757f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock (SlidingChallengeLayout) findViewById(R.id.sliding_layout); 97857f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock if (slider != null) { 97957f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock slider.setHandleAlpha(alpha); 98057f928fc4afc02d2fe45523efea687eee7f86c02John Spurlock } 981dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 982dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock }; 983dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 984dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() { 985dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 986dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock Context getContext() { 987dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mContext; 988dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 989dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 990dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 991dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock KeyguardSecurityCallback getCallback() { 992dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mCallback; 993dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 994dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 995dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock @Override 996dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock LockPatternUtils getLockPatternUtils() { 997dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock return mLockPatternUtils; 998bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 999bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller }; 1000dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock 1001eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka private int numWidgets() { 1002eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka final int childCount = mAppWidgetContainer.getChildCount(); 1003eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka int widgetCount = 0; 1004eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka for (int i = 0; i < childCount; i++) { 1005eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka if (mAppWidgetContainer.isWidgetPage(i)) { 1006eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka widgetCount++; 1007eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 1008eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 1009eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka return widgetCount; 1010eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 1011eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka 1012eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka 1013eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka private void setAddWidgetEnabled(boolean clickable) { 1014eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget); 1015eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka if (addWidget != null) { 1016eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view); 1017eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka addWidgetButton.setEnabled(clickable); 1018eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 1019eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka } 1020eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka 10214e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller private void addDefaultWidgets() { 10224e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller LayoutInflater inflater = LayoutInflater.from(mContext); 1023223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller inflater.inflate(R.layout.keyguard_transport_control_view, this, true); 10244e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 102551117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!mSafeModeEnabled && !widgetsDisabledByDpm()) { 102651117262c8fadb6d227d137e83ad66996b013141Jim Miller View addWidget = inflater.inflate(R.layout.keyguard_add_widget, this, false); 1027eb963f046dadd1304379db0b14c17e47c89913f4Michael Jurka mAppWidgetContainer.addWidget(addWidget, 0); 102851117262c8fadb6d227d137e83ad66996b013141Jim Miller View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view); 102951117262c8fadb6d227d137e83ad66996b013141Jim Miller addWidgetButton.setOnClickListener(new OnClickListener() { 103051117262c8fadb6d227d137e83ad66996b013141Jim Miller @Override 103151117262c8fadb6d227d137e83ad66996b013141Jim Miller public void onClick(View v) { 1032192d6d4ee271c0782a3bf5d8c64e42eb22d1a6faMichael Jurka // Pass in an invalid widget id... the picker will allocate an ID for us 1033192d6d4ee271c0782a3bf5d8c64e42eb22d1a6faMichael Jurka mActivityLauncher.launchWidgetPicker(AppWidgetManager.INVALID_APPWIDGET_ID); 103451117262c8fadb6d227d137e83ad66996b013141Jim Miller } 103551117262c8fadb6d227d137e83ad66996b013141Jim Miller }); 103651117262c8fadb6d227d137e83ad66996b013141Jim Miller } 103751117262c8fadb6d227d137e83ad66996b013141Jim Miller 103851117262c8fadb6d227d137e83ad66996b013141Jim Miller // We currently disable cameras in safe mode because we support loading 3rd party 103951117262c8fadb6d227d137e83ad66996b013141Jim Miller // cameras we can't trust. TODO: plumb safe mode into camera creation code and only 104051117262c8fadb6d227d137e83ad66996b013141Jim Miller // inflate system-provided camera? 104151117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!mSafeModeEnabled && !cameraDisabledByDpm() 104251117262c8fadb6d227d137e83ad66996b013141Jim Miller && mContext.getResources().getBoolean(R.bool.kg_enable_camera_default_widget)) { 1043dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock View cameraWidget = 1044dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock CameraWidgetFrame.create(mContext, mCameraWidgetCallbacks, mActivityLauncher); 1045dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock if (cameraWidget != null) { 1046dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock mAppWidgetContainer.addWidget(cameraWidget); 1047dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock } 104886b6357e5eb91950eac7de7ffe29e5a4ad32903bJohn Spurlock } 1049838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 105019a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller enableUserSelectorIfNecessary(); 10517221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller initializeTransportControl(); 10527221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller } 10537221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller 105476017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka private boolean removeTransportFromWidgetPager() { 1055bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller int page = getWidgetPosition(R.id.keyguard_transport_control); 1056bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller if (page != -1) { 1057bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller mAppWidgetContainer.removeWidget(mTransportControl); 1058bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller 1059bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller // XXX keep view attached so we still get show/hide events from AudioManager 1060bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller KeyguardHostView.this.addView(mTransportControl); 1061bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller mTransportControl.setVisibility(View.GONE); 1062e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller mViewStateManager.setTransportState(KeyguardViewStateManager.TRANSPORT_GONE); 106376017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka return true; 1064bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 106576017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka return false; 1066bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 1067bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller 1068bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller private void addTransportToWidgetPager() { 1069bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller if (getWidgetPosition(R.id.keyguard_transport_control) == -1) { 1070bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller KeyguardHostView.this.removeView(mTransportControl); 1071bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller // insert to left of camera if it exists, otherwise after right-most widget 1072bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller int lastWidget = mAppWidgetContainer.getChildCount() - 1; 1073bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller int position = 0; // handle no widget case 1074bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller if (lastWidget >= 0) { 10756cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung position = mAppWidgetContainer.isCameraPage(lastWidget) ? 10766cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung lastWidget : lastWidget + 1; 1077bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 1078bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller mAppWidgetContainer.addWidget(mTransportControl, position); 1079bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller mTransportControl.setVisibility(View.VISIBLE); 1080bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 1081bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller } 1082bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller 10837221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller private void initializeTransportControl() { 10844e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl = 10854e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller (KeyguardTransportControlView) findViewById(R.id.keyguard_transport_control); 1086223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportControl.setVisibility(View.GONE); 10874e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 10884e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller // This code manages showing/hiding the transport control. We keep it around and only 10894e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller // add it to the hierarchy if it needs to be present. 10904e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller if (mTransportControl != null) { 10914e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller mTransportControl.setKeyguardCallback(new TransportCallback() { 10924e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller @Override 1093223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onListenerDetached() { 109476017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka if (removeTransportFromWidgetPager()) { 109576017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka mTransportControl.post(mSwitchPageRunnable); 109676017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka } 10974e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 10984e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 10994e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller @Override 1100223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onListenerAttached() { 1101bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller // Transport will be added when playstate changes... 1102bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller mTransportControl.post(mSwitchPageRunnable); 11034e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 1104223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1105223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1106223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onPlayStateChanged() { 1107223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mTransportControl.post(mSwitchPageRunnable); 1108223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 11094e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller }); 11104e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 11114e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller } 11124e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller 111351117262c8fadb6d227d137e83ad66996b013141Jim Miller private int getInsertPageIndex() { 111467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget); 111551117262c8fadb6d227d137e83ad66996b013141Jim Miller int insertionIndex = mAppWidgetContainer.indexOfChild(addWidget); 111651117262c8fadb6d227d137e83ad66996b013141Jim Miller if (insertionIndex < 0) { 111751117262c8fadb6d227d137e83ad66996b013141Jim Miller insertionIndex = 0; // no add widget page found 111851117262c8fadb6d227d137e83ad66996b013141Jim Miller } else { 111951117262c8fadb6d227d137e83ad66996b013141Jim Miller insertionIndex++; // place after add widget 112067a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 112151117262c8fadb6d227d137e83ad66996b013141Jim Miller return insertionIndex; 112267a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 112367a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka 112467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka private void addDefaultStatusWidget(int index) { 112567a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka LayoutInflater inflater = LayoutInflater.from(mContext); 112667a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true); 112767a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka mAppWidgetContainer.addWidget(statusWidget, index); 112867a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 112967a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka 11301254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka private void addWidgetsFromSettings() { 113151117262c8fadb6d227d137e83ad66996b013141Jim Miller if (mSafeModeEnabled || widgetsDisabledByDpm()) { 113251117262c8fadb6d227d137e83ad66996b013141Jim Miller return; 1133b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } 1134f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller 113551117262c8fadb6d227d137e83ad66996b013141Jim Miller int insertionIndex = getInsertPageIndex(); 113620c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka 113720c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka // Add user-selected widget 1138aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka final int[] widgets = mLockPatternUtils.getAppWidgets(); 113967a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka 1140aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka if (widgets == null) { 1141aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka Log.d(TAG, "Problem reading widgets"); 1142aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka } else { 1143aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka for (int i = widgets.length -1; i >= 0; i--) { 11441254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka if (widgets[i] == LockPatternUtils.ID_DEFAULT_STATUS_WIDGET) { 114551117262c8fadb6d227d137e83ad66996b013141Jim Miller addDefaultStatusWidget(insertionIndex); 11461254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka } else { 1147aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // We add the widgets from left to right, starting after the first page after 1148aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // the add page. We count down, since the order will be persisted from right 1149aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka // to left, starting after camera. 115051117262c8fadb6d227d137e83ad66996b013141Jim Miller addWidget(widgets[i], insertionIndex, true); 1151aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka } 1152dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1153dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 115451117262c8fadb6d227d137e83ad66996b013141Jim Miller } 115551117262c8fadb6d227d137e83ad66996b013141Jim Miller 115651117262c8fadb6d227d137e83ad66996b013141Jim Miller private int allocateIdForDefaultAppWidget() { 115751117262c8fadb6d227d137e83ad66996b013141Jim Miller int appWidgetId; 115851117262c8fadb6d227d137e83ad66996b013141Jim Miller Resources res = getContext().getResources(); 115951117262c8fadb6d227d137e83ad66996b013141Jim Miller ComponentName defaultAppWidget = new ComponentName( 116051117262c8fadb6d227d137e83ad66996b013141Jim Miller res.getString(R.string.widget_default_package_name), 116151117262c8fadb6d227d137e83ad66996b013141Jim Miller res.getString(R.string.widget_default_class_name)); 116251117262c8fadb6d227d137e83ad66996b013141Jim Miller 116351117262c8fadb6d227d137e83ad66996b013141Jim Miller // Note: we don't support configuring the widget 116451117262c8fadb6d227d137e83ad66996b013141Jim Miller appWidgetId = mAppWidgetHost.allocateAppWidgetId(); 116551117262c8fadb6d227d137e83ad66996b013141Jim Miller 116651117262c8fadb6d227d137e83ad66996b013141Jim Miller try { 116751117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetManager.bindAppWidgetId(appWidgetId, defaultAppWidget); 116851117262c8fadb6d227d137e83ad66996b013141Jim Miller 116951117262c8fadb6d227d137e83ad66996b013141Jim Miller } catch (IllegalArgumentException e) { 117051117262c8fadb6d227d137e83ad66996b013141Jim Miller Log.e(TAG, "Error when trying to bind default AppWidget: " + e); 117151117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetHost.deleteAppWidgetId(appWidgetId); 117251117262c8fadb6d227d137e83ad66996b013141Jim Miller appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; 117351117262c8fadb6d227d137e83ad66996b013141Jim Miller } 117451117262c8fadb6d227d137e83ad66996b013141Jim Miller return appWidgetId; 117567a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 117667a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka public void checkAppWidgetConsistency() { 1177efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen // Since this method may bind a widget (which we can't do until boot completed) we 1178efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen // may have to defer it until after boot complete. 11794eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen if (!KeyguardUpdateMonitor.getInstance(mContext).hasBootCompleted()) { 1180efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen mCheckAppWidgetConsistencyOnBootCompleted = true; 1181efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen return; 1182efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen } 118367a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka final int childCount = mAppWidgetContainer.getChildCount(); 118467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka boolean widgetPageExists = false; 118567a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka for (int i = 0; i < childCount; i++) { 118651117262c8fadb6d227d137e83ad66996b013141Jim Miller if (mAppWidgetContainer.isWidgetPage(i)) { 118767a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka widgetPageExists = true; 118867a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka break; 118967a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 119067a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 119167a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka if (!widgetPageExists) { 119251117262c8fadb6d227d137e83ad66996b013141Jim Miller final int insertPageIndex = getInsertPageIndex(); 119351117262c8fadb6d227d137e83ad66996b013141Jim Miller 119451117262c8fadb6d227d137e83ad66996b013141Jim Miller final boolean userAddedWidgetsEnabled = !widgetsDisabledByDpm(); 119551117262c8fadb6d227d137e83ad66996b013141Jim Miller boolean addedDefaultAppWidget = false; 119651117262c8fadb6d227d137e83ad66996b013141Jim Miller 119751117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!mSafeModeEnabled) { 119851117262c8fadb6d227d137e83ad66996b013141Jim Miller if (userAddedWidgetsEnabled) { 119951117262c8fadb6d227d137e83ad66996b013141Jim Miller int appWidgetId = allocateIdForDefaultAppWidget(); 120051117262c8fadb6d227d137e83ad66996b013141Jim Miller if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 120151117262c8fadb6d227d137e83ad66996b013141Jim Miller addedDefaultAppWidget = addWidget(appWidgetId, insertPageIndex, true); 120251117262c8fadb6d227d137e83ad66996b013141Jim Miller } 120351117262c8fadb6d227d137e83ad66996b013141Jim Miller } else { 120451117262c8fadb6d227d137e83ad66996b013141Jim Miller // note: even if widgetsDisabledByDpm() returns true, we still bind/create 120551117262c8fadb6d227d137e83ad66996b013141Jim Miller // the default appwidget if possible 120651117262c8fadb6d227d137e83ad66996b013141Jim Miller int appWidgetId = mLockPatternUtils.getFallbackAppWidgetId(); 120751117262c8fadb6d227d137e83ad66996b013141Jim Miller if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { 120851117262c8fadb6d227d137e83ad66996b013141Jim Miller appWidgetId = allocateIdForDefaultAppWidget(); 120951117262c8fadb6d227d137e83ad66996b013141Jim Miller if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 121051117262c8fadb6d227d137e83ad66996b013141Jim Miller mLockPatternUtils.writeFallbackAppWidgetId(appWidgetId); 121151117262c8fadb6d227d137e83ad66996b013141Jim Miller } 121251117262c8fadb6d227d137e83ad66996b013141Jim Miller } 121351117262c8fadb6d227d137e83ad66996b013141Jim Miller if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 121451117262c8fadb6d227d137e83ad66996b013141Jim Miller addedDefaultAppWidget = addWidget(appWidgetId, insertPageIndex, false); 121551117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!addedDefaultAppWidget) { 121651117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetHost.deleteAppWidgetId(appWidgetId); 121751117262c8fadb6d227d137e83ad66996b013141Jim Miller mLockPatternUtils.writeFallbackAppWidgetId( 121851117262c8fadb6d227d137e83ad66996b013141Jim Miller AppWidgetManager.INVALID_APPWIDGET_ID); 121951117262c8fadb6d227d137e83ad66996b013141Jim Miller } 122051117262c8fadb6d227d137e83ad66996b013141Jim Miller } 122151117262c8fadb6d227d137e83ad66996b013141Jim Miller } 122267a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 122351117262c8fadb6d227d137e83ad66996b013141Jim Miller 122467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka // Use the built-in status/clock view if we can't inflate the default widget 122551117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!addedDefaultAppWidget) { 122651117262c8fadb6d227d137e83ad66996b013141Jim Miller addDefaultStatusWidget(insertPageIndex); 122751117262c8fadb6d227d137e83ad66996b013141Jim Miller } 122851117262c8fadb6d227d137e83ad66996b013141Jim Miller 122951117262c8fadb6d227d137e83ad66996b013141Jim Miller // trigger DB updates only if user-added widgets are enabled 123051117262c8fadb6d227d137e83ad66996b013141Jim Miller if (!mSafeModeEnabled && userAddedWidgetsEnabled) { 123151117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetContainer.onAddView( 123251117262c8fadb6d227d137e83ad66996b013141Jim Miller mAppWidgetContainer.getChildAt(insertPageIndex), insertPageIndex); 123367a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 123467a871d85732e582c70a2a1d85ef4419eb658a12Michael Jurka } 12350207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen } 12360207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen 1237223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller Runnable mSwitchPageRunnable = new Runnable() { 1238223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1239223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void run() { 1240223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller showAppropriateWidgetPage(); 1241223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1242223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller }; 1243223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1244223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller static class SavedState extends BaseSavedState { 1245223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller int transportState; 12461413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka int appWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID; 1247223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1248223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState(Parcelable superState) { 1249223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super(superState); 1250223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1251223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1252223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller private SavedState(Parcel in) { 1253223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super(in); 1254223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller this.transportState = in.readInt(); 12551413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka this.appWidgetToShow = in.readInt(); 1256223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1257223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1258223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1259223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void writeToParcel(Parcel out, int flags) { 1260223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.writeToParcel(out, flags); 1261223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller out.writeInt(this.transportState); 12621413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka out.writeInt(this.appWidgetToShow); 1263223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1264223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1265223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public static final Parcelable.Creator<SavedState> CREATOR 1266223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller = new Parcelable.Creator<SavedState>() { 1267223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public SavedState createFromParcel(Parcel in) { 1268223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return new SavedState(in); 1269223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1270223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1271223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public SavedState[] newArray(int size) { 1272223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return new SavedState[size]; 1273223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1274223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller }; 1275223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1276223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1277223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1278223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public Parcelable onSaveInstanceState() { 12795f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (DEBUG) Log.d(TAG, "onSaveInstanceState"); 1280223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller Parcelable superState = super.onSaveInstanceState(); 1281223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState ss = new SavedState(superState); 1282e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller ss.transportState = mViewStateManager.getTransportState(); 12831413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka ss.appWidgetToShow = mAppWidgetToShow; 1284223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return ss; 1285223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1286223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 1287223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller @Override 1288223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller public void onRestoreInstanceState(Parcelable state) { 12895f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (DEBUG) Log.d(TAG, "onRestoreInstanceState"); 1290223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller if (!(state instanceof SavedState)) { 1291223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.onRestoreInstanceState(state); 1292223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller return; 1293223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1294223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller SavedState ss = (SavedState) state; 1295223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller super.onRestoreInstanceState(ss.getSuperState()); 1296e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller mViewStateManager.setTransportState(ss.transportState); 12971413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka mAppWidgetToShow = ss.appWidgetToShow; 1298223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller post(mSwitchPageRunnable); 1299223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller } 1300223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller 13015f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock @Override 13025f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock public void onWindowFocusChanged(boolean hasWindowFocus) { 13035f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock super.onWindowFocusChanged(hasWindowFocus); 13045f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (DEBUG) Log.d(TAG, "Window is " + (hasWindowFocus ? "focused" : "unfocused")); 130576017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka if (hasWindowFocus && mShowSecurityWhenReturn) { 1306aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller SlidingChallengeLayout slider = 1307aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller (SlidingChallengeLayout) findViewById(R.id.sliding_layout); 1308aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller if (slider != null) { 1309aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller slider.setHandleAlpha(1); 1310aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller slider.showChallenge(true); 1311aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller } 1312aaf9b11e6232f159aa6d9863097b09bb435deae3Jim Miller mShowSecurityWhenReturn = false; 13135f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock } 13145f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock } 13155f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock 13160207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen private void showAppropriateWidgetPage() { 1317e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller int state = mViewStateManager.getTransportState(); 1318e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller boolean isMusicPlaying = mTransportControl.isMusicPlaying() 1319e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller || state == KeyguardViewStateManager.TRANSPORT_VISIBLE; 13205f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (isMusicPlaying) { 1321e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller mViewStateManager.setTransportState(KeyguardViewStateManager.TRANSPORT_VISIBLE); 1322bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller addTransportToWidgetPager(); 1323e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller } else if (state == KeyguardViewStateManager.TRANSPORT_VISIBLE) { 1324e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller mViewStateManager.setTransportState(KeyguardViewStateManager.TRANSPORT_INVISIBLE); 13250207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen } 13265f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock int pageToShow = getAppropriateWidgetPage(isMusicPlaying); 1327223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller mAppWidgetContainer.setCurrentPage(pageToShow); 1328dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1329dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1330dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock private CameraWidgetFrame findCameraPage() { 1331dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock for (int i = mAppWidgetContainer.getChildCount() - 1; i >= 0; i--) { 13326cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung if (mAppWidgetContainer.isCameraPage(i)) { 1333dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock return (CameraWidgetFrame) mAppWidgetContainer.getChildAt(i); 1334dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock } 1335dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock } 1336dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock return null; 1337dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock } 1338dbe24b7def8df3a539790827d3f395f4d933802bJohn Spurlock 13396cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung boolean isMusicPage(int pageIndex) { 13406cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung return pageIndex >= 0 && pageIndex == getWidgetPosition(R.id.keyguard_transport_control); 13416cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung } 13426cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung 13435f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock private int getAppropriateWidgetPage(boolean isMusicPlaying) { 1344358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock // assumes at least one widget (besides camera + add) 134576017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka if (mAppWidgetToShow != AppWidgetManager.INVALID_APPWIDGET_ID) { 134676017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka final int childCount = mAppWidgetContainer.getChildCount(); 134776017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka for (int i = 0; i < childCount; i++) { 134876017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka if (mAppWidgetContainer.getWidgetPageAt(i).getContentAppWidgetId() 134976017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka == mAppWidgetToShow) { 135076017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka return i; 135176017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka } 135276017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka } 135376017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka mAppWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID; 135476017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka } 1355358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock // if music playing, show transport 13565f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (isMusicPlaying) { 1357358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock if (DEBUG) Log.d(TAG, "Music playing, show transport"); 1358bdca3c0a21ba15e8bb6d7ef0ca1b7e8024f98f19Jim Miller return mAppWidgetContainer.getWidgetPageIndex(mTransportControl); 1359358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock } 1360358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock 13615f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock // else show the right-most widget (except for camera) 1362358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock int rightMost = mAppWidgetContainer.getChildCount() - 1; 13636cf53bb3a94ec5a6eebc96a315dac32d042f1945Winson Chung if (mAppWidgetContainer.isCameraPage(rightMost)) { 1364358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock rightMost--; 1365358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock } 13665f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock if (DEBUG) Log.d(TAG, "Show right-most page " + rightMost); 1367358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock return rightMost; 1368358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock } 1369358148e386a20801430aaf6f3f7ca02807cd71c3John Spurlock 137019a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller private void enableUserSelectorIfNecessary() { 137126e6c2e44235428717d7152b9e6398649452f1d2Jim Miller if (!UserManager.supportsMultipleUsers()) { 137226e6c2e44235428717d7152b9e6398649452f1d2Jim Miller return; // device doesn't support multi-user mode 137326e6c2e44235428717d7152b9e6398649452f1d2Jim Miller } 1374f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 1375d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren if (um == null) { 1376d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Throwable t = new Throwable(); 1377d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren t.fillInStackTrace(); 1378d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Log.e(TAG, "user service is null.", t); 1379d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren return; 1380d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren } 138126e6c2e44235428717d7152b9e6398649452f1d2Jim Miller 13825f050e5c2c1616c7f0795c4f13e42a5d150b8015John Spurlock // if there are multiple users, we need to enable to multi-user switcher 1383f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller final List<UserInfo> users = um.getUsers(true); 1384d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren if (users == null) { 1385d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Throwable t = new Throwable(); 1386d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren t.fillInStackTrace(); 1387d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Log.e(TAG, "list of users is null.", t); 1388d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren return; 1389d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren } 139066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 1391f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller final View multiUserView = findViewById(R.id.keyguard_user_selector); 1392f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller if (multiUserView == null) { 1393f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller Throwable t = new Throwable(); 1394f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller t.fillInStackTrace(); 1395f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller Log.e(TAG, "can't find user_selector in layout.", t); 1396f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller return; 1397f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller } 1398f6ab5f9e3e7562b6ebb61ac149eb3cf9b08c443fJim Miller 1399d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren if (users.size() > 1) { 140091f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren if (multiUserView instanceof KeyguardMultiUserSelectorView) { 140191f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren KeyguardMultiUserSelectorView multiUser = 140291f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren (KeyguardMultiUserSelectorView) multiUserView; 140391f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren multiUser.setVisibility(View.VISIBLE); 1404d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren multiUser.addUsers(users); 140591f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren UserSwitcherCallback callback = new UserSwitcherCallback() { 140691f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren @Override 140791f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren public void hideSecurityView(int duration) { 140891f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren mSecurityViewContainer.animate().alpha(0).setDuration(duration); 140991f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren } 141024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen 141191f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren @Override 141291f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren public void showSecurityView() { 141391f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren mSecurityViewContainer.setAlpha(1.0f); 141491f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren } 14150a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 141691f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren @Override 141791f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren public void showUnlockHint() { 141891f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren if (mKeyguardSelectorView != null) { 141991f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren mKeyguardSelectorView.showUsabilityHint(); 142091f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren } 14210ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 14220a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 142391f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren @Override 142491f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren public void userActivity() { 142591f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren if (mViewMediatorCallback != null) { 142691f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren mViewMediatorCallback.userActivity(); 142791f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren } 142819a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller } 142991f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren }; 143091f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren multiUser.setCallback(callback); 1431d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren } else { 1432d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Throwable t = new Throwable(); 1433d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren t.fillInStackTrace(); 1434d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren if (multiUserView == null) { 1435d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Log.e(TAG, "could not find the user_selector.", t); 1436d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren } else { 1437d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren Log.e(TAG, "user_selector is the wrong type.", t); 1438d2dec00a0a072dd0e71b2194ce919cd134d926edChris Wren } 143991f080c77739e32f377e1a9cb5c8d0ec5d50138fChris Wren } 144066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 144166b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 144266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 1443dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 1444dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void cleanUp() { 1445dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1446dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1447dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 144895b005c196de2f99513da28fe9108b2dec200140Jim Miller /** 144995b005c196de2f99513da28fe9108b2dec200140Jim Miller * In general, we enable unlocking the insecure keyguard with the menu key. However, there are 145095b005c196de2f99513da28fe9108b2dec200140Jim Miller * some cases where we wish to disable it, notably when the menu button placement or technology 145195b005c196de2f99513da28fe9108b2dec200140Jim Miller * is prone to false positives. 145295b005c196de2f99513da28fe9108b2dec200140Jim Miller * 145395b005c196de2f99513da28fe9108b2dec200140Jim Miller * @return true if the menu key should be enabled 145495b005c196de2f99513da28fe9108b2dec200140Jim Miller */ 145595b005c196de2f99513da28fe9108b2dec200140Jim Miller private static final String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key"; 145695b005c196de2f99513da28fe9108b2dec200140Jim Miller private boolean shouldEnableMenuKey() { 145795b005c196de2f99513da28fe9108b2dec200140Jim Miller final Resources res = getResources(); 1458258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller final boolean configDisabled = res.getBoolean( 1459258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller com.android.internal.R.bool.config_disableMenuKeyInLockScreen); 146095b005c196de2f99513da28fe9108b2dec200140Jim Miller final boolean isTestHarness = ActivityManager.isRunningInTestHarness(); 146195b005c196de2f99513da28fe9108b2dec200140Jim Miller final boolean fileOverride = (new File(ENABLE_MENU_KEY_FILE)).exists(); 146295b005c196de2f99513da28fe9108b2dec200140Jim Miller return !configDisabled || isTestHarness || fileOverride; 146395b005c196de2f99513da28fe9108b2dec200140Jim Miller } 146495b005c196de2f99513da28fe9108b2dec200140Jim Miller 146575931e05470992d51d135d09031902fd1b3fdbc7Jim Miller 146695b005c196de2f99513da28fe9108b2dec200140Jim Miller 14676bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller public void goToUserSwitcher() { 14686bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_multi_user_selector)); 14696bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller } 14706bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller 147176017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka public void goToWidget(int appWidgetId) { 147276017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka mAppWidgetToShow = appWidgetId; 147376017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka mSwitchPageRunnable.run(); 147476017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka } 147576017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka 147675931e05470992d51d135d09031902fd1b3fdbc7Jim Miller public boolean handleMenuKey() { 147775931e05470992d51d135d09031902fd1b3fdbc7Jim Miller // The following enables the MENU key to work for testing automation 147875931e05470992d51d135d09031902fd1b3fdbc7Jim Miller if (shouldEnableMenuKey()) { 147975931e05470992d51d135d09031902fd1b3fdbc7Jim Miller showNextSecurityScreenOrFinish(false); 148075931e05470992d51d135d09031902fd1b3fdbc7Jim Miller return true; 148175931e05470992d51d135d09031902fd1b3fdbc7Jim Miller } 148275931e05470992d51d135d09031902fd1b3fdbc7Jim Miller return false; 148375931e05470992d51d135d09031902fd1b3fdbc7Jim Miller } 148475931e05470992d51d135d09031902fd1b3fdbc7Jim Miller 14850a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller public boolean handleBackKey() { 14860a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller if (mCurrentSecuritySelection != SecurityMode.None) { 14870a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller mCallback.dismiss(false); 14880a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller return true; 14890a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller } 14900a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller return false; 14910a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller } 14920a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller 1493ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner /** 1494ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner * Dismisses the keyguard by going to the next screen or making it gone. 1495ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner */ 1496ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner public void dismiss() { 1497ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner showNextSecurityScreenOrFinish(false); 1498ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner } 14994eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller 15004eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller public void showAssistant() { 15014eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) 15024eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller .getAssistIntent(mContext, UserHandle.USER_CURRENT); 15034eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller 15044eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller if (intent == null) return; 15054eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller 15064eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, 15074eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller R.anim.keyguard_action_assist_enter, R.anim.keyguard_action_assist_exit, 15084eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller getHandler(), null); 15094eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller 15104eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 15114eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller 15126ed3fcafdbdeda9a10a62bbd0e5997017e8e2635Daniel Sandler mActivityLauncher.launchActivityWithAnimation( 15136ed3fcafdbdeda9a10a62bbd0e5997017e8e2635Daniel Sandler intent, false, opts.toBundle(), null, null); 15144eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller } 1515dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller} 1516