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
171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpackage com.android.internal.policy.impl;
181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.R;
20b030476d193a423f6c1baf3053f66fc768c925e0Jim Millerimport com.android.internal.policy.impl.KeyguardUpdateMonitor.InfoCallbackImpl;
21b030476d193a423f6c1baf3053f66fc768c925e0Jim Millerimport com.android.internal.policy.impl.KeyguardUpdateMonitor.SimStateCallback;
22b030476d193a423f6c1baf3053f66fc768c925e0Jim Millerimport com.android.internal.telephony.IccCard.State;
231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.widget.LockPatternUtils;
2480080e54ef571a5109563d4bfc4619197961f51aJim Millerimport com.android.internal.widget.SlidingTab;
253060421045d4d9e411797f91bb509824b03e33fbJim Millerimport com.android.internal.widget.WaveView;
26955a016922ea49f154d190b054a202559b41a4d3Jim Millerimport com.android.internal.widget.multiwaveview.GlowPadView;
271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
283b4fcbc9f13bab6a2e9e5c37cc5e18fec7341c04Brett Chabotimport android.app.ActivityManager;
293868cee0b9306644b250d3cd78b1be7af70abf68Jim Millerimport android.app.ActivityManagerNative;
30c00fd7ab302198635885c1e090b41e3d11adc8eaJim Millerimport android.app.SearchManager;
313868cee0b9306644b250d3cd78b1be7af70abf68Jim Millerimport android.content.ActivityNotFoundException;
320799440ab3ce50ffa6acb762cb7677abdffb3f74Jim Millerimport android.content.ComponentName;
331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context;
34be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Millerimport android.content.Intent;
355475906f53e2d79807548932dfabbf9945143740Jim Millerimport android.content.res.Configuration;
36bd998018ed028c1922d3cf14aeabe24ff1818761Jim Millerimport android.content.res.Resources;
37bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurentimport android.os.Vibrator;
381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.KeyEvent;
391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.LayoutInflater;
401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.View;
411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.ViewGroup;
42d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaenimport android.widget.*;
43d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaenimport android.util.Log;
440799440ab3ce50ffa6acb762cb7677abdffb3f74Jim Millerimport android.util.Slog;
45d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaenimport android.media.AudioManager;
463868cee0b9306644b250d3cd78b1be7af70abf68Jim Millerimport android.os.RemoteException;
47b75783571b2b51357f97407903b2fda9534f91f9Wu-cheng Liimport android.provider.MediaStore;
4836931ac9b3cc2e8f60f730c51e715744b5c4f6c0Jim Miller
49bd998018ed028c1922d3cf14aeabe24ff1818761Jim Millerimport java.io.File;
501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/**
521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The screen within {@link LockPatternKeyguardView} that shows general
531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * information about the device depending on its state, and how to get
541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * past it, as applicable.
551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */
566b05d58018c2806459c121e507c005639b74aee9Jim Millerclass LockScreen extends LinearLayout implements KeyguardScreen {
57d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaen
58cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller    private static final int ON_RESUME_PING_DELAY = 500; // delay first ping until the screen is on
59bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    private static final boolean DBG = false;
60bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    private static final String TAG = "LockScreen";
61bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    private static final String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key";
626b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int WAIT_FOR_ANIMATION_TIMEOUT = 0;
636b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int STAY_ON_WHILE_GRABBED_TIMEOUT = 30000;
643294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller    private static final String ASSIST_ICON_METADATA_NAME =
653294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller            "com.android.systemui.action_assist_icon";
66d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaen
678b886fab5496b0b1f5193f21855220176deddc37Jim Miller    private LockPatternUtils mLockPatternUtils;
688b886fab5496b0b1f5193f21855220176deddc37Jim Miller    private KeyguardUpdateMonitor mUpdateMonitor;
698b886fab5496b0b1f5193f21855220176deddc37Jim Miller    private KeyguardScreenCallback mCallback;
701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
71b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    // set to 'true' to show the ring/silence target when camera isn't available
72b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    private boolean mEnableRingSilenceFallback = false;
73b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
745475906f53e2d79807548932dfabbf9945143740Jim Miller    // current configuration state of keyboard and display
755475906f53e2d79807548932dfabbf9945143740Jim Miller    private int mCreationOrientation;
765475906f53e2d79807548932dfabbf9945143740Jim Miller
77d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaen    private boolean mSilentMode;
78ec3fc0a6415319a5f4f292b8f3d95eb400b33fbcKarl Rosaen    private AudioManager mAudioManager;
79bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    private boolean mEnableMenuKeyInLockScreen;
80d322c437fe48dc03f0df94492267b3783e3411cbKarl Rosaen
816b05d58018c2806459c121e507c005639b74aee9Jim Miller    private KeyguardStatusViewManager mStatusViewManager;
821c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    private UnlockWidgetCommonMethods mUnlockWidgetMethods;
831c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    private View mUnlockWidget;
84c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller    private boolean mCameraDisabled;
85c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller    private boolean mSearchDisabled;
86bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent    // Is there a vibrator
87bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent    private final boolean mHasVibrator;
88b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
89b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    InfoCallbackImpl mInfoCallback = new InfoCallbackImpl() {
90b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
91b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        @Override
92b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void onRingerModeChanged(int state) {
93b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            boolean silent = AudioManager.RINGER_MODE_NORMAL != state;
94b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            if (silent != mSilentMode) {
95b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                mSilentMode = silent;
96b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                mUnlockWidgetMethods.updateResources();
97b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            }
98b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
99b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
100b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        @Override
101b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void onDevicePolicyManagerStateChanged() {
102c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller            updateTargets();
103b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
104b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
105b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    };
106b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
107b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    SimStateCallback mSimStateCallback = new SimStateCallback() {
108b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void onSimStateChanged(State simState) {
109c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller            updateTargets();
110b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
111b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    };
1121c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1131c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    private interface UnlockWidgetCommonMethods {
1141c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        // Update resources based on phone state
1151c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void updateResources();
1161c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1171c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        // Get the view associated with this widget
1181c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public View getView();
1193060421045d4d9e411797f91bb509824b03e33fbJim Miller
1201c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        // Reset the view
1211c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void reset(boolean animate);
1221c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1231c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        // Animate the widget if it supports ping()
1241c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void ping();
125b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
126b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        // Enable or disable a target. ResourceId is the id of the *drawable* associated with the
127b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        // target.
128b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void setEnabled(int resourceId, boolean enabled);
129b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
130b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        // Get the target position for the given resource. Returns -1 if not found.
131b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public int getTargetPosition(int resourceId);
1328818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller
1338818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        // Clean up when this widget is going away
1348818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        public void cleanUp();
1351c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    }
1361c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1371c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    class SlidingTabMethods implements SlidingTab.OnTriggerListener, UnlockWidgetCommonMethods {
1381c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        private final SlidingTab mSlidingTab;
1391c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1401c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        SlidingTabMethods(SlidingTab slidingTab) {
1411c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            mSlidingTab = slidingTab;
1421c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
1431c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1441c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void updateResources() {
1453060421045d4d9e411797f91bb509824b03e33fbJim Miller            boolean vibe = mSilentMode
1463060421045d4d9e411797f91bb509824b03e33fbJim Miller                && (mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE);
1473060421045d4d9e411797f91bb509824b03e33fbJim Miller
1483060421045d4d9e411797f91bb509824b03e33fbJim Miller            mSlidingTab.setRightTabResources(
1493060421045d4d9e411797f91bb509824b03e33fbJim Miller                    mSilentMode ? ( vibe ? R.drawable.ic_jog_dial_vibrate_on
1503060421045d4d9e411797f91bb509824b03e33fbJim Miller                                         : R.drawable.ic_jog_dial_sound_off )
1513060421045d4d9e411797f91bb509824b03e33fbJim Miller                                : R.drawable.ic_jog_dial_sound_on,
1523060421045d4d9e411797f91bb509824b03e33fbJim Miller                    mSilentMode ? R.drawable.jog_tab_target_yellow
1533060421045d4d9e411797f91bb509824b03e33fbJim Miller                                : R.drawable.jog_tab_target_gray,
1543060421045d4d9e411797f91bb509824b03e33fbJim Miller                    mSilentMode ? R.drawable.jog_tab_bar_right_sound_on
1553060421045d4d9e411797f91bb509824b03e33fbJim Miller                                : R.drawable.jog_tab_bar_right_sound_off,
1563060421045d4d9e411797f91bb509824b03e33fbJim Miller                    mSilentMode ? R.drawable.jog_tab_right_sound_on
1573060421045d4d9e411797f91bb509824b03e33fbJim Miller                                : R.drawable.jog_tab_right_sound_off);
1583060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
1593060421045d4d9e411797f91bb509824b03e33fbJim Miller
1603060421045d4d9e411797f91bb509824b03e33fbJim Miller        /** {@inheritDoc} */
1613060421045d4d9e411797f91bb509824b03e33fbJim Miller        public void onTrigger(View v, int whichHandle) {
1623060421045d4d9e411797f91bb509824b03e33fbJim Miller            if (whichHandle == SlidingTab.OnTriggerListener.LEFT_HANDLE) {
1633060421045d4d9e411797f91bb509824b03e33fbJim Miller                mCallback.goToUnlockScreen();
1643060421045d4d9e411797f91bb509824b03e33fbJim Miller            } else if (whichHandle == SlidingTab.OnTriggerListener.RIGHT_HANDLE) {
165b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                toggleRingMode();
1663060421045d4d9e411797f91bb509824b03e33fbJim Miller                mCallback.pokeWakelock();
1673060421045d4d9e411797f91bb509824b03e33fbJim Miller            }
1683060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
1693060421045d4d9e411797f91bb509824b03e33fbJim Miller
1703060421045d4d9e411797f91bb509824b03e33fbJim Miller        /** {@inheritDoc} */
1713060421045d4d9e411797f91bb509824b03e33fbJim Miller        public void onGrabbedStateChange(View v, int grabbedState) {
1723060421045d4d9e411797f91bb509824b03e33fbJim Miller            if (grabbedState == SlidingTab.OnTriggerListener.RIGHT_HANDLE) {
1733060421045d4d9e411797f91bb509824b03e33fbJim Miller                mSilentMode = isSilentMode();
1743060421045d4d9e411797f91bb509824b03e33fbJim Miller                mSlidingTab.setRightHintText(mSilentMode ? R.string.lockscreen_sound_on_label
1753060421045d4d9e411797f91bb509824b03e33fbJim Miller                        : R.string.lockscreen_sound_off_label);
1763060421045d4d9e411797f91bb509824b03e33fbJim Miller            }
1774d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // Don't poke the wake lock when returning to a state where the handle is
1784d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // not grabbed since that can happen when the system (instead of the user)
1794d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // cancels the grab.
1804d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            if (grabbedState != SlidingTab.OnTriggerListener.NO_HANDLE) {
1814d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown                mCallback.pokeWakelock();
1824d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            }
1833060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
1841c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1851c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public View getView() {
1861c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            return mSlidingTab;
1871c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
1881c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1891c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void reset(boolean animate) {
1901c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            mSlidingTab.reset(animate);
1911c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
1921c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
1931c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void ping() {
1941c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
195b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
196b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void setEnabled(int resourceId, boolean enabled) {
197b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            // Not used
198b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
199b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
200b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public int getTargetPosition(int resourceId) {
201b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            return -1; // Not supported
202b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
2038818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller
2048818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        public void cleanUp() {
2058818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller            mSlidingTab.setOnTriggerListener(null);
2068818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        }
2073060421045d4d9e411797f91bb509824b03e33fbJim Miller    }
2083060421045d4d9e411797f91bb509824b03e33fbJim Miller
2091c8d207201150c29ac92c424e1320c715a64b5bcJim Miller    class WaveViewMethods implements WaveView.OnTriggerListener, UnlockWidgetCommonMethods {
2101c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
2111c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        private final WaveView mWaveView;
2121c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
2131c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        WaveViewMethods(WaveView waveView) {
2141c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            mWaveView = waveView;
2151c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
2163060421045d4d9e411797f91bb509824b03e33fbJim Miller        /** {@inheritDoc} */
2173060421045d4d9e411797f91bb509824b03e33fbJim Miller        public void onTrigger(View v, int whichHandle) {
2183060421045d4d9e411797f91bb509824b03e33fbJim Miller            if (whichHandle == WaveView.OnTriggerListener.CENTER_HANDLE) {
219b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                requestUnlockScreen();
2203060421045d4d9e411797f91bb509824b03e33fbJim Miller            }
2213060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
2223060421045d4d9e411797f91bb509824b03e33fbJim Miller
2233060421045d4d9e411797f91bb509824b03e33fbJim Miller        /** {@inheritDoc} */
2243060421045d4d9e411797f91bb509824b03e33fbJim Miller        public void onGrabbedStateChange(View v, int grabbedState) {
2254d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // Don't poke the wake lock when returning to a state where the handle is
2264d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // not grabbed since that can happen when the system (instead of the user)
2274d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            // cancels the grab.
2284139b5505c1e07c56900aa72dd91a01e6b740f5fJim Miller            if (grabbedState == WaveView.OnTriggerListener.CENTER_HANDLE) {
2294139b5505c1e07c56900aa72dd91a01e6b740f5fJim Miller                mCallback.pokeWakelock(STAY_ON_WHILE_GRABBED_TIMEOUT);
2304139b5505c1e07c56900aa72dd91a01e6b740f5fJim Miller            }
2313060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
2321c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
2331c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void updateResources() {
2341c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
2351c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
2361c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public View getView() {
2371c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            return mWaveView;
2381c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
2391c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void reset(boolean animate) {
2401c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            mWaveView.reset();
2411c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
2421c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void ping() {
2431c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
244b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void setEnabled(int resourceId, boolean enabled) {
245b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            // Not used
246b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
247b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public int getTargetPosition(int resourceId) {
248b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            return -1; // Not supported
249b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
2508818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        public void cleanUp() {
2518818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller            mWaveView.setOnTriggerListener(null);
2528818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        }
2533060421045d4d9e411797f91bb509824b03e33fbJim Miller    }
2543060421045d4d9e411797f91bb509824b03e33fbJim Miller
255955a016922ea49f154d190b054a202559b41a4d3Jim Miller    class GlowPadViewMethods implements GlowPadView.OnTriggerListener,
2561c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            UnlockWidgetCommonMethods {
257955a016922ea49f154d190b054a202559b41a4d3Jim Miller        private final GlowPadView mGlowPadView;
2581c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
259955a016922ea49f154d190b054a202559b41a4d3Jim Miller        GlowPadViewMethods(GlowPadView glowPadView) {
260955a016922ea49f154d190b054a202559b41a4d3Jim Miller            mGlowPadView = glowPadView;
261b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
262b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
263c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller        public boolean isTargetPresent(int resId) {
264955a016922ea49f154d190b054a202559b41a4d3Jim Miller            return mGlowPadView.getTargetPosition(resId) != -1;
2651c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
2661c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
2671c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void updateResources() {
268be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller            int resId;
269b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            if (mCameraDisabled && mEnableRingSilenceFallback) {
270b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                // Fall back to showing ring/silence if camera is disabled...
271be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller                resId = mSilentMode ? R.array.lockscreen_targets_when_silent
272be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller                    : R.array.lockscreen_targets_when_soundon;
273be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller            } else {
274be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller                resId = R.array.lockscreen_targets_with_camera;
275be8d1cf1ac9fc514fb0cc2e8ef4a85beb0197fa0Jim Miller            }
276955a016922ea49f154d190b054a202559b41a4d3Jim Miller            if (mGlowPadView.getTargetResourceId() != resId) {
277955a016922ea49f154d190b054a202559b41a4d3Jim Miller                mGlowPadView.setTargetResources(resId);
278b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            }
2793294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller
2803294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller            // Update the search icon with drawable from the search .apk
2813294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller            if (!mSearchDisabled) {
28245308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                Intent intent = SearchManager.getAssistIntent(mContext);
28345308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                if (intent != null) {
28445308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    // XXX Hack. We need to substitute the icon here but haven't formalized
28545308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    // the public API. The "_google" metadata will be going away, so
28645308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    // DON'T USE IT!
28745308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    ComponentName component = intent.getComponent();
28845308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component,
28945308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                            ASSIST_ICON_METADATA_NAME + "_google",
29045308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                            com.android.internal.R.drawable.ic_action_assist_generic);
29145308b1b3b1582d048845df2ee5301241e52a5cfJim Miller
29245308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component,
29345308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                                ASSIST_ICON_METADATA_NAME,
29445308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                                com.android.internal.R.drawable.ic_action_assist_generic)) {
29545308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                            Slog.w(TAG, "Couldn't grab icon from package " + component);
2963294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller                    }
2973294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller                }
2983294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller            }
2993294b6b09b2f52cb44005720051c32c9c851fc9fJim Miller
300b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            setEnabled(com.android.internal.R.drawable.ic_lockscreen_camera, !mCameraDisabled);
30120039ad17b94873ee40fdd61c3d1d1aa590010dfJim Miller            setEnabled(com.android.internal.R.drawable.ic_action_assist_generic, !mSearchDisabled);
3021c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
3031c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
304b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        public void onGrabbed(View v, int handle) {
305b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
306b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }
3071c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
308b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        public void onReleased(View v, int handle) {
309b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
310b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }
3111c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
312b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        public void onTrigger(View v, int target) {
313955a016922ea49f154d190b054a202559b41a4d3Jim Miller            final int resId = mGlowPadView.getResourceIdForTarget(target);
314b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            switch (resId) {
31520039ad17b94873ee40fdd61c3d1d1aa590010dfJim Miller                case com.android.internal.R.drawable.ic_action_assist_generic:
31645308b1b3b1582d048845df2ee5301241e52a5cfJim Miller                    Intent assistIntent = SearchManager.getAssistIntent(mContext);
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
342c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller        private void launchActivity(Intent intent) {
343b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            intent.setFlags(
344b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                    Intent.FLAG_ACTIVITY_NEW_TASK
345b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                    | Intent.FLAG_ACTIVITY_SINGLE_TOP
346b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
347b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            try {
348b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
349b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            } catch (RemoteException e) {
350b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                Log.w(TAG, "can't dismiss keyguard on launch");
351b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            }
352b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            try {
353b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                mContext.startActivity(intent);
354b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            } catch (ActivityNotFoundException e) {
3554c351d62e7a09bcc29e7d0329bcdd947a302cf40Jim Miller                Log.w(TAG, "Activity not found for intent + " + intent.getAction());
356b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            }
357b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }
358b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
359b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        public void onGrabbedStateChange(View v, int handle) {
360b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            // Don't poke the wake lock when returning to a state where the handle is
361b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            // not grabbed since that can happen when the system (instead of the user)
362b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            // cancels the grab.
363955a016922ea49f154d190b054a202559b41a4d3Jim Miller            if (handle != GlowPadView.OnTriggerListener.NO_HANDLE) {
364b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                mCallback.pokeWakelock();
365b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            }
366b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }
3671c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
3681c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public View getView() {
369955a016922ea49f154d190b054a202559b41a4d3Jim Miller            return mGlowPadView;
3701c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
3711c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
3721c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void reset(boolean animate) {
373955a016922ea49f154d190b054a202559b41a4d3Jim Miller            mGlowPadView.reset(animate);
3741c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
3751c8d207201150c29ac92c424e1320c715a64b5bcJim Miller
3761c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        public void ping() {
377955a016922ea49f154d190b054a202559b41a4d3Jim Miller            mGlowPadView.ping();
3781c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        }
379b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
380b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public void setEnabled(int resourceId, boolean enabled) {
381955a016922ea49f154d190b054a202559b41a4d3Jim Miller            mGlowPadView.setEnableTarget(resourceId, enabled);
382b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
383b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
384b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        public int getTargetPosition(int resourceId) {
385955a016922ea49f154d190b054a202559b41a4d3Jim Miller            return mGlowPadView.getTargetPosition(resourceId);
386b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
3878818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller
3888818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        public void cleanUp() {
389955a016922ea49f154d190b054a202559b41a4d3Jim Miller            mGlowPadView.setOnTriggerListener(null);
3908818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        }
391998bb765290066822ff8a3b378dadd71deb0ce73Jim Miller
392998bb765290066822ff8a3b378dadd71deb0ce73Jim Miller        public void onFinishFinalAnimation() {
393998bb765290066822ff8a3b378dadd71deb0ce73Jim Miller
394998bb765290066822ff8a3b378dadd71deb0ce73Jim Miller        }
395b505074e8273887fbcd1e933738a42e770085fb8Jim Miller    }
396b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
397b505074e8273887fbcd1e933738a42e770085fb8Jim Miller    private void requestUnlockScreen() {
398b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        // Delay hiding lock screen long enough for animation to finish
399b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        postDelayed(new Runnable() {
400b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            public void run() {
401b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                mCallback.goToUnlockScreen();
402b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            }
403b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }, WAIT_FOR_ANIMATION_TIMEOUT);
404b505074e8273887fbcd1e933738a42e770085fb8Jim Miller    }
405b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
406b505074e8273887fbcd1e933738a42e770085fb8Jim Miller    private void toggleRingMode() {
407b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        // toggle silent mode
408b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        mSilentMode = !mSilentMode;
409b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        if (mSilentMode) {
410bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent            mAudioManager.setRingerMode(mHasVibrator
411b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                ? AudioManager.RINGER_MODE_VIBRATE
412b505074e8273887fbcd1e933738a42e770085fb8Jim Miller                : AudioManager.RINGER_MODE_SILENT);
413b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        } else {
414b505074e8273887fbcd1e933738a42e770085fb8Jim Miller            mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
415b505074e8273887fbcd1e933738a42e770085fb8Jim Miller        }
416b505074e8273887fbcd1e933738a42e770085fb8Jim Miller    }
417b505074e8273887fbcd1e933738a42e770085fb8Jim Miller
418bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    /**
419bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     * In general, we enable unlocking the insecure key guard with the menu key. However, there are
420bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     * some cases where we wish to disable it, notably when the menu button placement or technology
421bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     * is prone to false positives.
422bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     *
423bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     * @return true if the menu key should be enabled
424bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller     */
425bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    private boolean shouldEnableMenuKey() {
426bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller        final Resources res = getResources();
427bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller        final boolean configDisabled = res.getBoolean(R.bool.config_disableMenuKeyInLockScreen);
4283b4fcbc9f13bab6a2e9e5c37cc5e18fec7341c04Brett Chabot        final boolean isTestHarness = ActivityManager.isRunningInTestHarness();
429bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller        final boolean fileOverride = (new File(ENABLE_MENU_KEY_FILE)).exists();
4303b4fcbc9f13bab6a2e9e5c37cc5e18fec7341c04Brett Chabot        return !configDisabled || isTestHarness || fileOverride;
431bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller    }
4321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
4331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
4341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param context Used to setup the view.
4355475906f53e2d79807548932dfabbf9945143740Jim Miller     * @param configuration The current configuration. Used to use when selecting layout, etc.
4361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param lockPatternUtils Used to know the state of the lock pattern settings.
4371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param updateMonitor Used to register for updates on various keyguard related
4381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *    state, and query the initial state at setup.
4391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param callback Used to communicate back to the host keyguard view.
4401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
4415475906f53e2d79807548932dfabbf9945143740Jim Miller    LockScreen(Context context, Configuration configuration, LockPatternUtils lockPatternUtils,
4421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            KeyguardUpdateMonitor updateMonitor,
4431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            KeyguardScreenCallback callback) {
4441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        super(context);
4451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mLockPatternUtils = lockPatternUtils;
4461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mUpdateMonitor = updateMonitor;
4471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mCallback = callback;
448bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller        mEnableMenuKeyInLockScreen = shouldEnableMenuKey();
4495475906f53e2d79807548932dfabbf9945143740Jim Miller        mCreationOrientation = configuration.orientation;
45080be841eafe3b7b9f8dba820ba3201843717e610Karl Rosaen
45175787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        if (LockPatternKeyguardView.DEBUG_CONFIGURATION) {
45275787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.v(TAG, "***** CREATING LOCK SCREEN", new RuntimeException());
45375787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.v(TAG, "Cur orient=" + mCreationOrientation
45475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn                    + " res orient=" + context.getResources().getConfiguration().orientation);
45575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        }
456368de81b71af00628b60558a52c7df53e1cd1e96Daniel Sandler
4571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        final LayoutInflater inflater = LayoutInflater.from(context);
4585475906f53e2d79807548932dfabbf9945143740Jim Miller        if (DBG) Log.v(TAG, "Creation orientation = " + mCreationOrientation);
4595475906f53e2d79807548932dfabbf9945143740Jim Miller        if (mCreationOrientation != Configuration.ORIENTATION_LANDSCAPE) {
46080080e54ef571a5109563d4bfc4619197961f51aJim Miller            inflater.inflate(R.layout.keyguard_screen_tab_unlock, this, true);
46180be841eafe3b7b9f8dba820ba3201843717e610Karl Rosaen        } else {
46280080e54ef571a5109563d4bfc4619197961f51aJim Miller            inflater.inflate(R.layout.keyguard_screen_tab_unlock_land, this, true);
46380be841eafe3b7b9f8dba820ba3201843717e610Karl Rosaen        }
4641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
4656b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatusViewManager = new KeyguardStatusViewManager(this, mUpdateMonitor, mLockPatternUtils,
466ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen                mCallback, false);
4671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
4681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        setFocusable(true);
4691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        setFocusableInTouchMode(true);
4701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
4711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
472bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent        Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
473bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent        mHasVibrator = vibrator == null ? false : vibrator.hasVibrator();
4746b05d58018c2806459c121e507c005639b74aee9Jim Miller        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
475c119f1299b63c224df5e7fa9c197f394eee890caJim Miller        mSilentMode = isSilentMode();
4761c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        mUnlockWidget = findViewById(R.id.unlock_widget);
477b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        mUnlockWidgetMethods = createUnlockMethods(mUnlockWidget);
478b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
479b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        if (DBG) Log.v(TAG, "*** LockScreen accel is "
480b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                + (mUnlockWidget.isHardwareAccelerated() ? "on":"off"));
481b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    }
482b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
483b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    private UnlockWidgetCommonMethods createUnlockMethods(View unlockWidget) {
484b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        if (unlockWidget instanceof SlidingTab) {
485b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            SlidingTab slidingTabView = (SlidingTab) unlockWidget;
4861c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            slidingTabView.setHoldAfterTrigger(true, false);
4871c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            slidingTabView.setLeftHintText(R.string.lockscreen_unlock_label);
4881c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            slidingTabView.setLeftTabResources(
4893060421045d4d9e411797f91bb509824b03e33fbJim Miller                    R.drawable.ic_jog_dial_unlock,
4903060421045d4d9e411797f91bb509824b03e33fbJim Miller                    R.drawable.jog_tab_target_green,
4913060421045d4d9e411797f91bb509824b03e33fbJim Miller                    R.drawable.jog_tab_bar_left_unlock,
4923060421045d4d9e411797f91bb509824b03e33fbJim Miller                    R.drawable.jog_tab_left_unlock);
4931c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            SlidingTabMethods slidingTabMethods = new SlidingTabMethods(slidingTabView);
4941c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            slidingTabView.setOnTriggerListener(slidingTabMethods);
495b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            return slidingTabMethods;
496b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        } else if (unlockWidget instanceof WaveView) {
497b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            WaveView waveView = (WaveView) unlockWidget;
4981c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            WaveViewMethods waveViewMethods = new WaveViewMethods(waveView);
4991c8d207201150c29ac92c424e1320c715a64b5bcJim Miller            waveView.setOnTriggerListener(waveViewMethods);
500b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            return waveViewMethods;
501955a016922ea49f154d190b054a202559b41a4d3Jim Miller        } else if (unlockWidget instanceof GlowPadView) {
502955a016922ea49f154d190b054a202559b41a4d3Jim Miller            GlowPadView glowPadView = (GlowPadView) unlockWidget;
503955a016922ea49f154d190b054a202559b41a4d3Jim Miller            GlowPadViewMethods glowPadViewMethods = new GlowPadViewMethods(glowPadView);
504955a016922ea49f154d190b054a202559b41a4d3Jim Miller            glowPadView.setOnTriggerListener(glowPadViewMethods);
505955a016922ea49f154d190b054a202559b41a4d3Jim Miller            return glowPadViewMethods;
5063060421045d4d9e411797f91bb509824b03e33fbJim Miller        } else {
507b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            throw new IllegalStateException("Unrecognized unlock widget: " + unlockWidget);
5083060421045d4d9e411797f91bb509824b03e33fbJim Miller        }
509b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    }
510c119f1299b63c224df5e7fa9c197f394eee890caJim Miller
511c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller    private void updateTargets() {
512b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        boolean disabledByAdmin = mLockPatternUtils.getDevicePolicyManager()
513b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller                .getCameraDisabled(null);
514b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        boolean disabledBySimState = mUpdateMonitor.isSimLocked();
515955a016922ea49f154d190b054a202559b41a4d3Jim Miller        boolean cameraTargetPresent = (mUnlockWidgetMethods instanceof GlowPadViewMethods)
516955a016922ea49f154d190b054a202559b41a4d3Jim Miller                ? ((GlowPadViewMethods) mUnlockWidgetMethods)
517c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller                        .isTargetPresent(com.android.internal.R.drawable.ic_lockscreen_camera)
518c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller                        : false;
519955a016922ea49f154d190b054a202559b41a4d3Jim Miller        boolean searchTargetPresent = (mUnlockWidgetMethods instanceof GlowPadViewMethods)
520955a016922ea49f154d190b054a202559b41a4d3Jim Miller                ? ((GlowPadViewMethods) mUnlockWidgetMethods)
52120039ad17b94873ee40fdd61c3d1d1aa590010dfJim Miller                        .isTargetPresent(com.android.internal.R.drawable.ic_action_assist_generic)
522c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller                        : false;
523c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller
524b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        if (disabledByAdmin) {
525b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            Log.v(TAG, "Camera disabled by Device Policy");
526b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        } else if (disabledBySimState) {
527b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller            Log.v(TAG, "Camera disabled by Sim State");
528b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        }
52945308b1b3b1582d048845df2ee5301241e52a5cfJim Miller        boolean searchActionAvailable = SearchManager.getAssistIntent(mContext) != null;
530c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller        mCameraDisabled = disabledByAdmin || disabledBySimState || !cameraTargetPresent;
531c00fd7ab302198635885c1e090b41e3d11adc8eaJim Miller        mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent;
5321c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        mUnlockWidgetMethods.updateResources();
533a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen    }
534a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen
535c119f1299b63c224df5e7fa9c197f394eee890caJim Miller    private boolean isSilentMode() {
53682d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler        return mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL;
537c119f1299b63c224df5e7fa9c197f394eee890caJim Miller    }
538c119f1299b63c224df5e7fa9c197f394eee890caJim Miller
5391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    @Override
5401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
541bd998018ed028c1922d3cf14aeabe24ff1818761Jim Miller        if (keyCode == KeyEvent.KEYCODE_MENU && mEnableMenuKeyInLockScreen) {
5421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCallback.goToUnlockScreen();
5431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
5441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return false;
5451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
5461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
54775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    void updateConfiguration() {
54875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        Configuration newConfig = getResources().getConfiguration();
5495475906f53e2d79807548932dfabbf9945143740Jim Miller        if (newConfig.orientation != mCreationOrientation) {
5505475906f53e2d79807548932dfabbf9945143740Jim Miller            mCallback.recreateMe(newConfig);
5511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
5521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
553368de81b71af00628b60558a52c7df53e1cd1e96Daniel Sandler
55475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    @Override
55575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    protected void onAttachedToWindow() {
55675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        super.onAttachedToWindow();
55775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        if (LockPatternKeyguardView.DEBUG_CONFIGURATION) {
55875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.v(TAG, "***** LOCK ATTACHED TO WINDOW");
55975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.v(TAG, "Cur orient=" + mCreationOrientation
56075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn                    + ", new config=" + getResources().getConfiguration());
56175787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        }
56275787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        updateConfiguration();
56375787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    }
56475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn
56575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    /** {@inheritDoc} */
56675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    @Override
56775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    protected void onConfigurationChanged(Configuration newConfig) {
56875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        super.onConfigurationChanged(newConfig);
56975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        if (LockPatternKeyguardView.DEBUG_CONFIGURATION) {
57075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.w(TAG, "***** LOCK CONFIG CHANGING", new RuntimeException());
57175787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn            Log.v(TAG, "Cur orient=" + mCreationOrientation
57275787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn                    + ", new config=" + newConfig);
57375787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        }
57475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        updateConfiguration();
57575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    }
5761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
5771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
5781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public boolean needsInput() {
5791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return false;
5801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
58147088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller
5821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
5831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onPause() {
584b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        mUpdateMonitor.removeCallback(mInfoCallback);
585b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        mUpdateMonitor.removeCallback(mSimStateCallback);
5866b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatusViewManager.onPause();
5871c8d207201150c29ac92c424e1320c715a64b5bcJim Miller        mUnlockWidgetMethods.reset(false);
5881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
5891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
590cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller    private final Runnable mOnResumePing = new Runnable() {
591cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller        public void run() {
592cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller            mUnlockWidgetMethods.ping();
593cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller        }
594cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller    };
595cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller
5961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
5971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onResume() {
598b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        // We don't want to show the camera target if SIM state prevents us from
599b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        // launching the camera. So watch for SIM changes...
600b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        mUpdateMonitor.registerSimStateCallback(mSimStateCallback);
601b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        mUpdateMonitor.registerInfoCallback(mInfoCallback);
602b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller
6036b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatusViewManager.onResume();
604cd2bad41afdf7c112b66a436562d080f3b99af1bJim Miller        postDelayed(mOnResumePing, ON_RESUME_PING_DELAY);
6051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
6061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
6071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
6081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void cleanUp() {
609b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        mUpdateMonitor.removeCallback(mInfoCallback); // this must be first
610b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        mUpdateMonitor.removeCallback(mSimStateCallback);
6118818edbe2f5bef9cf161ef57e9296ff302ad44f6Jim Miller        mUnlockWidgetMethods.cleanUp();
6128b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mLockPatternUtils = null;
6138b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mUpdateMonitor = null;
6148b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mCallback = null;
6151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
6161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project}
617