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