KeyguardViewManager.java revision 6bcd73203ada36b446b05fa33f9834ac989c0621
11f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/* 21f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Copyright (C) 2007 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; 181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 19dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Activity; 20b375632c9cf7b7be9309ff55f602499d59cfa597Dianne Hackbornimport android.app.ActivityManager; 211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context; 221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.pm.ActivityInfo; 23dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.res.Configuration; 2406cc78a4e3126703cae88dbc969974267b9f2c94Jim Millerimport android.content.res.Resources; 251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.graphics.PixelFormat; 2638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackbornimport android.os.IBinder; 276bcd73203ada36b446b05fa33f9834ac989c0621Jim Millerimport android.os.Parcelable; 2856bacd76b2e8caaad6be933ceb7168e046f7253eJim Millerimport android.os.SystemProperties; 291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.Log; 300cbfcffe7b99eea85dc17e92ef204035fa6fd4f9Craig Mautnerimport android.util.Slog; 316bcd73203ada36b446b05fa33f9834ac989c0621Jim Millerimport android.util.SparseArray; 32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.LayoutInflater; 331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.View; 341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.ViewGroup; 351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.ViewManager; 361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManager; 371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.FrameLayout; 381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 39dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternUtils; 40dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.R; 416edf2637e96139735df83907c221cce16d4d7eaaJim Miller 421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/** 431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Manages creating, showing, hiding and resetting the keyguard. Calls back 441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * via {@link com.android.internal.policy.impl.KeyguardViewCallback} to poke 451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the wake lock and report that the keyguard is done, which is in turn, 461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * reported to this class by the current {@link KeyguardViewBase}. 471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 48dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardViewManager { 491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final static boolean DEBUG = false; 501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static String TAG = "KeyguardViewManager"; 513af630c8d18bcf4b23a5a308917319dd04cc8ed2Jim Miller public static boolean USE_UPPER_CASE = true; 521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final Context mContext; 541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final ViewManager mViewManager; 55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private final KeyguardViewMediator.ViewMediatorCallback mViewMediatorCallback; 561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private WindowManager.LayoutParams mWindowLayoutParams; 581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mNeedsInput = false; 5922dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller 601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private FrameLayout mKeyguardHost; 61dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardHostView mKeyguardView; 621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mScreenOn = false; 64dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private LockPatternUtils mLockPatternUtils; 651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn public interface ShowListener { 6738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn void onShown(IBinder windowToken); 6838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn }; 6938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn 701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param context Used to create views. 721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param viewManager Keyguard will be attached to this. 731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param callback Used to notify of changes. 74dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * @param lockPatternUtils 751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public KeyguardViewManager(Context context, ViewManager viewManager, 77dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardViewMediator.ViewMediatorCallback callback, 78dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller LockPatternUtils lockPatternUtils) { 791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mContext = context; 801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mViewManager = viewManager; 81dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mViewMediatorCallback = callback; 82dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternUtils = lockPatternUtils; 831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Show the keyguard. Will handle creating and attaching to the view manager 87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * lazily. 881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public synchronized void show() { 90dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.d(TAG, "show(); mKeyguardView==" + mKeyguardView); 91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 92dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller boolean enableScreenRotation = shouldEnableScreenRotation(); 93dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 946bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller maybeCreateKeyguardLocked(enableScreenRotation, false); 95dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller maybeEnableScreenRotation(enableScreenRotation); 96dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 97e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // Disable common aspects of the system/status/navigation bars that are not appropriate or 98e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // useful on any keyguard screen but can be re-shown by dialogs or SHOW_WHEN_LOCKED 99e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // activities. Other disabled bits are handled by the KeyguardViewMediator talking 100e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // directly to the status bar service. 101e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller final int visFlags = View.STATUS_BAR_DISABLE_HOME; 102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.v(TAG, "KGVM: Set visibility on " + mKeyguardHost + " to " + visFlags); 103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mKeyguardHost.setSystemUiVisibility(visFlags); 104dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 105dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams); 106dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mKeyguardHost.setVisibility(View.VISIBLE); 107dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mKeyguardView.show(); 108dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mKeyguardView.requestFocus(); 109dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 110dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 111dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private boolean shouldEnableScreenRotation() { 112dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Resources res = mContext.getResources(); 113dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return SystemProperties.getBoolean("lockscreen.rot_override",false) 114dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller || res.getBoolean(com.android.internal.R.bool.config_enableLockScreenRotation); 115dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller class ViewManagerHost extends FrameLayout { 118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public ViewManagerHost(Context context) { 1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project super(context); 1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onConfigurationChanged(Configuration newConfig) { 124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onConfigurationChanged(newConfig); 1256bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller maybeCreateKeyguardLocked(shouldEnableScreenRotation(), false); 1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1296bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller SparseArray<Parcelable> mStateContainer = new SparseArray<Parcelable>(); 1306bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller 1316bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller private void maybeCreateKeyguardLocked(boolean enableScreenRotation, boolean userSwitched) { 132dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final boolean isActivity = (mContext instanceof Activity); // for test activity 1331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1346bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller if (mKeyguardHost != null) { 1356bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller mKeyguardHost.saveHierarchyState(mStateContainer); 1366bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller } 1376bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller 1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardHost == null) { 1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "keyguard host is null, creating it..."); 1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 141dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mKeyguardHost = new ViewManagerHost(mContext); 1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int flags = WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN 144d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 145dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mNeedsInput) { 1471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 1481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 14998365d7663cbd82979a5700faf0050220b01084dJeff Brown if (ActivityManager.isHighEndGfx()) { 1505d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; 151b375632c9cf7b7be9309ff55f602499d59cfa597Dianne Hackborn } 152dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 153dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final int stretch = ViewGroup.LayoutParams.MATCH_PARENT; 154dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final int type = isActivity ? WindowManager.LayoutParams.TYPE_APPLICATION 155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller : WindowManager.LayoutParams.TYPE_KEYGUARD; 1561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project WindowManager.LayoutParams lp = new WindowManager.LayoutParams( 157dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller stretch, stretch, type, flags, PixelFormat.TRANSLUCENT); 1586b05d58018c2806459c121e507c005639b74aee9Jim Miller lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; 15901ad2f4a2d86faad2058159ad67840f1797955c0Dianne Hackborn lp.windowAnimations = com.android.internal.R.style.Animation_LockScreen; 16098365d7663cbd82979a5700faf0050220b01084dJeff Brown if (ActivityManager.isHighEndGfx()) { 1615d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; 1625d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn lp.privateFlags |= 1635d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED; 1645d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn } 16573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY; 1663dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown lp.inputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; 1673dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown lp.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS; 168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller lp.setTitle(isActivity ? "KeyguardMock" : "Keyguard"); 1691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWindowLayoutParams = lp; 1701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mViewManager.addView(mKeyguardHost, lp); 1711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1726bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller inflateKeyguardView(userSwitched); 173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams); 1746bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller 1756bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller mKeyguardHost.restoreHierarchyState(mStateContainer); 176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1786bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller private void inflateKeyguardView(boolean userSwitched) { 17900baebe124701903db8eb35abb087767c5d769a5Craig Mautner View v = mKeyguardHost.findViewById(R.id.keyguard_host_view); 18000baebe124701903db8eb35abb087767c5d769a5Craig Mautner if (v != null) { 18100baebe124701903db8eb35abb087767c5d769a5Craig Mautner mKeyguardHost.removeView(v); 182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1830cbfcffe7b99eea85dc17e92ef204035fa6fd4f9Craig Mautner // TODO: Remove once b/7094175 is fixed 1840cbfcffe7b99eea85dc17e92ef204035fa6fd4f9Craig Mautner Slog.d(TAG, "inflateKeyguardView: b/7094175 mContext.config=" 1850cbfcffe7b99eea85dc17e92ef204035fa6fd4f9Craig Mautner + mContext.getResources().getConfiguration()); 186dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final LayoutInflater inflater = LayoutInflater.from(mContext); 187dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller View view = inflater.inflate(R.layout.keyguard_host_view, mKeyguardHost, true); 188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mKeyguardView = (KeyguardHostView) view.findViewById(R.id.keyguard_host_view); 189dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mKeyguardView.setLockPatternUtils(mLockPatternUtils); 190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mKeyguardView.setViewMediatorCallback(mViewMediatorCallback); 191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1926bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller if (userSwitched) { 1936bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller mKeyguardView.goToUserSwitcher(); 1946bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller } 1956bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller 196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mScreenOn) { 197dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mKeyguardView.show(); 198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 2001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private void maybeEnableScreenRotation(boolean enableScreenRotation) { 202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // TODO: move this outside 20306cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller if (enableScreenRotation) { 204f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller if (DEBUG) Log.d(TAG, "Rotation sensor for lock screen On!"); 20582f91963188fd87aae0b35dd0f01ab95d5bb5fd3Jim Miller mWindowLayoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER; 20606cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller } else { 207f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller if (DEBUG) Log.d(TAG, "Rotation sensor for lock screen Off!"); 20806cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller mWindowLayoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; 20906cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller } 21006cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams); 2111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void setNeedsInput(boolean needsInput) { 2141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedsInput = needsInput; 2151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mWindowLayoutParams != null) { 2161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (needsInput) { 2171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWindowLayoutParams.flags &= 2181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 2191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 2201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWindowLayoutParams.flags |= 2211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams); 226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (java.lang.IllegalArgumentException e) { 227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // TODO: Ensure this method isn't called on views that are changing... 228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Log.w(TAG,"Can't update input method on " + mKeyguardHost + " window not attached"); 229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 2301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 23222dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller 2331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Reset the state of the view. 2351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2366bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller public synchronized void reset(boolean userSwitched) { 2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "reset()"); 238d979dd7fbcf053cdb4fa5691dc625d2dfa4071f5Amith Yamasani // User might have switched, check if we need to go back to keyguard 239d979dd7fbcf053cdb4fa5691dc625d2dfa4071f5Amith Yamasani // TODO: It's preferable to stay and show the correct lockscreen or unlock if none 2406bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller maybeCreateKeyguardLocked(shouldEnableScreenRotation(), userSwitched); 2411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public synchronized void onScreenTurnedOff() { 2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onScreenTurnedOff()"); 2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mScreenOn = false; 2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardView != null) { 2471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardView.onScreenTurnedOff(); 24815ea55a6f1ae44ca63da158e3539903d77433988Brian Colonna } 2491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 25138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn public synchronized void onScreenTurnedOn( 25238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn final KeyguardViewManager.ShowListener showListener) { 2531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onScreenTurnedOn()"); 2541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mScreenOn = true; 2551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardView != null) { 2561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardView.onScreenTurnedOn(); 2576edf2637e96139735df83907c221cce16d4d7eaaJim Miller 25838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn // Caller should wait for this window to be shown before turning 25938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn // on the screen. 26038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn if (mKeyguardHost.getVisibility() == View.VISIBLE) { 26138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn // Keyguard may be in the process of being shown, but not yet 26238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn // updated with the window manager... give it a chance to do so. 26338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn mKeyguardHost.post(new Runnable() { 264dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 26538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn if (mKeyguardHost.getVisibility() == View.VISIBLE) { 26638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn showListener.onShown(mKeyguardHost.getWindowToken()); 26738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } else { 26838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn showListener.onShown(null); 26938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 27038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 27138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn }); 27238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } else { 27338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn showListener.onShown(null); 27438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 27538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } else { 27638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn showListener.onShown(null); 27715ea55a6f1ae44ca63da158e3539903d77433988Brian Colonna } 2781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public synchronized void verifyUnlock() { 2811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "verifyUnlock()"); 2821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project show(); 2831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardView.verifyUnlock(); 2841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * A key has woken the device. We use this to potentially adjust the state 2881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * of the lock screen based on the key. 2891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 2901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The 'Tq' suffix is per the documentation in {@link android.view.WindowManagerPolicy}. 2911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Be sure not to take any action that takes a long time; any significant 2921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * action should be posted to a handler. 2931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 29456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown * @param keyCode The wake key. May be {@link KeyEvent#KEYCODE_UNKNOWN} if waking 29556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown * for a reason other than a key press. 2961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2973754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood public boolean wakeWhenReadyTq(int keyCode) { 2981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "wakeWhenReady(" + keyCode + ")"); 2991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardView != null) { 3001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardView.wakeWhenReadyTq(keyCode); 3013754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood return true; 3023754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood } else { 3033754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood Log.w(TAG, "mKeyguardView is null in wakeWhenReadyTq"); 3043754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood return false; 3051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Hides the keyguard view 3101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public synchronized void hide() { 3121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "hide()"); 3136edf2637e96139735df83907c221cce16d4d7eaaJim Miller 3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardHost != null) { 3151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardHost.setVisibility(View.GONE); 316a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen // Don't do this right away, so we can let the view continue to animate 31701ad2f4a2d86faad2058159ad67840f1797955c0Dianne Hackborn // as it goes away. 318a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen if (mKeyguardView != null) { 31922dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller final KeyguardViewBase lastView = mKeyguardView; 32022dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller mKeyguardView = null; 321a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen mKeyguardHost.postDelayed(new Runnable() { 322a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen public void run() { 323d7f7deb2862fcfe830df15b6dc1be041f2741d3dDianne Hackborn synchronized (KeyguardViewManager.this) { 32422dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller lastView.cleanUp(); 3258b886fab5496b0b1f5193f21855220176deddc37Jim Miller mKeyguardHost.removeView(lastView); 326d7f7deb2862fcfe830df15b6dc1be041f2741d3dDianne Hackborn } 327a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen } 328a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen }, 500); 3291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return Whether the keyguard is showing 3351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public synchronized boolean isShowing() { 3371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return (mKeyguardHost != null && mKeyguardHost.getVisibility() == View.VISIBLE); 3381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 340