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