KeyguardHostView.java revision dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4b
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();
164d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        maybePopulateWidgets();
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);
173d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
174d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        mViewStateManager.setPagedView(mAppWidgetContainer);
17519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller        mViewStateManager.setChallengeLayout(slider != null ? slider :
17619a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller                (ChallengeLayout) findViewById(R.id.multi_pane_challenge));
1776fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen        mSecurityViewContainer = (KeyguardSecurityViewFlipper) findViewById(R.id.view_flipper);
1780a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen        mKeyguardSelectorView = (KeyguardSelectorView) findViewById(R.id.keyguard_selector_view);
1796fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen        mViewStateManager.setSecurityViewContainer(mSecurityViewContainer);
180ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller
1816fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen        mViewStateManager.showUsabilityHints();
182d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
183e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        updateSecurityViews();
184d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        if (!(mContext instanceof Activity)) {
185d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller            setSystemUiVisibility(getSystemUiVisibility() | View.STATUS_BAR_DISABLE_BACK);
186d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        }
18768c2489457631f733f542e14058c6d1274c203deJim Miller
1880ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        if (KeyguardUpdateMonitor.getInstance(mContext).getIsFirstBoot()) {
1890ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            showPrimarySecurityScreen(false);
1900ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        }
191e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller    }
192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
193e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller    private void updateSecurityViews() {
194e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        int children = mSecurityViewContainer.getChildCount();
195e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        for (int i = 0; i < children; i++) {
196e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            updateSecurityView(mSecurityViewContainer.getChildAt(i));
197e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        }
198e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller    }
199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
200e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller    private void updateSecurityView(View view) {
201e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        if (view instanceof KeyguardSecurityView) {
202e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            KeyguardSecurityView ksv = (KeyguardSecurityView) view;
203e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            ksv.setKeyguardCallback(mCallback);
204e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            ksv.setLockPatternUtils(mLockPatternUtils);
205e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        } else {
206e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            Log.w(TAG, "View " + view + " is not a KeyguardSecurityView");
207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    void setLockPatternUtils(LockPatternUtils utils) {
211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mSecurityModel.setLockPatternUtils(utils);
212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = utils;
213e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        updateSecurityViews();
214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    protected void onAttachedToWindow() {
218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super.onAttachedToWindow();
219dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mAppWidgetHost.startListening();
220223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        post(mSwitchPageRunnable);
2217221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller    }
2227221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller
223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    protected void onDetachedFromWindow() {
225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super.onDetachedFromWindow();
226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mAppWidgetHost.stopListening();
227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
229f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller    private AppWidgetHost getAppWidgetHost() {
230dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mAppWidgetHost;
231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
233d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    void addWidget(AppWidgetHostView view, int pageIndex) {
234d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        mAppWidgetContainer.addWidget(view, pageIndex);
235dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
236dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
237838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller    private KeyguardWidgetPager.Callbacks mWidgetCallbacks
238838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller            = new KeyguardWidgetPager.Callbacks() {
239c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        @Override
240c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        public void userActivity() {
241c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown            if (mViewMediatorCallback != null) {
242c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown                mViewMediatorCallback.userActivity();
243c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown            }
244c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        }
245c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown
246c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        @Override
247c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        public void onUserActivityTimeoutChanged() {
248c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown            if (mViewMediatorCallback != null) {
249c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown                mViewMediatorCallback.onUserActivityTimeoutChanged();
250c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown            }
251c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        }
252c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown    };
253c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown
254c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown    @Override
255c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown    public long getUserActivityTimeout() {
256c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        // Currently only considering user activity timeouts needed by widgets.
257c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        // Could also take into account longer timeouts for certain security views.
258838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller        if (mAppWidgetContainer != null) {
259838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller            return mAppWidgetContainer.getUserActivityTimeout();
260c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        }
261c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        return -1;
262c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown    }
263c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown
264dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private KeyguardSecurityCallback mCallback = new KeyguardSecurityCallback() {
265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void userActivity(long timeout) {
2677def1db03943251fe8cb57ec514722026425479eCraig Mautner            if (mViewMediatorCallback != null) {
2683dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown                mViewMediatorCallback.userActivity(timeout);
2697def1db03943251fe8cb57ec514722026425479eCraig Mautner            }
270dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
271dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
272dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void dismiss(boolean authenticated) {
273dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            showNextSecurityScreenOrFinish(authenticated);
274dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
275dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
276dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public boolean isVerifyUnlockOnly() {
277258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            return mIsVerifyUnlockOnly;
278dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
279dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
280dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void reportSuccessfulUnlockAttempt() {
281258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            KeyguardUpdateMonitor.getInstance(mContext).clearFailedUnlockAttempts();
2827641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller            mLockPatternUtils.reportSuccessfulPasswordAttempt();
283dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
284dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
285dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void reportFailedUnlockAttempt() {
2867641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller            if (mCurrentSecuritySelection == SecurityMode.Biometric) {
2877641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller                KeyguardUpdateMonitor.getInstance(mContext).reportFailedBiometricUnlockAttempt();
2887641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller            } else {
2897641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller                KeyguardHostView.this.reportFailedUnlockAttempt();
2907641506e3cc493ac4e6f5037fd76516754e61c6eJim Miller            }
291dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
292dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
293dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public int getFailedAttempts() {
294258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            return KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts();
295dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
296dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
297258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        @Override
298258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        public void showBackupSecurity() {
2990ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            KeyguardHostView.this.showBackupSecurityScreen();
300dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
301dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
3025f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        @Override
3035f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        public void setOnDismissRunnable(Runnable runnable) {
3045f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            KeyguardHostView.this.setOnDismissRunnable(runnable);
3055f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        }
3065f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller
307dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    };
308dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
309258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    private void showDialog(String title, String message) {
310258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        final AlertDialog dialog = new AlertDialog.Builder(mContext)
311258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            .setTitle(title)
312258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            .setMessage(message)
313258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            .setNeutralButton(com.android.internal.R.string.ok, null)
314258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            .create();
315258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        if (!(mContext instanceof Activity)) {
316258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
317258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        }
318258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        dialog.show();
319258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    }
320258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
321258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    private void showTimeoutDialog() {
322258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000;
323258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        int messageId = 0;
324258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
325258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        switch (mSecurityModel.getSecurityMode()) {
326258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            case Pattern:
327258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                messageId = R.string.kg_too_many_failed_pattern_attempts_dialog_message;
328258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                break;
32969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            case PIN:
33069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                messageId = R.string.kg_too_many_failed_pin_attempts_dialog_message;
33169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                break;
33269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            case Password:
33369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                messageId = R.string.kg_too_many_failed_password_attempts_dialog_message;
334258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                break;
335258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        }
336258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
337258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        if (messageId != 0) {
338258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            final String message = mContext.getString(messageId,
339258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                    KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(),
340258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                    timeoutInSeconds);
341258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            showDialog(null, message);
342258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        }
343258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    }
344258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
345258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    private void showAlmostAtWipeDialog(int attempts, int remaining) {
346258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000;
347258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        String message = mContext.getString(R.string.kg_failed_attempts_almost_at_wipe,
348258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                attempts, remaining);
349258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        showDialog(null, message);
350258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    }
351258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
352258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    private void showWipeDialog(int attempts) {
353258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        String message = mContext.getString(R.string.kg_failed_attempts_now_wiping, attempts);
354258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        showDialog(null, message);
355258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    }
356258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
357258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    private void showAlmostAtAccountLoginDialog() {
358258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        final int timeoutInSeconds = (int) LockPatternUtils.FAILED_ATTEMPT_TIMEOUT_MS / 1000;
359258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        final int count = LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET
360258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                - LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT;
361258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        String message = mContext.getString(R.string.kg_failed_attempts_almost_at_login,
362258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                count, LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT, timeoutInSeconds);
363258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        showDialog(null, message);
364258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    }
365258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
366258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    private void reportFailedUnlockAttempt() {
367258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
368258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        final int failedAttempts = monitor.getFailedUnlockAttempts() + 1; // +1 for this time
369258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
370258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        if (DEBUG) Log.d(TAG, "reportFailedPatternAttempt: #" + failedAttempts);
371258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
372258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        SecurityMode mode = mSecurityModel.getSecurityMode();
373258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        final boolean usingPattern = mode == KeyguardSecurityModel.SecurityMode.Pattern;
374258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
375258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        final int failedAttemptsBeforeWipe = mLockPatternUtils.getDevicePolicyManager()
376599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani                .getMaximumFailedPasswordsForWipe(null, mLockPatternUtils.getCurrentUser());
377258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
378258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        final int failedAttemptWarning = LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET
379258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                - LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT;
380258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
381258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        final int remainingBeforeWipe = failedAttemptsBeforeWipe > 0 ?
382258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                (failedAttemptsBeforeWipe - failedAttempts)
383258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                : Integer.MAX_VALUE; // because DPM returns 0 if no restriction
384258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
38508b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller        boolean showTimeout = false;
386258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        if (remainingBeforeWipe < LockPatternUtils.FAILED_ATTEMPTS_BEFORE_WIPE_GRACE) {
387258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            // If we reach this code, it means the user has installed a DevicePolicyManager
388258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            // that requests device wipe after N attempts.  Once we get below the grace
389258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            // period, we'll post this dialog every time as a clear warning until the
390258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            // bombshell hits and the device is wiped.
391258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            if (remainingBeforeWipe > 0) {
392258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                showAlmostAtWipeDialog(failedAttempts, remainingBeforeWipe);
393258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            } else {
394258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                // Too many attempts. The device will be wiped shortly.
395258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                Slog.i(TAG, "Too many unlock attempts; device will be wiped!");
396258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                showWipeDialog(failedAttempts);
397258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            }
398258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        } else {
39908b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller            showTimeout =
400258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                (failedAttempts % LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) == 0;
401258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            if (usingPattern && mEnableFallback) {
402258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                if (failedAttempts == failedAttemptWarning) {
403258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                    showAlmostAtAccountLoginDialog();
404258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                    showTimeout = false; // don't show both dialogs
405258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                } else if (failedAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET) {
406258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                    mLockPatternUtils.setPermanentlyLocked(true);
407e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                    showSecurityScreen(SecurityMode.Account);
408258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                    // don't show timeout dialog because we show account unlock screen next
409258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                    showTimeout = false;
410258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                }
411258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            }
412258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        }
413258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        monitor.reportFailedUnlockAttempt();
414258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        mLockPatternUtils.reportFailedPasswordAttempt();
41508b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller        if (showTimeout) {
41608b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller            showTimeoutDialog();
41708b2b6bfe2550b65c68ad7b4bef8283f1ff17561Jim Miller        }
418258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    }
419258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
420258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    /**
4210ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller     * Shows the primary security screen for the user. This will be either the multi-selector
4220ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller     * or the user's security method.
4230ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller     * @param turningOff true if the device is being turned off
4240ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller     */
4250ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller    void showPrimarySecurityScreen(boolean turningOff) {
4260ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        SecurityMode securityMode = mSecurityModel.getSecurityMode();
4270ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")");
4280ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        if (!turningOff && KeyguardUpdateMonitor.getInstance(mContext).isAlternateUnlockEnabled()) {
4290ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            // If we're not turning off, then allow biometric alternate.
4300ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            // We'll reload it when the device comes back on.
4310ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            securityMode = mSecurityModel.getAlternateFor(securityMode);
4320ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        }
4330ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        showSecurityScreen(securityMode);
4340ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller    }
43568c2489457631f733f542e14058c6d1274c203deJim Miller
4360ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller    /**
437258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller     * Shows the backup security screen for the current security mode.  This could be used for
438258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller     * password recovery screens but is currently only used for pattern unlock to show the
439258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller     * account unlock screen and biometric unlock to show the user's normal unlock.
440258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller     */
4410ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller    private void showBackupSecurityScreen() {
44261413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett        if (DEBUG) Log.d(TAG, "showBackupSecurity()");
44363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        SecurityMode backup = mSecurityModel.getBackupSecurityMode(mCurrentSecuritySelection);
44463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        showSecurityScreen(backup);
445258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    }
446258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
4470a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen    public boolean showNextSecurityScreenIfPresent() {
4480a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen        SecurityMode securityMode = mSecurityModel.getSecurityMode();
4490a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen        // Allow an alternate, such as biometric unlock
4500a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen        securityMode = mSecurityModel.getAlternateFor(securityMode);
4510a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen        if (SecurityMode.None == securityMode) {
4520a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen            return false;
4530a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen        } else {
4540a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen            showSecurityScreen(securityMode); // switch to the alternate security view
4550a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen            return true;
4560a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen        }
4570a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen    }
4580a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen
459258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    private void showNextSecurityScreenOrFinish(boolean authenticated) {
46061413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett        if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")");
461dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean finish = false;
462e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        if (SecurityMode.None == mCurrentSecuritySelection) {
463258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            SecurityMode securityMode = mSecurityModel.getSecurityMode();
464258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            // Allow an alternate, such as biometric unlock
465000464ac012471d301c6e48a8228291519915e17Jim Miller            securityMode = mSecurityModel.getAlternateFor(securityMode);
466e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            if (SecurityMode.None == securityMode) {
467dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                finish = true; // no security required
468dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            } else {
469e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                showSecurityScreen(securityMode); // switch to the alternate security view
470dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
471dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        } else if (authenticated) {
472e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            switch (mCurrentSecuritySelection) {
473e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                case Pattern:
474e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                case Password:
47569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                case PIN:
476e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                case Account:
477e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                case Biometric:
4784b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    finish = true;
4794b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    break;
4804b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller
481e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                case SimPin:
482e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                case SimPuk:
4834b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home
4844b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    SecurityMode securityMode = mSecurityModel.getSecurityMode();
4854b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    if (securityMode != SecurityMode.None) {
486e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                        showSecurityScreen(securityMode);
4874b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    } else {
4884b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                        finish = true;
4894b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    }
4904b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    break;
4914b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller
4924b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                default:
4930ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller                    Log.v(TAG, "Bad security screen " + mCurrentSecuritySelection + ", fail safe");
4940ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller                    showPrimarySecurityScreen(false);
4954b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    break;
496dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
497dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        } else {
4980ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            showPrimarySecurityScreen(false);
499dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
500dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (finish) {
5010ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            // If the alternate unlock was suppressed, it can now be safely
5020ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            // enabled because the user has left keyguard.
5030ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true);
5040ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            KeyguardUpdateMonitor.getInstance(mContext).setIsFirstBoot(false);
50568c2489457631f733f542e14058c6d1274c203deJim Miller
506dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            // If there's a pending runnable because the user interacted with a widget
507dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            // and we're leaving keyguard, then run it.
508dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            if (mLaunchRunnable != null) {
509dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                mLaunchRunnable.run();
510dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                mLaunchRunnable = null;
511dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
5127def1db03943251fe8cb57ec514722026425479eCraig Mautner            if (mViewMediatorCallback != null) {
5137def1db03943251fe8cb57ec514722026425479eCraig Mautner                mViewMediatorCallback.keyguardDone(true);
5147def1db03943251fe8cb57ec514722026425479eCraig Mautner            }
515b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller        } else {
516b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller            mViewStateManager.showBouncer(true);
517dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
518dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
519dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
520dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private OnClickHandler mOnClickHandler = new OnClickHandler() {
521dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
522dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public boolean onClickHandler(final View view,
523dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                final android.app.PendingIntent pendingIntent,
524dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                final Intent fillInIntent) {
525dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            if (pendingIntent.isActivity()) {
5265f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                setOnDismissRunnable(new Runnable() {
527dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    public void run() {
528dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        try {
529dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                              // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT?
530dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                              Context context = view.getContext();
531dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                              ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view,
532dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                                      0, 0,
533dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                                      view.getMeasuredWidth(), view.getMeasuredHeight());
534dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                              context.startIntentSender(
535dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                                      pendingIntent.getIntentSender(), fillInIntent,
536dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                                      Intent.FLAG_ACTIVITY_NEW_TASK,
537dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                                      Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle());
538dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                          } catch (IntentSender.SendIntentException e) {
539dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                              android.util.Log.e(TAG, "Cannot send pending intent: ", e);
540dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                          } catch (Exception e) {
541dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                              android.util.Log.e(TAG, "Cannot send pending intent due to " +
542dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                                      "unknown exception: ", e);
543dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                          }
544dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
5455f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                });
546dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
547dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                mCallback.dismiss(false);
548dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                return true;
549dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            } else {
550dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                return super.onClickHandler(view, pendingIntent, fillInIntent);
551dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
552dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        };
553dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    };
554dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
5550ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller    private KeyguardStatusViewManager mKeyguardStatusViewManager;
5560ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller
55763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller    // Used to ignore callbacks from methods that are no longer current (e.g. face unlock).
55863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller    // This avoids unwanted asynchronous events from messing with the state.
55963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller    private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() {
56063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller
56163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        @Override
56263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        public void userActivity(long timeout) {
56363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        }
56463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller
56563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        @Override
56663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        public void showBackupSecurity() {
56763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        }
56863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller
56963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        @Override
57063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        public void setOnDismissRunnable(Runnable runnable) {
57163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        }
57263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller
57363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        @Override
57463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        public void reportSuccessfulUnlockAttempt() {
57563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        }
57663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller
57763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        @Override
57863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        public void reportFailedUnlockAttempt() {
57963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        }
58063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller
58163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        @Override
58263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        public boolean isVerifyUnlockOnly() {
58363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller            return false;
58463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        }
58563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller
58663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        @Override
58763f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        public int getFailedAttempts() {
58863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller            return 0;
58963f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        }
59063f9b81795559443e0376985f8aaaa97a359ef94Jim Miller
59163f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        @Override
59263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        public void dismiss(boolean securityVerified) {
59363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        }
59463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller    };
59563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller
596dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
597dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void reset() {
598258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        mIsVerifyUnlockOnly = false;
599ff2aa0bc8919c247bfc8e81d3f168e5064f52ffbJim Miller        mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_status_view));
600dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
601dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
6025f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    /**
6035f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller     *  Sets a runnable to run when keyguard is dismissed
6045f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller     * @param runnable
6055f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller     */
6065f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    protected void setOnDismissRunnable(Runnable runnable) {
6075f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        mLaunchRunnable = runnable;
6085f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    }
6095f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller
610e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller    private KeyguardSecurityView getSecurityView(SecurityMode securityMode) {
611e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        final int securityViewIdForMode = getSecurityViewIdForMode(securityMode);
612e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        KeyguardSecurityView view = null;
613e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        final int children = mSecurityViewContainer.getChildCount();
614dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        for (int child = 0; child < children; child++) {
615e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            if (mSecurityViewContainer.getChildAt(child).getId() == securityViewIdForMode) {
616e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                view = ((KeyguardSecurityView)mSecurityViewContainer.getChildAt(child));
617e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                break;
618dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
619dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
620838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller        boolean simPukFullScreen = getResources().getBoolean(
621838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller                com.android.internal.R.bool.kg_sim_puk_account_full_screen);
62263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        int layoutId = getLayoutIdFor(securityMode);
62363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        if (view == null && layoutId != 0) {
624e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            final LayoutInflater inflater = LayoutInflater.from(mContext);
625bdffd5c3a18e67443ebbd16d4f0349d0728285b1Jim Miller            if (DEBUG) Log.v(TAG, "inflating id = " + layoutId);
62663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller            View v = inflater.inflate(layoutId, this, false);
627e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            mSecurityViewContainer.addView(v);
628e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            updateSecurityView(v);
6290ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller
630e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            view = (KeyguardSecurityView) v;
6310ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            TextView navigationText = ((TextView) findViewById(R.id.keyguard_message_area));
6320ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller
6330ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            // Some devices can fit a navigation area, others cannot. On devices that cannot,
6340ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            // we display the security message in status area.
6350ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            if (navigationText != null) {
6360ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller                view.setSecurityMessageDisplay(new KeyguardNavigationManager(navigationText));
6370ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            } else {
6380ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller                view.setSecurityMessageDisplay(mKeyguardStatusViewManager);
6390ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            }
6400ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        }
6410ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller
6426f131416ba4ff48067dc4e627971391a6b6778c4Adam Cohen        if (securityMode == SecurityMode.SimPin || securityMode == SecurityMode.SimPuk ||
6436f131416ba4ff48067dc4e627971391a6b6778c4Adam Cohen            securityMode == SecurityMode.Account) {
6440ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            if (simPukFullScreen) {
645838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller                mAppWidgetContainer.setVisibility(View.GONE);
6460ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            }
647e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        }
6480ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller
6490ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        if (view instanceof KeyguardSelectorView) {
6500ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            KeyguardSelectorView selectorView = (KeyguardSelectorView) view;
6510ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            View carrierText = selectorView.findViewById(R.id.keyguard_selector_fade_container);
6520ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller            selectorView.setCarrierArea(carrierText);
6530ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        }
65468c2489457631f733f542e14058c6d1274c203deJim Miller
655e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        return view;
656dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
657dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
658258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller    /**
659258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller     * Switches to the given security view unless it's already being shown, in which case
660258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller     * this is a no-op.
661258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller     *
662e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller     * @param securityMode
663258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller     */
664e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller    private void showSecurityScreen(SecurityMode securityMode) {
66568c2489457631f733f542e14058c6d1274c203deJim Miller        if (DEBUG) Log.d(TAG, "showSecurityScreen(" + securityMode + ")");
66668c2489457631f733f542e14058c6d1274c203deJim Miller
667e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        if (securityMode == mCurrentSecuritySelection) return;
668dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
669e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        KeyguardSecurityView oldView = getSecurityView(mCurrentSecuritySelection);
670e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        KeyguardSecurityView newView = getSecurityView(securityMode);
671dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
672dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // Emulate Activity life cycle
67363f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        if (oldView != null) {
67463f9b81795559443e0376985f8aaaa97a359ef94Jim Miller            oldView.onPause();
67563f9b81795559443e0376985f8aaaa97a359ef94Jim Miller            oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view
67663f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        }
677dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        newView.onResume();
67863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        newView.setKeyguardCallback(mCallback);
679dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
680cd03a26f4f5663b40d4679de102519ccc163fa10Craig Mautner        final boolean needsInput = newView.needsInput();
6817def1db03943251fe8cb57ec514722026425479eCraig Mautner        if (mViewMediatorCallback != null) {
682cd03a26f4f5663b40d4679de102519ccc163fa10Craig Mautner            mViewMediatorCallback.setNeedsInput(needsInput);
6837def1db03943251fe8cb57ec514722026425479eCraig Mautner        }
684dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
685dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // Find and show this child.
686e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        final int childCount = mSecurityViewContainer.getChildCount();
6874b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller
68861413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett        // Do flip animation to the next screen
68968c2489457631f733f542e14058c6d1274c203deJim Miller        if (false) {
69068c2489457631f733f542e14058c6d1274c203deJim Miller            mSecurityViewContainer.setInAnimation(
69168c2489457631f733f542e14058c6d1274c203deJim Miller                    AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_animate_in));
69268c2489457631f733f542e14058c6d1274c203deJim Miller            mSecurityViewContainer.setOutAnimation(
69368c2489457631f733f542e14058c6d1274c203deJim Miller                    AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_animate_out));
69468c2489457631f733f542e14058c6d1274c203deJim Miller        }
695e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        final int securityViewIdForMode = getSecurityViewIdForMode(securityMode);
696dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        for (int i = 0; i < childCount; i++) {
697e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            if (mSecurityViewContainer.getChildAt(i).getId() == securityViewIdForMode) {
698e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller                mSecurityViewContainer.setDisplayedChild(i);
699dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                break;
700dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
701dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
702258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
703e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        if (securityMode == SecurityMode.None) {
704e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller            // Discard current runnable if we're switching back to the selector view
705258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller            setOnDismissRunnable(null);
70668c2489457631f733f542e14058c6d1274c203deJim Miller        }
707e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        mCurrentSecuritySelection = securityMode;
708dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
709dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
710dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
711dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void onScreenTurnedOn() {
712dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (DEBUG) Log.d(TAG, "screen on");
7130ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        showPrimarySecurityScreen(false);
714e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        getSecurityView(mCurrentSecuritySelection).onResume();
715d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller
716d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller        // This is a an attempt to fix bug 7137389 where the device comes back on but the entire
717d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller        // layout is blank but forcing a layout causes it to reappear (e.g. with with
718d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller        // hierarchyviewer).
719d03a5558350cb6adff68aaf97ad4ee946bcd91a1Jim Miller        requestLayout();
7206fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen
7216fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen        if (mViewStateManager != null) {
7226fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen            mViewStateManager.showUsabilityHints();
7236fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen        }
724dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
725dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
726dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
727dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void onScreenTurnedOff() {
728dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (DEBUG) Log.d(TAG, "screen off");
7290ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        showPrimarySecurityScreen(true);
730e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        getSecurityView(mCurrentSecuritySelection).onPause();
731dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
732dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
733dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
734dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void show() {
735086977094d96ab9352432e0941a05b09cefc92acJim Miller        if (DEBUG) Log.d(TAG, "show()");
736086977094d96ab9352432e0941a05b09cefc92acJim Miller        showPrimarySecurityScreen(false);
737dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
738dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
739dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private boolean isSecure() {
740dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        SecurityMode mode = mSecurityModel.getSecurityMode();
741dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        switch (mode) {
742dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            case Pattern:
743dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                return mLockPatternUtils.isLockPatternEnabled();
744dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            case Password:
74569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            case PIN:
746dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                return mLockPatternUtils.isLockPasswordEnabled();
747dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            case SimPin:
748dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            case SimPuk:
749dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            case Account:
750dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                return true;
751dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            case None:
752dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                return false;
753dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            default:
754dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                throw new IllegalStateException("Unknown security mode " + mode);
755dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
756dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
757dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
758dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
759dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void wakeWhenReadyTq(int keyCode) {
760dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (DEBUG) Log.d(TAG, "onWakeKey");
761dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (keyCode == KeyEvent.KEYCODE_MENU && isSecure()) {
762dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            if (DEBUG) Log.d(TAG, "switching screens to unlock screen because wake key was MENU");
763e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            showSecurityScreen(SecurityMode.None);
764dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        } else {
765dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            if (DEBUG) Log.d(TAG, "poking wake lock immediately");
7667def1db03943251fe8cb57ec514722026425479eCraig Mautner        }
7677def1db03943251fe8cb57ec514722026425479eCraig Mautner        if (mViewMediatorCallback != null) {
7683dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown            mViewMediatorCallback.wakeUp();
769dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
770dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
771dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
772dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
773dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void verifyUnlock() {
774dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        SecurityMode securityMode = mSecurityModel.getSecurityMode();
775dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (securityMode == KeyguardSecurityModel.SecurityMode.None) {
7767def1db03943251fe8cb57ec514722026425479eCraig Mautner            if (mViewMediatorCallback != null) {
7777def1db03943251fe8cb57ec514722026425479eCraig Mautner                mViewMediatorCallback.keyguardDone(true);
7787def1db03943251fe8cb57ec514722026425479eCraig Mautner            }
779dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        } else if (securityMode != KeyguardSecurityModel.SecurityMode.Pattern
78069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                && securityMode != KeyguardSecurityModel.SecurityMode.PIN
781dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                && securityMode != KeyguardSecurityModel.SecurityMode.Password) {
782dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            // can only verify unlock when in pattern/password mode
7837def1db03943251fe8cb57ec514722026425479eCraig Mautner            if (mViewMediatorCallback != null) {
7847def1db03943251fe8cb57ec514722026425479eCraig Mautner                mViewMediatorCallback.keyguardDone(false);
7857def1db03943251fe8cb57ec514722026425479eCraig Mautner            }
786dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        } else {
787dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            // otherwise, go to the unlock screen, see if they can verify it
788dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mIsVerifyUnlockOnly = true;
789e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            showSecurityScreen(securityMode);
790dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
791dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
792dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
793dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private int getSecurityViewIdForMode(SecurityMode securityMode) {
794dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        switch (securityMode) {
795e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case None: return R.id.keyguard_selector_view;
796e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case Pattern: return R.id.keyguard_pattern_view;
79769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            case PIN: return R.id.keyguard_pin_view;
798e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case Password: return R.id.keyguard_password_view;
799e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case Biometric: return R.id.keyguard_face_unlock_view;
800e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case Account: return R.id.keyguard_account_view;
801e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case SimPin: return R.id.keyguard_sim_pin_view;
802e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case SimPuk: return R.id.keyguard_sim_puk_view;
803dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
804dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return 0;
805dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
806dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
807e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller    private int getLayoutIdFor(SecurityMode securityMode) {
808e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        switch (securityMode) {
809e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case None: return R.layout.keyguard_selector_view;
810e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case Pattern: return R.layout.keyguard_pattern_view;
81169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            case PIN: return R.layout.keyguard_pin_view;
812e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case Password: return R.layout.keyguard_password_view;
813e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case Biometric: return R.layout.keyguard_face_unlock_view;
814e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case Account: return R.layout.keyguard_account_view;
815e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case SimPin: return R.layout.keyguard_sim_pin_view;
816e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            case SimPuk: return R.layout.keyguard_sim_puk_view;
817e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller            default:
81863f9b81795559443e0376985f8aaaa97a359ef94Jim Miller                return 0;
819e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller        }
820e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller    }
821e46efc046074ecb49439ed9a557e5c79c0582468Jim Miller
822d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    private void addWidget(int appId, int pageIndex) {
823dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext);
824dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appId);
82599a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller        if (appWidgetInfo != null) {
82699a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller            AppWidgetHostView view = getAppWidgetHost().createView(mContext, appId, appWidgetInfo);
827d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller            addWidget(view, pageIndex);
82899a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller        } else {
82999a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller            Log.w(TAG, "AppWidgetInfo was null; not adding widget id " + appId);
83099a3cae55bd1a4ea6d82aa7fa2a67170e7cd5b3eJim Miller        }
831dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
832dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
833dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock    private final CameraWidgetFrame.Callbacks mCameraWidgetCallbacks =
834dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        new CameraWidgetFrame.Callbacks() {
835dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            @Override
836dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            public void onLaunchingCamera() {
837dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                SlidingChallengeLayout slider = locateSlider();
838dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                if (slider != null) {
839dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                    slider.showHandle(false);
840dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                }
841dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            }
842dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock
843dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            @Override
844dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            public void onCameraLaunched() {
845dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                SlidingChallengeLayout slider = locateSlider();
846dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                if (slider != null) {
847dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                    slider.showHandle(true);
848dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                }
849dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                mAppWidgetContainer.scrollLeft();
850dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            }
851dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock
852dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            private SlidingChallengeLayout locateSlider() {
853dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                return (SlidingChallengeLayout) findViewById(R.id.sliding_layout);
854dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            }
855dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        };
856dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock
857dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock    private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() {
858dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        @Override
859dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        Context getContext() {
860dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            return mContext;
861dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        }
862dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock
863dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        @Override
864dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        KeyguardSecurityCallback getCallback() {
865dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            return mCallback;
866dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        }
867dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock
868dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        @Override
869dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        LockPatternUtils getLockPatternUtils() {
870dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            return mLockPatternUtils;
871dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock        }};
872dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock
8734e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller    private void addDefaultWidgets() {
8744e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller        LayoutInflater inflater = LayoutInflater.from(mContext);
875223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        inflater.inflate(R.layout.keyguard_transport_control_view, this, true);
8764e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller
877d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        View addWidget = inflater.inflate(R.layout.keyguard_add_widget, null, true);
878d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        mAppWidgetContainer.addWidget(addWidget);
879d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true);
880d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        mAppWidgetContainer.addWidget(statusWidget);
88186b6357e5eb91950eac7de7ffe29e5a4ad32903bJohn Spurlock        if (mContext.getResources().getBoolean(R.bool.kg_enable_camera_default_widget)) {
882dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            View cameraWidget =
883dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                    CameraWidgetFrame.create(mContext, mCameraWidgetCallbacks, mActivityLauncher);
884dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            if (cameraWidget != null) {
885dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock                mAppWidgetContainer.addWidget(cameraWidget);
886dcc9681b0d4f52e1f441ef2abdda3eb949cc0c4bJohn Spurlock            }
88786b6357e5eb91950eac7de7ffe29e5a4ad32903bJohn Spurlock        }
888838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller
889b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller        View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view);
890b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller        addWidgetButton.setOnClickListener(new OnClickListener() {
891b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller            @Override
892b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller            public void onClick(View v) {
893b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                mCallback.setOnDismissRunnable(new Runnable() {
894b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller
895b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                    @Override
896b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                    public void run() {
897b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                        Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
898b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                        intent.addFlags(
899b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                                Intent.FLAG_ACTIVITY_NEW_TASK
900b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                                | Intent.FLAG_ACTIVITY_SINGLE_TOP
901b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                                | Intent.FLAG_ACTIVITY_CLEAR_TOP
902b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                                | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
903b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                        mContext.startActivityAsUser(intent,
904b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                                new UserHandle(UserHandle.USER_CURRENT));
905b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                    }
906b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                });
907b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller                mCallback.dismiss(false);
908b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller            }
909b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller        });
910b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller
91119a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller        enableUserSelectorIfNecessary();
9127221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller        initializeTransportControl();
9137221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller    }
9147221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller
9157221d3ae08cc2be922d26e5d491038512cb6c74dJim Miller    private void initializeTransportControl() {
9164e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller        mTransportControl =
9174e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller            (KeyguardTransportControlView) findViewById(R.id.keyguard_transport_control);
918223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        mTransportControl.setVisibility(View.GONE);
9194e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller
9204e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller        // This code manages showing/hiding the transport control. We keep it around and only
9214e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller        // add it to the hierarchy if it needs to be present.
9224e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller        if (mTransportControl != null) {
9234e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller            mTransportControl.setKeyguardCallback(new TransportCallback() {
9244e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                @Override
925223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                public void onListenerDetached() {
9264e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                    int page = getWidgetPosition(R.id.keyguard_transport_control);
927223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                    if (page != -1) {
9284e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                        mAppWidgetContainer.removeView(mTransportControl);
929e955121d6ee64502a938ff3bb3bba8058822d28fJim Miller                        // XXX keep view attached so we still get show/hide events from AudioManager
9304e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                        KeyguardHostView.this.addView(mTransportControl);
9314e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                        mTransportControl.setVisibility(View.GONE);
932223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                        mTransportState = TRANSPORT_GONE;
933e955121d6ee64502a938ff3bb3bba8058822d28fJim Miller                        mTransportControl.post(mSwitchPageRunnable);
9344e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                    }
9354e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                }
9364e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller
9374e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                @Override
938223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                public void onListenerAttached() {
9394e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                    if (getWidgetPosition(R.id.keyguard_transport_control) == -1) {
9404e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                        KeyguardHostView.this.removeView(mTransportControl);
941223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                        mAppWidgetContainer.addView(mTransportControl, 0);
9424e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                        mTransportControl.setVisibility(View.VISIBLE);
9434e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                    }
9444e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller                }
945223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
946223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                @Override
947223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                public void onPlayStateChanged() {
948223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                    mTransportControl.post(mSwitchPageRunnable);
949223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                }
9504e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller            });
9514e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller        }
9520ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller
95368c2489457631f733f542e14058c6d1274c203deJim Miller        mKeyguardStatusViewManager = ((KeyguardStatusView)
9540ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller                findViewById(R.id.keyguard_status_view_face_palm)).getManager();
9550ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller
9564e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller    }
9574e81bd4bcf60a934d4cd589dab6e2bddb88d7356Jim Miller
958b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller    private void maybePopulateWidgets() {
959f73fbf79a1db4bc5ccc829c8a84f3431ab986cbcJim Miller        DevicePolicyManager dpm =
960f73fbf79a1db4bc5ccc829c8a84f3431ab986cbcJim Miller                (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
96148b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        if (dpm != null) {
96248b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller            final int currentUser = mLockPatternUtils.getCurrentUser();
96348b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller            final int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUser);
96448b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller            if ((disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0) {
96548b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                Log.v(TAG, "Keyguard widgets disabled because of device policy admin");
96648b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                return;
96748b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller            }
968b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller        }
969f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller
970d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget);
971d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        int addPageIndex = mAppWidgetContainer.indexOfChild(addWidget);
972d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        // This shouldn't happen, but just to be safe!
973d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        if (addPageIndex < 0) {
974d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller            addPageIndex = 0;
97520c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka        }
97620c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka
97720c41d5382b70fa5a24e9ef68f19ce0aedea5234Michael Jurka        // Add user-selected widget
978aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka        final int[] widgets = mLockPatternUtils.getAppWidgets();
979aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka        if (widgets == null) {
980aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka            Log.d(TAG, "Problem reading widgets");
981aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka        } else {
982aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka            for (int i = widgets.length -1; i >= 0; i--) {
983aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka                if (widgets[i] != -1) {
984aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka                    // We add the widgets from left to right, starting after the first page after
985aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka                    // the add page. We count down, since the order will be persisted from right
986aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka                    // to left, starting after camera.
987aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka                    addWidget(widgets[i], addPageIndex + 1);
988aa2859ae61098509495b7938e32a6d59d37561beMichael Jurka                }
989dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
990dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
9910207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen    }
9920207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen
993223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller    Runnable mSwitchPageRunnable = new Runnable() {
994223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        @Override
995223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        public void run() {
996223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller           showAppropriateWidgetPage();
997223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        }
998223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller    };
999223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
1000223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller    static class SavedState extends BaseSavedState {
1001223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        int transportState;
1002223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
1003223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        SavedState(Parcelable superState) {
1004223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            super(superState);
1005223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        }
1006223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
1007223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        private SavedState(Parcel in) {
1008223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            super(in);
1009223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            this.transportState = in.readInt();
1010223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        }
1011223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
1012223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        @Override
1013223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        public void writeToParcel(Parcel out, int flags) {
1014223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            super.writeToParcel(out, flags);
1015223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            out.writeInt(this.transportState);
1016223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        }
1017223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
1018223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        public static final Parcelable.Creator<SavedState> CREATOR
1019223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                = new Parcelable.Creator<SavedState>() {
1020223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            public SavedState createFromParcel(Parcel in) {
1021223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                return new SavedState(in);
1022223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            }
1023223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
1024223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            public SavedState[] newArray(int size) {
1025223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                return new SavedState[size];
1026223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            }
1027223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        };
1028223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller    }
1029223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
1030223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller    @Override
1031223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller    public Parcelable onSaveInstanceState() {
1032223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        Parcelable superState = super.onSaveInstanceState();
1033223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        SavedState ss = new SavedState(superState);
1034223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        ss.transportState = mTransportState;
1035223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        return ss;
1036223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller    }
1037223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
1038223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller    @Override
1039223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller    public void onRestoreInstanceState(Parcelable state) {
1040223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        if (!(state instanceof SavedState)) {
1041223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            super.onRestoreInstanceState(state);
1042223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            return;
1043223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        }
1044223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        SavedState ss = (SavedState) state;
1045223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        super.onRestoreInstanceState(ss.getSuperState());
1046223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        mTransportState = ss.transportState;
1047223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        post(mSwitchPageRunnable);
1048223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller    }
1049223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
10500207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen    private void showAppropriateWidgetPage() {
1051223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
1052223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        // The following sets the priority for showing widgets. Transport should be shown if
1053223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        // music is playing, followed by the multi-user widget if enabled, followed by the
1054223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        // status widget.
1055223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        final int pageToShow;
1056223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        if (mTransportControl.isMusicPlaying() || mTransportState == TRANSPORT_VISIBLE) {
1057223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            mTransportState = TRANSPORT_VISIBLE;
1058223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            pageToShow = mAppWidgetContainer.indexOfChild(mTransportControl);
1059223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        } else {
1060223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
1061223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            final View multiUserView = findViewById(R.id.keyguard_multi_user_selector);
1062223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            final int multiUserPosition = mAppWidgetContainer.indexOfChild(multiUserView);
1063223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            if (multiUserPosition != -1 && mUm.getUsers(true).size() > 1) {
1064223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                pageToShow = multiUserPosition;
1065223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            } else {
1066223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                final View statusView = findViewById(R.id.keyguard_status_view);
1067223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                pageToShow = mAppWidgetContainer.indexOfChild(statusView);
1068223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            }
1069223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            if (mTransportState == TRANSPORT_VISIBLE) {
1070223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller                mTransportState = TRANSPORT_INVISIBLE;
1071223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            }
10720207c0992cb05d0acc60540748c8ae6985917abbAdam Cohen        }
1073223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller        mAppWidgetContainer.setCurrentPage(pageToShow);
1074dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
1075dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
107619a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller    private void enableUserSelectorIfNecessary() {
107766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen        // if there are multiple users, we need to add the multi-user switcher widget to the
107866b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen        // keyguard.
107966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen        UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
1080920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani        List<UserInfo> users = mUm.getUsers(true);
108166b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen
108266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen        if (users.size() > 1) {
108328c5ee9ea9b1dd6253a4ba782a5711263524bd41Chris Wren            KeyguardMultiUserSelectorView multiUser =
108428c5ee9ea9b1dd6253a4ba782a5711263524bd41Chris Wren                    (KeyguardMultiUserSelectorView) findViewById(R.id.keyguard_user_selector);
108519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller            multiUser.setVisibility(View.VISIBLE);
108628c5ee9ea9b1dd6253a4ba782a5711263524bd41Chris Wren            multiUser.addUsers(mUm.getUsers(true));
108724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen            UserSwitcherCallback callback = new UserSwitcherCallback() {
108824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen                @Override
108924b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen                public void hideSecurityView(int duration) {
109024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen                    mSecurityViewContainer.animate().alpha(0).setDuration(duration);
109124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen                }
109224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen
109324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen                @Override
109424b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen                public void showSecurityView() {
109524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen                    mSecurityViewContainer.setAlpha(1.0f);
109624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen                }
10970a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen
10980a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen                @Override
10990a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen                public void showUnlockHint() {
11000ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller                    if (mKeyguardSelectorView != null) {
11016fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen                        mKeyguardSelectorView.showUsabilityHint();
11020ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller                    }
11030a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen                }
11040a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen
110519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller                @Override
110619a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller                public void userActivity() {
110719a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller                    if (mViewMediatorCallback != null) {
110819a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller                        mViewMediatorCallback.userActivity();
110919a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller                    }
111019a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller                }
111124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen            };
111224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen            multiUser.setCallback(callback);
111366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen        }
111466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen    }
111566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen
1116dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
1117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void cleanUp() {
1118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
1120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
112195b005c196de2f99513da28fe9108b2dec200140Jim Miller    /**
112295b005c196de2f99513da28fe9108b2dec200140Jim Miller     * In general, we enable unlocking the insecure keyguard with the menu key. However, there are
112395b005c196de2f99513da28fe9108b2dec200140Jim Miller     * some cases where we wish to disable it, notably when the menu button placement or technology
112495b005c196de2f99513da28fe9108b2dec200140Jim Miller     * is prone to false positives.
112595b005c196de2f99513da28fe9108b2dec200140Jim Miller     *
112695b005c196de2f99513da28fe9108b2dec200140Jim Miller     * @return true if the menu key should be enabled
112795b005c196de2f99513da28fe9108b2dec200140Jim Miller     */
112895b005c196de2f99513da28fe9108b2dec200140Jim Miller    private static final String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key";
112995b005c196de2f99513da28fe9108b2dec200140Jim Miller    private boolean shouldEnableMenuKey() {
113095b005c196de2f99513da28fe9108b2dec200140Jim Miller        final Resources res = getResources();
1131258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller        final boolean configDisabled = res.getBoolean(
1132258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller                com.android.internal.R.bool.config_disableMenuKeyInLockScreen);
113395b005c196de2f99513da28fe9108b2dec200140Jim Miller        final boolean isTestHarness = ActivityManager.isRunningInTestHarness();
113495b005c196de2f99513da28fe9108b2dec200140Jim Miller        final boolean fileOverride = (new File(ENABLE_MENU_KEY_FILE)).exists();
113595b005c196de2f99513da28fe9108b2dec200140Jim Miller        return !configDisabled || isTestHarness || fileOverride;
113695b005c196de2f99513da28fe9108b2dec200140Jim Miller    }
113795b005c196de2f99513da28fe9108b2dec200140Jim Miller
113895b005c196de2f99513da28fe9108b2dec200140Jim Miller    @Override
113995b005c196de2f99513da28fe9108b2dec200140Jim Miller    public boolean onKeyDown(int keyCode, KeyEvent event) {
114095b005c196de2f99513da28fe9108b2dec200140Jim Miller        if (keyCode == KeyEvent.KEYCODE_MENU && mEnableMenuKey) {
114195b005c196de2f99513da28fe9108b2dec200140Jim Miller            showNextSecurityScreenOrFinish(false);
114295b005c196de2f99513da28fe9108b2dec200140Jim Miller            return true;
114395b005c196de2f99513da28fe9108b2dec200140Jim Miller        } else {
114495b005c196de2f99513da28fe9108b2dec200140Jim Miller            return super.onKeyDown(keyCode, event);
114595b005c196de2f99513da28fe9108b2dec200140Jim Miller        }
114695b005c196de2f99513da28fe9108b2dec200140Jim Miller    }
114795b005c196de2f99513da28fe9108b2dec200140Jim Miller
11486bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller    public void goToUserSwitcher() {
11496bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        mAppWidgetContainer.setCurrentPage(getWidgetPosition(R.id.keyguard_multi_user_selector));
11506bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller    }
11516bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller
11520a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller    public boolean handleBackKey() {
11530a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller        if (mCurrentSecuritySelection != SecurityMode.None) {
11540a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller            mCallback.dismiss(false);
11550a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller            return true;
11560a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller        }
11570a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller        return false;
11580a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller    }
11590a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller
1160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
1161