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