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