LockScreen.java revision dcb3d84b82cc2448d04e73359a716581bfb657db
11f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/*
21f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
31f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
41f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
51f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * you may not use this file except in compliance with the License.
61f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * You may obtain a copy of the License at
71f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
81f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
91f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * See the License for the specific language governing permissions and
141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * limitations under the License.
151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */
161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpackage com.android.internal.policy.impl.keyguard_obsolete;
181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.R;
20a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savilleimport com.android.internal.telephony.IccCardConstants;
211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.widget.LockPatternUtils;
2280080e54ef571a5109563d4bfc4619197961f51aJim Millerimport com.android.internal.widget.SlidingTab;
233060421045d4d9e411797f91bb509824b03e33fbJim Millerimport com.android.internal.widget.WaveView;
24955a016922ea49f154d190b054a202559b41a4d3Jim Millerimport com.android.internal.widget.multiwaveview.GlowPadView;
251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
263b4fcbc9f13bab6a2e9e5c37cc5e18fec7341c04Brett Chabotimport android.app.ActivityManager;
273868cee0b9306644b250d3cd78b1be7af70abf68Jim Millerimport android.app.ActivityManagerNative;
28c00fd7ab302198635885c1e090b41e3d11adc8eaJim Millerimport android.app.SearchManager;
293868cee0b9306644b250d3cd78b1be7af70abf68Jim Millerimport android.content.ActivityNotFoundException;
300799440ab3ce50ffa6acb762cb7677abdffb3f74Jim Millerimport android.content.ComponentName;
311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context;
32be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Millerimport android.content.Intent;
335475906f53e2d79807548932dfabbf9945143740Jim Millerimport android.content.res.Configuration;
34bd998018ed028c1922d3cf14aeabe24ff1818761Jim Millerimport android.content.res.Resources;
35f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
36bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurentimport android.os.Vibrator;
371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.KeyEvent;
381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.LayoutInflater;
391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.View;
401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.ViewGroup;
41d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaenimport android.widget.*;
42d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaenimport android.util.Log;
430799440ab3ce50ffa6acb762cb7677abdffb3f74Jim Millerimport android.util.Slog;
44d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaenimport android.media.AudioManager;
453868cee0b9306644b250d3cd78b1be7af70abf68Jim Millerimport android.os.RemoteException;
46b75783571b2b51357f97407903b2fda9534f91f9Wu-cheng Liimport android.provider.MediaStore;
4736931ac9b3cc2e8f60f730c51e715744b5c4f6c0Jim Miller
48bd998018ed028c1922d3cf14aeabe24ff1818761Jim Millerimport java.io.File;
491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/**
511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The screen within {@link LockPatternKeyguardView} that shows general
521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * information about the device depending on its state, and how to get
531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * past it, as applicable.
541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */
556b05d58018c2806459c121e507c005639b74aee9Jim Millerclass LockScreen extends LinearLayout implements KeyguardScreen {
56d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaen
57cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller    private static final int ON_RESUME_PING_DELAY = 500; // delay first ping until the screen is on
58bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    private static final boolean DBG = false;
59bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    private static final String TAG = "LockScreen";
60bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    private static final String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key";
616b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int WAIT_FOR_ANIMATION_TIMEOUT = 0;
626b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int STAY_ON_WHILE_GRABBED_TIMEOUT = 30000;
633294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller    private static final String ASSIST_ICON_METADATA_NAME =
643294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller            "com.android.systemui.action_assist_icon";
65d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaen
668b886fab5496b0b1f5193f21855220176deddc37Jim Miller    private LockPatternUtils mLockPatternUtils;
678b886fab5496b0b1f5193f21855220176deddc37Jim Miller    private KeyguardUpdateMonitor mUpdateMonitor;
688b886fab5496b0b1f5193f21855220176deddc37Jim Miller    private KeyguardScreenCallback mCallback;
691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
70b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    // set to 'true' to show the ring/silence target when camera isn't available
71b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    private boolean mEnableRingSilenceFallback = false;
72b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
735475906f53e2d79807548932dfabbf9945143740Jim Miller    // current configuration state of keyboard and display
745475906f53e2d79807548932dfabbf9945143740Jim Miller    private int mCreationOrientation;
755475906f53e2d79807548932dfabbf9945143740Jim Miller
76d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaen    private boolean mSilentMode;
77ec3fc0a6415319a5f4f292b8f3d95eb400b33fbcKarl Rosaen    private AudioManager mAudioManager;
78bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    private boolean mEnableMenuKeyInLockScreen;
79d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaen
806b05d58018c2806459c121e507c005639b74aee9Jim Miller    private KeyguardStatusViewManager mStatusViewManager;
811c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    private UnlockWidgetCommonMethods mUnlockWidgetMethods;
821c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    private View mUnlockWidget;
83c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller    private boolean mCameraDisabled;
84c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller    private boolean mSearchDisabled;
85bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent    // Is there a vibrator
86bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent    private final boolean mHasVibrator;
87b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
88bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller    KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
89b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
90b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        @Override
91b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void onRingerModeChanged(int state) {
92b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            boolean silent = AudioManager.RINGER_MODE_NORMAL != state;
93b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            if (silent != mSilentMode) {
94b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                mSilentMode = silent;
95b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                mUnlockWidgetMethods.updateResources();
96b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            }
97b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
98b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
99b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        @Override
100b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void onDevicePolicyManagerStateChanged() {
101c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller            updateTargets();
102b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
103b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
104bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller        @Override
105a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville        public void onSimStateChanged(IccCardConstants.State simState) {
106c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller            updateTargets();
107b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
108b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    };
1091c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1101c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    private interface UnlockWidgetCommonMethods {
1111c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        // Update resources based on phone state
1121c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void updateResources();
1131c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1141c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        // Get the view associated with this widget
1151c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public View getView();
1163060421045d4d9e411797f91bb509824b03e33fbJim Miller
1171c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        // Reset the view
1181c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void reset(boolean animate);
1191c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1201c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        // Animate the widget if it supports ping()
1211c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void ping();
122b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
123b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        // Enable or disable a target. ResourceId is the id of the *drawable* associated with the
124b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        // target.
125b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void setEnabled(int resourceId, boolean enabled);
126b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
127b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        // Get the target position for the given resource. Returns -1 if not found.
128b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public int getTargetPosition(int resourceId);
1298818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller
1308818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        // Clean up when this widget is going away
1318818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        public void cleanUp();
1321c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    }
1331c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1341c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    class SlidingTabMethods implements SlidingTab.OnTriggerListener, UnlockWidgetCommonMethods {
1351c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        private final SlidingTab mSlidingTab;
1361c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1371c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        SlidingTabMethods(SlidingTab slidingTab) {
1381c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            mSlidingTab = slidingTab;
1391c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
1401c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1411c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void updateResources() {
1423060421045d4d9e411797f91bb509824b03e33fbJim Miller            boolean vibe = mSilentMode
1433060421045d4d9e411797f91bb509824b03e33fbJim Miller                && (mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE);
1443060421045d4d9e411797f91bb509824b03e33fbJim Miller
1453060421045d4d9e411797f91bb509824b03e33fbJim Miller            mSlidingTab.setRightTabResources(
1463060421045d4d9e411797f91bb509824b03e33fbJim Miller                    mSilentMode ? ( vibe ? R.drawable.ic_jog_dial_vibrate_on
1473060421045d4d9e411797f91bb509824b03e33fbJim Miller                                         : R.drawable.ic_jog_dial_sound_off )
1483060421045d4d9e411797f91bb509824b03e33fbJim Miller                                : R.drawable.ic_jog_dial_sound_on,
1493060421045d4d9e411797f91bb509824b03e33fbJim Miller                    mSilentMode ? R.drawable.jog_tab_target_yellow
1503060421045d4d9e411797f91bb509824b03e33fbJim Miller                                : R.drawable.jog_tab_target_gray,
1513060421045d4d9e411797f91bb509824b03e33fbJim Miller                    mSilentMode ? R.drawable.jog_tab_bar_right_sound_on
1523060421045d4d9e411797f91bb509824b03e33fbJim Miller                                : R.drawable.jog_tab_bar_right_sound_off,
1533060421045d4d9e411797f91bb509824b03e33fbJim Miller                    mSilentMode ? R.drawable.jog_tab_right_sound_on
1543060421045d4d9e411797f91bb509824b03e33fbJim Miller                                : R.drawable.jog_tab_right_sound_off);
1553060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
1563060421045d4d9e411797f91bb509824b03e33fbJim Miller
1573060421045d4d9e411797f91bb509824b03e33fbJim Miller        /** {@inheritDoc} */
1583060421045d4d9e411797f91bb509824b03e33fbJim Miller        public void onTrigger(View v, int whichHandle) {
1593060421045d4d9e411797f91bb509824b03e33fbJim Miller            if (whichHandle == SlidingTab.OnTriggerListener.LEFT_HANDLE) {
1603060421045d4d9e411797f91bb509824b03e33fbJim Miller                mCallback.goToUnlockScreen();
1613060421045d4d9e411797f91bb509824b03e33fbJim Miller            } else if (whichHandle == SlidingTab.OnTriggerListener.RIGHT_HANDLE) {
162b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                toggleRingMode();
1633060421045d4d9e411797f91bb509824b03e33fbJim Miller                mCallback.pokeWakelock();
1643060421045d4d9e411797f91bb509824b03e33fbJim Miller            }
1653060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
1663060421045d4d9e411797f91bb509824b03e33fbJim Miller
1673060421045d4d9e411797f91bb509824b03e33fbJim Miller        /** {@inheritDoc} */
1683060421045d4d9e411797f91bb509824b03e33fbJim Miller        public void onGrabbedStateChange(View v, int grabbedState) {
1693060421045d4d9e411797f91bb509824b03e33fbJim Miller            if (grabbedState == SlidingTab.OnTriggerListener.RIGHT_HANDLE) {
1703060421045d4d9e411797f91bb509824b03e33fbJim Miller                mSilentMode = isSilentMode();
1713060421045d4d9e411797f91bb509824b03e33fbJim Miller                mSlidingTab.setRightHintText(mSilentMode ? R.string.lockscreen_sound_on_label
1723060421045d4d9e411797f91bb509824b03e33fbJim Miller                        : R.string.lockscreen_sound_off_label);
1733060421045d4d9e411797f91bb509824b03e33fbJim Miller            }
1744d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // Don't poke the wake lock when returning to a state where the handle is
1754d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // not grabbed since that can happen when the system (instead of the user)
1764d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // cancels the grab.
1774d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            if (grabbedState != SlidingTab.OnTriggerListener.NO_HANDLE) {
1784d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown                mCallback.pokeWakelock();
1794d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            }
1803060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
1811c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1821c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public View getView() {
1831c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            return mSlidingTab;
1841c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
1851c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1861c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void reset(boolean animate) {
1871c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            mSlidingTab.reset(animate);
1881c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
1891c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1901c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void ping() {
1911c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
192b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
193b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void setEnabled(int resourceId, boolean enabled) {
194b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            // Not used
195b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
196b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
197b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public int getTargetPosition(int resourceId) {
198b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            return -1; // Not supported
199b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
2008818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller
2018818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        public void cleanUp() {
2028818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller            mSlidingTab.setOnTriggerListener(null);
2038818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        }
2043060421045d4d9e411797f91bb509824b03e33fbJim Miller    }
2053060421045d4d9e411797f91bb509824b03e33fbJim Miller
2061c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    class WaveViewMethods implements WaveView.OnTriggerListener, UnlockWidgetCommonMethods {
2071c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
2081c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        private final WaveView mWaveView;
2091c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
2101c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        WaveViewMethods(WaveView waveView) {
2111c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            mWaveView = waveView;
2121c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
2133060421045d4d9e411797f91bb509824b03e33fbJim Miller        /** {@inheritDoc} */
2143060421045d4d9e411797f91bb509824b03e33fbJim Miller        public void onTrigger(View v, int whichHandle) {
2153060421045d4d9e411797f91bb509824b03e33fbJim Miller            if (whichHandle == WaveView.OnTriggerListener.CENTER_HANDLE) {
216b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                requestUnlockScreen();
2173060421045d4d9e411797f91bb509824b03e33fbJim Miller            }
2183060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
2193060421045d4d9e411797f91bb509824b03e33fbJim Miller
2203060421045d4d9e411797f91bb509824b03e33fbJim Miller        /** {@inheritDoc} */
2213060421045d4d9e411797f91bb509824b03e33fbJim Miller        public void onGrabbedStateChange(View v, int grabbedState) {
2224d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // Don't poke the wake lock when returning to a state where the handle is
2234d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // not grabbed since that can happen when the system (instead of the user)
2244d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // cancels the grab.
2254139b5505c1e07c56900aa72dd91a01e6b740f5fJim Miller            if (grabbedState == WaveView.OnTriggerListener.CENTER_HANDLE) {
2264139b5505c1e07c56900aa72dd91a01e6b740f5fJim Miller                mCallback.pokeWakelock(STAY_ON_WHILE_GRABBED_TIMEOUT);
2274139b5505c1e07c56900aa72dd91a01e6b740f5fJim Miller            }
2283060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
2291c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
2301c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void updateResources() {
2311c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
2321c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
2331c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public View getView() {
2341c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            return mWaveView;
2351c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
2361c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void reset(boolean animate) {
2371c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            mWaveView.reset();
2381c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
2391c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void ping() {
2401c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
241b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void setEnabled(int resourceId, boolean enabled) {
242b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            // Not used
243b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
244b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public int getTargetPosition(int resourceId) {
245b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            return -1; // Not supported
246b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
2478818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        public void cleanUp() {
2488818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller            mWaveView.setOnTriggerListener(null);
2498818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        }
2503060421045d4d9e411797f91bb509824b03e33fbJim Miller    }
2513060421045d4d9e411797f91bb509824b03e33fbJim Miller
252955a016922ea49f154d190b054a202559b41a4d3Jim Miller    class GlowPadViewMethods implements GlowPadView.OnTriggerListener,
2531c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            UnlockWidgetCommonMethods {
254955a016922ea49f154d190b054a202559b41a4d3Jim Miller        private final GlowPadView mGlowPadView;
2551c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
256955a016922ea49f154d190b054a202559b41a4d3Jim Miller        GlowPadViewMethods(GlowPadView glowPadView) {
257955a016922ea49f154d190b054a202559b41a4d3Jim Miller            mGlowPadView = glowPadView;
258b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
259b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
260c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller        public boolean isTargetPresent(int resId) {
261955a016922ea49f154d190b054a202559b41a4d3Jim Miller            return mGlowPadView.getTargetPosition(resId) != -1;
2621c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
2631c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
2641c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void updateResources() {
265be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller            int resId;
266b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            if (mCameraDisabled && mEnableRingSilenceFallback) {
267b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                // Fall back to showing ring/silence if camera is disabled...
268be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller                resId = mSilentMode ? R.array.lockscreen_targets_when_silent
269be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller                    : R.array.lockscreen_targets_when_soundon;
270be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller            } else {
271be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller                resId = R.array.lockscreen_targets_with_camera;
272be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller            }
273955a016922ea49f154d190b054a202559b41a4d3Jim Miller            if (mGlowPadView.getTargetResourceId() != resId) {
274955a016922ea49f154d190b054a202559b41a4d3Jim Miller                mGlowPadView.setTargetResources(resId);
275b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            }
2763294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller
2773294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller            // Update the search icon with drawable from the search .apk
2783294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller            if (!mSearchDisabled) {
279c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani                Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
280f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                        .getAssistIntent(mContext, UserHandle.USER_CURRENT);
28145308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                if (intent != null) {
28245308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    // XXX Hack. We need to substitute the icon here but haven't formalized
28345308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    // the public API. The "_google" metadata will be going away, so
28445308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    // DON'T USE IT!
28545308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    ComponentName component = intent.getComponent();
28645308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component,
28745308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                            ASSIST_ICON_METADATA_NAME + "_google",
28845308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                            com.android.internal.R.drawable.ic_action_assist_generic);
28945308b1b3b1582d048845df2ee5301241e52a5cfJim Miller
29045308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component,
29145308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                                ASSIST_ICON_METADATA_NAME,
29245308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                                com.android.internal.R.drawable.ic_action_assist_generic)) {
29345308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                            Slog.w(TAG, "Couldn't grab icon from package " + component);
2943294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller                    }
2953294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller                }
2963294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller            }
2973294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller
298b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            setEnabled(com.android.internal.R.drawable.ic_lockscreen_camera, !mCameraDisabled);
29920039ad17b94873ee40fdd61c3d1d1aa590010dfJim Miller            setEnabled(com.android.internal.R.drawable.ic_action_assist_generic, !mSearchDisabled);
3001c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
3011c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
302b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        public void onGrabbed(View v, int handle) {
303b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
304b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }
3051c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
306b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        public void onReleased(View v, int handle) {
307b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
308b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }
3091c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
310b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        public void onTrigger(View v, int target) {
311955a016922ea49f154d190b054a202559b41a4d3Jim Miller            final int resId = mGlowPadView.getResourceIdForTarget(target);
312b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            switch (resId) {
31320039ad17b94873ee40fdd61c3d1d1aa590010dfJim Miller                case com.android.internal.R.drawable.ic_action_assist_generic:
314c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani                    Intent assistIntent =
315c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani                            ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
316f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                            .getAssistIntent(mContext, UserHandle.USER_CURRENT);
3170799440ab3ce50ffa6acb762cb7677abdffb3f74Jim Miller                    if (assistIntent != null) {
3180799440ab3ce50ffa6acb762cb7677abdffb3f74Jim Miller                        launchActivity(assistIntent);
3190799440ab3ce50ffa6acb762cb7677abdffb3f74Jim Miller                    } else {
3200799440ab3ce50ffa6acb762cb7677abdffb3f74Jim Miller                        Log.w(TAG, "Failed to get intent for assist activity");
3210799440ab3ce50ffa6acb762cb7677abdffb3f74Jim Miller                    }
322c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller                    mCallback.pokeWakelock();
323c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller                    break;
324c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller
325b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                case com.android.internal.R.drawable.ic_lockscreen_camera:
326c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller                    launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA));
327b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                    mCallback.pokeWakelock();
328b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                    break;
329b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
330b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                case com.android.internal.R.drawable.ic_lockscreen_silent:
331be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller                    toggleRingMode();
332be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller                    mCallback.pokeWakelock();
333b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                break;
334b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
3354c351d62e7a09bcc29e7d0329bcdd947a302cf40Jim Miller                case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom:
336b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                case com.android.internal.R.drawable.ic_lockscreen_unlock:
337b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                    mCallback.goToUnlockScreen();
338b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                break;
339b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            }
340b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
341b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
342c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani        /**
343c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani         * Launches the said intent for the current foreground user.
344c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani         * @param intent
345c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani         */
346c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller        private void launchActivity(Intent intent) {
347b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            intent.setFlags(
348b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                    Intent.FLAG_ACTIVITY_NEW_TASK
349b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                    | Intent.FLAG_ACTIVITY_SINGLE_TOP
350b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
351b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            try {
352b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
353b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            } catch (RemoteException e) {
354b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                Log.w(TAG, "can't dismiss keyguard on launch");
355b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            }
356b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            try {
35779af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn                mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
358b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            } catch (ActivityNotFoundException e) {
3594c351d62e7a09bcc29e7d0329bcdd947a302cf40Jim Miller                Log.w(TAG, "Activity not found for intent + " + intent.getAction());
360b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            }
361b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }
362b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
363b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        public void onGrabbedStateChange(View v, int handle) {
364b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            // Don't poke the wake lock when returning to a state where the handle is
365b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            // not grabbed since that can happen when the system (instead of the user)
366b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            // cancels the grab.
367955a016922ea49f154d190b054a202559b41a4d3Jim Miller            if (handle != GlowPadView.OnTriggerListener.NO_HANDLE) {
368b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                mCallback.pokeWakelock();
369b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            }
370b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }
3711c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
3721c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public View getView() {
373955a016922ea49f154d190b054a202559b41a4d3Jim Miller            return mGlowPadView;
3741c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
3751c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
3761c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void reset(boolean animate) {
377955a016922ea49f154d190b054a202559b41a4d3Jim Miller            mGlowPadView.reset(animate);
3781c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
3791c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
3801c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void ping() {
381955a016922ea49f154d190b054a202559b41a4d3Jim Miller            mGlowPadView.ping();
3821c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
383b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
384b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void setEnabled(int resourceId, boolean enabled) {
385955a016922ea49f154d190b054a202559b41a4d3Jim Miller            mGlowPadView.setEnableTarget(resourceId, enabled);
386b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
387b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
388b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public int getTargetPosition(int resourceId) {
389955a016922ea49f154d190b054a202559b41a4d3Jim Miller            return mGlowPadView.getTargetPosition(resourceId);
390b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
3918818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller
3928818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        public void cleanUp() {
393955a016922ea49f154d190b054a202559b41a4d3Jim Miller            mGlowPadView.setOnTriggerListener(null);
3948818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        }
395998bb765290066822ff8a3b378dadd71deb0ce73Jim Miller
396998bb765290066822ff8a3b378dadd71deb0ce73Jim Miller        public void onFinishFinalAnimation() {
397998bb765290066822ff8a3b378dadd71deb0ce73Jim Miller
398998bb765290066822ff8a3b378dadd71deb0ce73Jim Miller        }
399b505074e8273887fbcd1e933738a42e770085fb8Jim Miller    }
400b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
401b505074e8273887fbcd1e933738a42e770085fb8Jim Miller    private void requestUnlockScreen() {
402b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        // Delay hiding lock screen long enough for animation to finish
403b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        postDelayed(new Runnable() {
404b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            public void run() {
405b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                mCallback.goToUnlockScreen();
406b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            }
407b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }, WAIT_FOR_ANIMATION_TIMEOUT);
408b505074e8273887fbcd1e933738a42e770085fb8Jim Miller    }
409b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
410b505074e8273887fbcd1e933738a42e770085fb8Jim Miller    private void toggleRingMode() {
411b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        // toggle silent mode
412b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        mSilentMode = !mSilentMode;
413b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        if (mSilentMode) {
414bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent            mAudioManager.setRingerMode(mHasVibrator
415b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                ? AudioManager.RINGER_MODE_VIBRATE
416b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                : AudioManager.RINGER_MODE_SILENT);
417b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        } else {
418b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
419b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }
420b505074e8273887fbcd1e933738a42e770085fb8Jim Miller    }
421b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
422bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    /**
423bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     * In general, we enable unlocking the insecure key guard with the menu key. However, there are
424bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     * some cases where we wish to disable it, notably when the menu button placement or technology
425bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     * is prone to false positives.
426bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     *
427bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     * @return true if the menu key should be enabled
428bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     */
429bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    private boolean shouldEnableMenuKey() {
430bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller        final Resources res = getResources();
431bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller        final boolean configDisabled = res.getBoolean(R.bool.config_disableMenuKeyInLockScreen);
4323b4fcbc9f13bab6a2e9e5c37cc5e18fec7341c04Brett Chabot        final boolean isTestHarness = ActivityManager.isRunningInTestHarness();
433bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller        final boolean fileOverride = (new File(ENABLE_MENU_KEY_FILE)).exists();
4343b4fcbc9f13bab6a2e9e5c37cc5e18fec7341c04Brett Chabot        return !configDisabled || isTestHarness || fileOverride;
435bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    }
4361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
4371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
4381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param context Used to setup the view.
4395475906f53e2d79807548932dfabbf9945143740Jim Miller     * @param configuration The current configuration. Used to use when selecting layout, etc.
4401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param lockPatternUtils Used to know the state of the lock pattern settings.
4411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param updateMonitor Used to register for updates on various keyguard related
4421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *    state, and query the initial state at setup.
4431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param callback Used to communicate back to the host keyguard view.
4441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
4455475906f53e2d79807548932dfabbf9945143740Jim Miller    LockScreen(Context context, Configuration configuration, LockPatternUtils lockPatternUtils,
4461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            KeyguardUpdateMonitor updateMonitor,
4471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            KeyguardScreenCallback callback) {
4481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        super(context);
4491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mLockPatternUtils = lockPatternUtils;
4501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mUpdateMonitor = updateMonitor;
4511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mCallback = callback;
452bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller        mEnableMenuKeyInLockScreen = shouldEnableMenuKey();
4535475906f53e2d79807548932dfabbf9945143740Jim Miller        mCreationOrientation = configuration.orientation;
45480be841eafe3b7b9f8dba820ba3201843717e610Karl Rosaen
45575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        if (LockPatternKeyguardView.DEBUG_CONFIGURATION) {
45675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.v(TAG, "***** CREATING LOCK SCREEN", new RuntimeException());
45775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.v(TAG, "Cur orient=" + mCreationOrientation
45875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn                    + " res orient=" + context.getResources().getConfiguration().orientation);
45975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        }
460368de81b71af00628b60558a52c7df53e1cd1e96Daniel Sandler
4611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        final LayoutInflater inflater = LayoutInflater.from(context);
4625475906f53e2d79807548932dfabbf9945143740Jim Miller        if (DBG) Log.v(TAG, "Creation orientation = " + mCreationOrientation);
4635475906f53e2d79807548932dfabbf9945143740Jim Miller        if (mCreationOrientation != Configuration.ORIENTATION_LANDSCAPE) {
46480080e54ef571a5109563d4bfc4619197961f51aJim Miller            inflater.inflate(R.layout.keyguard_screen_tab_unlock, this, true);
46580be841eafe3b7b9f8dba820ba3201843717e610Karl Rosaen        } else {
46680080e54ef571a5109563d4bfc4619197961f51aJim Miller            inflater.inflate(R.layout.keyguard_screen_tab_unlock_land, this, true);
46780be841eafe3b7b9f8dba820ba3201843717e610Karl Rosaen        }
4681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
4696b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatusViewManager = new KeyguardStatusViewManager(this, mUpdateMonitor, mLockPatternUtils,
470ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen                mCallback, false);
4711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
4721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        setFocusable(true);
4731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        setFocusableInTouchMode(true);
4741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
4751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
476bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent        Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
477bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent        mHasVibrator = vibrator == null ? false : vibrator.hasVibrator();
4786b05d58018c2806459c121e507c005639b74aee9Jim Miller        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
479c119f1299b63c224df5e7fa9c197f394eee890caJim Miller        mSilentMode = isSilentMode();
4801c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        mUnlockWidget = findViewById(R.id.unlock_widget);
481b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        mUnlockWidgetMethods = createUnlockMethods(mUnlockWidget);
482b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
483b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        if (DBG) Log.v(TAG, "*** LockScreen accel is "
484b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                + (mUnlockWidget.isHardwareAccelerated() ? "on":"off"));
485b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    }
486b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
487b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    private UnlockWidgetCommonMethods createUnlockMethods(View unlockWidget) {
488b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        if (unlockWidget instanceof SlidingTab) {
489b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            SlidingTab slidingTabView = (SlidingTab) unlockWidget;
4901c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            slidingTabView.setHoldAfterTrigger(true, false);
4911c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            slidingTabView.setLeftHintText(R.string.lockscreen_unlock_label);
4921c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            slidingTabView.setLeftTabResources(
4933060421045d4d9e411797f91bb509824b03e33fbJim Miller                    R.drawable.ic_jog_dial_unlock,
4943060421045d4d9e411797f91bb509824b03e33fbJim Miller                    R.drawable.jog_tab_target_green,
4953060421045d4d9e411797f91bb509824b03e33fbJim Miller                    R.drawable.jog_tab_bar_left_unlock,
4963060421045d4d9e411797f91bb509824b03e33fbJim Miller                    R.drawable.jog_tab_left_unlock);
4971c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            SlidingTabMethods slidingTabMethods = new SlidingTabMethods(slidingTabView);
4981c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            slidingTabView.setOnTriggerListener(slidingTabMethods);
499b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            return slidingTabMethods;
500b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        } else if (unlockWidget instanceof WaveView) {
501b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            WaveView waveView = (WaveView) unlockWidget;
5021c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            WaveViewMethods waveViewMethods = new WaveViewMethods(waveView);
5031c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            waveView.setOnTriggerListener(waveViewMethods);
504b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            return waveViewMethods;
505955a016922ea49f154d190b054a202559b41a4d3Jim Miller        } else if (unlockWidget instanceof GlowPadView) {
506955a016922ea49f154d190b054a202559b41a4d3Jim Miller            GlowPadView glowPadView = (GlowPadView) unlockWidget;
507955a016922ea49f154d190b054a202559b41a4d3Jim Miller            GlowPadViewMethods glowPadViewMethods = new GlowPadViewMethods(glowPadView);
508955a016922ea49f154d190b054a202559b41a4d3Jim Miller            glowPadView.setOnTriggerListener(glowPadViewMethods);
509955a016922ea49f154d190b054a202559b41a4d3Jim Miller            return glowPadViewMethods;
5103060421045d4d9e411797f91bb509824b03e33fbJim Miller        } else {
511b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            throw new IllegalStateException("Unrecognized unlock widget: " + unlockWidget);
5123060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
513b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    }
514c119f1299b63c224df5e7fa9c197f394eee890caJim Miller
515c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller    private void updateTargets() {
516b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        boolean disabledByAdmin = mLockPatternUtils.getDevicePolicyManager()
517b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                .getCameraDisabled(null);
518b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        boolean disabledBySimState = mUpdateMonitor.isSimLocked();
519955a016922ea49f154d190b054a202559b41a4d3Jim Miller        boolean cameraTargetPresent = (mUnlockWidgetMethods instanceof GlowPadViewMethods)
520955a016922ea49f154d190b054a202559b41a4d3Jim Miller                ? ((GlowPadViewMethods) mUnlockWidgetMethods)
521c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller                        .isTargetPresent(com.android.internal.R.drawable.ic_lockscreen_camera)
522c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller                        : false;
523955a016922ea49f154d190b054a202559b41a4d3Jim Miller        boolean searchTargetPresent = (mUnlockWidgetMethods instanceof GlowPadViewMethods)
524955a016922ea49f154d190b054a202559b41a4d3Jim Miller                ? ((GlowPadViewMethods) mUnlockWidgetMethods)
52520039ad17b94873ee40fdd61c3d1d1aa590010dfJim Miller                        .isTargetPresent(com.android.internal.R.drawable.ic_action_assist_generic)
526c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller                        : false;
527c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller
528b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        if (disabledByAdmin) {
529b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            Log.v(TAG, "Camera disabled by Device Policy");
530b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        } else if (disabledBySimState) {
531b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            Log.v(TAG, "Camera disabled by Sim State");
532b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
533c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani        boolean searchActionAvailable =
534c1d07a4bd26c0ecf87bfa151ae43cb92c0c73791Amith Yamasani                ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
535f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null;
536c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller        mCameraDisabled = disabledByAdmin || disabledBySimState || !cameraTargetPresent;
537c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller        mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent;
5381c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        mUnlockWidgetMethods.updateResources();
539a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen    }
540a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen
541c119f1299b63c224df5e7fa9c197f394eee890caJim Miller    private boolean isSilentMode() {
54282d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler        return mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL;
543c119f1299b63c224df5e7fa9c197f394eee890caJim Miller    }
544c119f1299b63c224df5e7fa9c197f394eee890caJim Miller
5451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    @Override
5461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
547bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller        if (keyCode == KeyEvent.KEYCODE_MENU && mEnableMenuKeyInLockScreen) {
5481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCallback.goToUnlockScreen();
5491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
5501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return false;
5511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
5521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
55375787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    void updateConfiguration() {
55475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        Configuration newConfig = getResources().getConfiguration();
5555475906f53e2d79807548932dfabbf9945143740Jim Miller        if (newConfig.orientation != mCreationOrientation) {
5565475906f53e2d79807548932dfabbf9945143740Jim Miller            mCallback.recreateMe(newConfig);
5571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
5581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
559368de81b71af00628b60558a52c7df53e1cd1e96Daniel Sandler
56075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    @Override
56175787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    protected void onAttachedToWindow() {
56275787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        super.onAttachedToWindow();
56375787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        if (LockPatternKeyguardView.DEBUG_CONFIGURATION) {
56475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.v(TAG, "***** LOCK ATTACHED TO WINDOW");
56575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.v(TAG, "Cur orient=" + mCreationOrientation
56675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn                    + ", new config=" + getResources().getConfiguration());
56775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        }
56875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        updateConfiguration();
56975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    }
57075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn
57175787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    /** {@inheritDoc} */
57275787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    @Override
57375787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    protected void onConfigurationChanged(Configuration newConfig) {
57475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        super.onConfigurationChanged(newConfig);
57575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        if (LockPatternKeyguardView.DEBUG_CONFIGURATION) {
57675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.w(TAG, "***** LOCK CONFIG CHANGING", new RuntimeException());
57775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.v(TAG, "Cur orient=" + mCreationOrientation
57875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn                    + ", new config=" + newConfig);
57975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        }
58075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        updateConfiguration();
58175787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    }
5821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
5831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
5841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public boolean needsInput() {
5851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return false;
5861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
58747088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller
5881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
5891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onPause() {
590b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        mUpdateMonitor.removeCallback(mInfoCallback);
5916b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatusViewManager.onPause();
5921c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        mUnlockWidgetMethods.reset(false);
5931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
5941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
595cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller    private final Runnable mOnResumePing = new Runnable() {
596cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller        public void run() {
597cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller            mUnlockWidgetMethods.ping();
598cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller        }
599cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller    };
600cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller
6011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
6021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onResume() {
603b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        // We don't want to show the camera target if SIM state prevents us from
604b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        // launching the camera. So watch for SIM changes...
605bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller        mUpdateMonitor.registerCallback(mInfoCallback);
606b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
6076b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatusViewManager.onResume();
608cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller        postDelayed(mOnResumePing, ON_RESUME_PING_DELAY);
6091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
6101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
6111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
6121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void cleanUp() {
613b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        mUpdateMonitor.removeCallback(mInfoCallback); // this must be first
6148818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        mUnlockWidgetMethods.cleanUp();
6158b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mLockPatternUtils = null;
6168b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mUpdateMonitor = null;
6178b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mCallback = null;
6181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
6191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project}
620