1c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project/* 2c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 3c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * 4c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * you may not use this file except in compliance with the License. 6c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * You may obtain a copy of the License at 7c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * 8c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * 10c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * See the License for the specific language governing permissions and 14c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * limitations under the License. 15c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 16c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 17c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectpackage com.android.internal.policy.impl; 18c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 19c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.app.Activity; 20c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.app.ActivityManagerNative; 21c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.app.IActivityManager; 22c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.app.IStatusBar; 237771ef05bca4482bd428028278e0f153dcd5fd43Dianne Hackbornimport android.app.IUiModeManager; 247771ef05bca4482bd428028278e0f153dcd5fd43Dianne Hackbornimport android.app.UiModeManager; 256b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackbornimport android.content.ActivityNotFoundException; 26c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.BroadcastReceiver; 27c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.ContentResolver; 28c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.Context; 29c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.Intent; 30e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwoodimport android.content.IntentFilter; 31c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.pm.ActivityInfo; 32c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.pm.PackageManager; 33c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.res.Configuration; 34c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.res.Resources; 35c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.database.ContentObserver; 36a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackbornimport android.graphics.PixelFormat; 37c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.graphics.Rect; 38c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.Handler; 39c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.IBinder; 40c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.LocalPowerManager; 41c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.PowerManager; 42c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.RemoteException; 43c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.ServiceManager; 44c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.SystemClock; 45c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.SystemProperties; 46c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.Vibrator; 47c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.provider.Settings; 48c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 49c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport com.android.internal.policy.PolicyManager; 50c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport com.android.internal.telephony.ITelephony; 51888b24a9d219fcf6739de1953e55eebd2cbed807Dianne Hackbornimport com.android.internal.widget.PointerLocationView; 52888b24a9d219fcf6739de1953e55eebd2cbed807Dianne Hackborn 53c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.util.Config; 54c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.util.EventLog; 55c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.util.Log; 56525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshimaimport android.view.Display; 57c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.Gravity; 58c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.HapticFeedbackConstants; 59c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.IWindowManager; 60c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.KeyEvent; 61c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.MotionEvent; 62c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.WindowOrientationListener; 63c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.RawInputEvent; 64c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.Surface; 65c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.View; 66c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.ViewConfiguration; 67c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.Window; 68c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.WindowManager; 69c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; 70c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN; 71c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN; 72c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 73c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; 74c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 751615d63b8fd58d1e8d19207ffb0aeccf09840021Suchi Amalapurapuimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; 766b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackbornimport static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD; 77faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwoodimport static android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON; 78c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; 79c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; 80c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; 81c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; 82540d7de241b39b28480bf4b1bf6870307935fd8bDianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY; 83c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; 84c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL; 85c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; 86c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD; 87c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; 88c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_PHONE; 89c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_PRIORITY_PHONE; 90c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_SEARCH_BAR; 91c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; 92c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL; 934dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; 94c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; 95c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 96c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; 97c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; 98c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; 99c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_TOAST; 10022aff40df0f226280c8ea648d17c5aa56e30cc0dDianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; 101c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.WindowManagerImpl; 102c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.WindowManagerPolicy; 10301f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackbornimport android.view.animation.Animation; 10401f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackbornimport android.view.animation.AnimationUtils; 105c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.media.IAudioService; 106c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.media.AudioManager; 107c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 108f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackbornimport java.util.ArrayList; 109f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn 110c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project/** 111d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project * WindowManagerPolicy implementation for the Android phone UI. This 112d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project * introduces a new method suffix, Lp, for an internal lock of the 113d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project * PhoneWindowManager. This is used to protect some internal state, and 114d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project * can be acquired with either thw Lw and Li lock held, so has the restrictions 115d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project * of both of those when held. 116c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 117c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectpublic class PhoneWindowManager implements WindowManagerPolicy { 118c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final String TAG = "WindowManager"; 119c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final boolean DEBUG = false; 120c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final boolean localLOGV = DEBUG ? Config.LOGD : Config.LOGV; 1214eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project static final boolean DEBUG_LAYOUT = false; 122c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final boolean SHOW_STARTING_ANIMATIONS = true; 123c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final boolean SHOW_PROCESSES_ON_ALT_MENU = false; 124c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 12522aff40df0f226280c8ea648d17c5aa56e30cc0dDianne Hackborn // wallpaper is at the bottom, though the window manager may move it. 1268e7ee46cd28529fd9d03267986bcf40f926f4ae6Dianne Hackborn static final int WALLPAPER_LAYER = 2; 12722aff40df0f226280c8ea648d17c5aa56e30cc0dDianne Hackborn static final int APPLICATION_LAYER = 2; 12822aff40df0f226280c8ea648d17c5aa56e30cc0dDianne Hackborn static final int PHONE_LAYER = 3; 12922aff40df0f226280c8ea648d17c5aa56e30cc0dDianne Hackborn static final int SEARCH_BAR_LAYER = 4; 13022aff40df0f226280c8ea648d17c5aa56e30cc0dDianne Hackborn static final int STATUS_BAR_PANEL_LAYER = 5; 1314dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int SYSTEM_DIALOG_LAYER = 6; 132c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // toasts and the plugged-in battery thing 1334dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int TOAST_LAYER = 7; 1344dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int STATUS_BAR_LAYER = 8; 135c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // SIM errors and unlock. Not sure if this really should be in a high layer. 1364dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int PRIORITY_PHONE_LAYER = 9; 137c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // like the ANR / app crashed dialogs 1384dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int SYSTEM_ALERT_LAYER = 10; 139c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // system-level error dialogs 1404dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int SYSTEM_ERROR_LAYER = 11; 141c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // on-screen keyboards and other such input method user interfaces go here. 1424dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int INPUT_METHOD_LAYER = 12; 143c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // on-screen keyboards and other such input method user interfaces go here. 1444dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int INPUT_METHOD_DIALOG_LAYER = 13; 145c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // the keyguard; nothing on top of these can take focus, since they are 146c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // responsible for power management when displayed. 1474dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int KEYGUARD_LAYER = 14; 1484dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int KEYGUARD_DIALOG_LAYER = 15; 149c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // things in here CAN NOT take focus, but are shown on top of everything else. 1504dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn static final int SYSTEM_OVERLAY_LAYER = 16; 151c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 152540d7de241b39b28480bf4b1bf6870307935fd8bDianne Hackborn static final int APPLICATION_MEDIA_SUBLAYER = -2; 153540d7de241b39b28480bf4b1bf6870307935fd8bDianne Hackborn static final int APPLICATION_MEDIA_OVERLAY_SUBLAYER = -1; 154c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final int APPLICATION_PANEL_SUBLAYER = 1; 155c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final int APPLICATION_SUB_PANEL_SUBLAYER = 2; 156c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 157c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final float SLIDE_TOUCH_EVENT_SIZE_LIMIT = 0.6f; 158c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 159c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Debugging: set this to have the system act like there is no hard keyboard. 160c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final boolean KEYBOARD_ALWAYS_HIDDEN = false; 161c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 162c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static public final String SYSTEM_DIALOG_REASON_KEY = "reason"; 163c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions"; 164c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; 1655da799e012cc4427a4f656e2416bcd73c22acd83Joe Onorato static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; 166c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 167d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project final Object mLock = new Object(); 168d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project 169c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Context mContext; 170c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project IWindowManager mWindowManager; 171c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project LocalPowerManager mPowerManager; 172c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Vibrator mVibrator; // Vibrator for giving feedback of orientation changes 173c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 174397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn // Vibrator pattern for haptic feedback of a long press. 175397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn long[] mLongPressVibePattern; 176397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn 177397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn // Vibrator pattern for haptic feedback of virtual key press. 178397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn long[] mVirtualKeyVibePattern; 179397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn 18091971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani // Vibrator pattern for a short vibration. 18191971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani long[] mKeyboardTapVibePattern; 18291971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani 183086d88503e589f14560209000724fe5215a10937Dianne Hackborn // Vibrator pattern for haptic feedback during boot when safe mode is disabled. 184086d88503e589f14560209000724fe5215a10937Dianne Hackborn long[] mSafeModeDisabledVibePattern; 185086d88503e589f14560209000724fe5215a10937Dianne Hackborn 186086d88503e589f14560209000724fe5215a10937Dianne Hackborn // Vibrator pattern for haptic feedback during boot when safe mode is enabled. 187086d88503e589f14560209000724fe5215a10937Dianne Hackborn long[] mSafeModeEnabledVibePattern; 18871836f4cb6389042d839d2a26582f796c6e97c26Romain Guy 189c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** If true, hitting shift & menu will broadcast Intent.ACTION_BUG_REPORT */ 190c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mEnableShiftMenuBugReports = false; 191c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 192c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mSafeMode; 193c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project WindowState mStatusBar = null; 194f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn final ArrayList<WindowState> mStatusBarPanels = new ArrayList<WindowState>(); 195c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project WindowState mKeyguard = null; 196c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project KeyguardViewMediator mKeyguardMediator; 197c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project GlobalActions mGlobalActions; 198c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mShouldTurnOffOnKeyUp; 199c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project RecentApplicationsDialog mRecentAppsDialog; 200c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Handler mHandler; 201adda0c0fb04a828a71aba1bffa20689427b972bdDianne Hackborn 202a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn boolean mSystemReady; 203c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mLidOpen; 2047771ef05bca4482bd428028278e0f153dcd5fd43Dianne Hackborn int mUiMode = Configuration.UI_MODE_TYPE_NORMAL; 205b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED; 206e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood int mLidOpenRotation; 207e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood int mCarDockRotation; 208e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood int mDeskDockRotation; 209ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood boolean mCarDockEnablesAccelerometer; 210ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood boolean mDeskDockEnablesAccelerometer; 2118994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn int mLidKeyboardAccessibility; 2128994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn int mLidNavigationAccessibility; 213c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mScreenOn = false; 214c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mOrientationSensorEnabled = false; 215c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int mCurrentAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 216c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final int DEFAULT_ACCELEROMETER_ROTATION = 0; 217c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int mAccelerometerDefault = DEFAULT_ACCELEROMETER_ROTATION; 218c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mHasSoftInput = false; 219c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 220a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn int mPointerLocationMode = 0; 221a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn PointerLocationView mPointerLocationView = null; 222a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn 223c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // The current size of the screen. 224c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int mW, mH; 225c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // During layout, the current screen borders with all outer decoration 226c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // (status bar, input method dock) accounted for. 227c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int mCurLeft, mCurTop, mCurRight, mCurBottom; 228c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // During layout, the frame in which content should be displayed 229c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // to the user, accounting for all screen decoration except for any 230c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // space they deem as available for other content. This is usually 231c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // the same as mCur*, but may be larger if the screen decor has supplied 232c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // content insets. 233c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int mContentLeft, mContentTop, mContentRight, mContentBottom; 234c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // During layout, the current screen borders along with input method 235c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // windows are placed. 236c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int mDockLeft, mDockTop, mDockRight, mDockBottom; 237c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // During layout, the layer at which the doc window is placed. 238c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int mDockLayer; 239c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 240c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final Rect mTmpParentFrame = new Rect(); 241c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final Rect mTmpDisplayFrame = new Rect(); 242c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final Rect mTmpContentFrame = new Rect(); 243c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final Rect mTmpVisibleFrame = new Rect(); 244c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 245c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project WindowState mTopFullscreenOpaqueWindowState; 246c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mForceStatusBar; 2476b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn boolean mHideLockScreen; 2486b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn boolean mDismissKeyguard; 249c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mHomePressed; 250c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Intent mHomeIntent; 2516b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn Intent mCarDockIntent; 2526b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn Intent mDeskDockIntent; 253c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mSearchKeyPressed; 254c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean mConsumeSearchKeyUp; 255c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 256faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood // support for activating the lock screen while the screen is on 257faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood boolean mAllowLockscreenWhenOn; 258faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood int mLockScreenTimeout; 259faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood boolean mLockScreenTimerActive; 260faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood 2614c938f402663bcdbadc08af91afdd9e96eac7e42David Brown // Behavior of ENDCALL Button. (See Settings.System.END_BUTTON_BEHAVIOR.) 262c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int mEndcallBehavior; 2634c938f402663bcdbadc08af91afdd9e96eac7e42David Brown 2644c938f402663bcdbadc08af91afdd9e96eac7e42David Brown // Behavior of POWER button while in-call and screen on. 2654c938f402663bcdbadc08af91afdd9e96eac7e42David Brown // (See Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR.) 2664c938f402663bcdbadc08af91afdd9e96eac7e42David Brown int mIncallPowerBehavior; 2674c938f402663bcdbadc08af91afdd9e96eac7e42David Brown 268525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima int mLandscapeRotation = -1; 269525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima int mPortraitRotation = -1; 270525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima 27180c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn // Nothing to see here, move along... 27280c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn int mFancyRotationAnimation; 273c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 274c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project ShortcutManager mShortcutManager; 275c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project PowerManager.WakeLock mBroadcastWakeLock; 276c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 277c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project class SettingsObserver extends ContentObserver { 278c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project SettingsObserver(Handler handler) { 279c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project super(handler); 280c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2814c938f402663bcdbadc08af91afdd9e96eac7e42David Brown 282c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project void observe() { 283c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project ContentResolver resolver = mContext.getContentResolver(); 284c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project resolver.registerContentObserver(Settings.System.getUriFor( 285c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Settings.System.END_BUTTON_BEHAVIOR), false, this); 2864c938f402663bcdbadc08af91afdd9e96eac7e42David Brown resolver.registerContentObserver(Settings.Secure.getUriFor( 2874c938f402663bcdbadc08af91afdd9e96eac7e42David Brown Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR), false, this); 288c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project resolver.registerContentObserver(Settings.System.getUriFor( 289c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Settings.System.ACCELEROMETER_ROTATION), false, this); 290faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood resolver.registerContentObserver(Settings.System.getUriFor( 291faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood Settings.System.SCREEN_OFF_TIMEOUT), false, this); 292a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn resolver.registerContentObserver(Settings.System.getUriFor( 293a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn Settings.System.POINTER_LOCATION), false, this); 294c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project resolver.registerContentObserver(Settings.Secure.getUriFor( 295c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Settings.Secure.DEFAULT_INPUT_METHOD), false, this); 29680c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn resolver.registerContentObserver(Settings.System.getUriFor( 29780c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn "fancy_rotation_anim"), false, this); 298a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn updateSettings(); 299c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 300c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 301c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project @Override public void onChange(boolean selfChange) { 302a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn updateSettings(); 303c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project try { 304a985dd81d649d677e7d943a2d345a859cb1985b5Dianne Hackborn mWindowManager.setRotation(USE_LAST_ROTATION, false, 305a985dd81d649d677e7d943a2d345a859cb1985b5Dianne Hackborn mFancyRotationAnimation); 306c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (RemoteException e) { 307c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Ignore 308c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 309c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 310c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 311c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 312c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project class MyOrientationListener extends WindowOrientationListener { 313c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project MyOrientationListener(Context context) { 314c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project super(context); 315c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 316c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 317c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project @Override 318d9545f550cae5ef63a584f69ff3bc7369fa2f40aThe Android Open Source Project public void onOrientationChanged(int rotation) { 319c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Send updates based on orientation value 320adda0c0fb04a828a71aba1bffa20689427b972bdDianne Hackborn if (localLOGV) Log.v(TAG, "onOrientationChanged, rotation changed to " +rotation); 32180c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn try { 322a985dd81d649d677e7d943a2d345a859cb1985b5Dianne Hackborn mWindowManager.setRotation(rotation, false, 323a985dd81d649d677e7d943a2d345a859cb1985b5Dianne Hackborn mFancyRotationAnimation); 32480c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn } catch (RemoteException e) { 32580c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn // Ignore 3266538aeb517c71e94373139dc3a50f34d02875cb9Wink Saville 327c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 328c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 329c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 330c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project MyOrientationListener mOrientationListener; 331c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 33280c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn boolean useSensorForOrientationLp(int appOrientation) { 3339217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato // The app says use the sensor. 33480c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn if (appOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR) { 335c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 336c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 3379217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato // The user preference says we can rotate, and the app is willing to rotate. 3389217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato if (mAccelerometerDefault != 0 && 3399217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato (appOrientation == ActivityInfo.SCREEN_ORIENTATION_USER 3409217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato || appOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)) { 341c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 342c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 3439217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato // We're in a dock that has a rotation affinity, an the app is willing to rotate. 344b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn if ((mCarDockEnablesAccelerometer && mDockMode == Intent.EXTRA_DOCK_STATE_CAR) 345b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn || (mDeskDockEnablesAccelerometer && mDockMode == Intent.EXTRA_DOCK_STATE_DESK)) { 3469217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato // Note we override the nosensor flag here. 3479217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato if (appOrientation == ActivityInfo.SCREEN_ORIENTATION_USER 3489217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato || appOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 3499217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato || appOrientation == ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) { 3509217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato return true; 3519217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato } 3529217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato } 3539217e0fc7f11e53e3501b590d8c3ff848dc5dba3Joe Onorato // Else, don't use the sensor. 354c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 355c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 356c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 35785ab37471ebb51fe3d358ccaa6e44c83459b7471Suchi Amalapurapu /* 35885ab37471ebb51fe3d358ccaa6e44c83459b7471Suchi Amalapurapu * We always let the sensor be switched on by default except when 35985ab37471ebb51fe3d358ccaa6e44c83459b7471Suchi Amalapurapu * the user has explicitly disabled sensor based rotation or when the 36085ab37471ebb51fe3d358ccaa6e44c83459b7471Suchi Amalapurapu * screen is switched off. 36185ab37471ebb51fe3d358ccaa6e44c83459b7471Suchi Amalapurapu */ 362d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project boolean needSensorRunningLp() { 363d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project if (mCurrentAppOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR) { 364c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If the application has explicitly requested to follow the 365c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // orientation, then we need to turn the sensor or. 366c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 367c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 368b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn if ((mCarDockEnablesAccelerometer && mDockMode == Intent.EXTRA_DOCK_STATE_CAR) || 369b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn (mDeskDockEnablesAccelerometer && mDockMode == Intent.EXTRA_DOCK_STATE_DESK)) { 370ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood // enable accelerometer if we are docked in a dock that enables accelerometer 371ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood // orientation management, 372ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood return true; 373ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood } 37485ab37471ebb51fe3d358ccaa6e44c83459b7471Suchi Amalapurapu if (mAccelerometerDefault == 0) { 375c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If the setting for using the sensor by default is enabled, then 376c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // we will always leave it on. Note that the user could go to 377c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // a window that forces an orientation that does not use the 378c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // sensor and in theory we could turn it off... however, when next 379c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // turning it on we won't have a good value for the current 380c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // orientation for a little bit, which can cause orientation 381c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // changes to lag, so we'd like to keep it always on. (It will 382c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // still be turned off when the screen is off.) 38385ab37471ebb51fe3d358ccaa6e44c83459b7471Suchi Amalapurapu return false; 384c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 38585ab37471ebb51fe3d358ccaa6e44c83459b7471Suchi Amalapurapu return true; 386c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 387c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 388c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /* 389c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Various use cases for invoking this function 390c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * screen turning off, should always disable listeners if already enabled 391c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * screen turned on and current app has sensor based orientation, enable listeners 392c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * if not already enabled 393c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * screen turned on and current app does not have sensor orientation, disable listeners if 394c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * already enabled 395c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * screen turning on and current app has sensor based orientation, enable listeners if needed 396c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * screen turning on and current app has nosensor based orientation, do nothing 397c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 398d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project void updateOrientationListenerLp() { 399c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (!mOrientationListener.canDetectOrientation()) { 400c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If sensor is turned off or nonexistent for some reason 401c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return; 402c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 403c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project //Could have been invoked due to screen turning on or off or 404c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project //change of the currently visible window's orientation 405adda0c0fb04a828a71aba1bffa20689427b972bdDianne Hackborn if (localLOGV) Log.v(TAG, "Screen status="+mScreenOn+ 406c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project ", current orientation="+mCurrentAppOrientation+ 407c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project ", SensorEnabled="+mOrientationSensorEnabled); 408c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean disable = true; 409d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project if (mScreenOn) { 410d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project if (needSensorRunningLp()) { 411c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project disable = false; 412c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project //enable listener if not already enabled 413d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project if (!mOrientationSensorEnabled) { 414c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mOrientationListener.enable(); 415adda0c0fb04a828a71aba1bffa20689427b972bdDianne Hackborn if(localLOGV) Log.v(TAG, "Enabling listeners"); 416c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mOrientationSensorEnabled = true; 417c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 418c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 419c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 420c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project //check if sensors need to be disabled 421d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project if (disable && mOrientationSensorEnabled) { 422c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mOrientationListener.disable(); 423adda0c0fb04a828a71aba1bffa20689427b972bdDianne Hackborn if(localLOGV) Log.v(TAG, "Disabling listeners"); 424c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mOrientationSensorEnabled = false; 425c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 426c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 427c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 428a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn Runnable mPowerLongPress = new Runnable() { 429c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void run() { 430c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mShouldTurnOffOnKeyUp = false; 431d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false); 432c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); 433c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project showGlobalActionsDialog(); 434c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 435c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project }; 436c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 437c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project void showGlobalActionsDialog() { 438c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mGlobalActions == null) { 439c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mGlobalActions = new GlobalActions(mContext); 440c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 441eb8e950ea446ce6a1b83c565718217d944dd3557Dianne Hackborn final boolean keyguardShowing = mKeyguardMediator.isShowingAndNotHidden(); 442c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned()); 443c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (keyguardShowing) { 444c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // since it took two seconds of long press to bring this up, 445c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // poke the wake lock so they have some time to see the dialog. 446c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mKeyguardMediator.pokeWakelock(); 447c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 448c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 449c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 450c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean isDeviceProvisioned() { 451c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return Settings.Secure.getInt( 452c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mContext.getContentResolver(), Settings.Secure.DEVICE_PROVISIONED, 0) != 0; 453c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 454c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 455c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** 456c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * When a home-key longpress expires, close other system windows and launch the recent apps 457c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 458c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Runnable mHomeLongPress = new Runnable() { 459c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void run() { 460c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /* 461c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Eat the longpress so it won't dismiss the recent apps dialog when 462c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * the user lets go of the home key 463c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 464c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHomePressed = false; 465d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false); 466c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project sendCloseSystemWindows(SYSTEM_DIALOG_REASON_RECENT_APPS); 467c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project showRecentAppsDialog(); 468c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 469c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project }; 470c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 471c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** 472c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Create (if necessary) and launch the recent apps dialog 473c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 474c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project void showRecentAppsDialog() { 475c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mRecentAppsDialog == null) { 476c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mRecentAppsDialog = new RecentApplicationsDialog(mContext); 477c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 478c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mRecentAppsDialog.show(); 479c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 480c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 481c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 482c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void init(Context context, IWindowManager windowManager, 483c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project LocalPowerManager powerManager) { 484c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mContext = context; 485c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mWindowManager = windowManager; 486c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mPowerManager = powerManager; 487c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mKeyguardMediator = new KeyguardViewMediator(context, this, powerManager); 488c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHandler = new Handler(); 489c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mOrientationListener = new MyOrientationListener(mContext); 490c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project SettingsObserver settingsObserver = new SettingsObserver(mHandler); 491c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project settingsObserver.observe(); 492c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mShortcutManager = new ShortcutManager(context, mHandler); 493c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mShortcutManager.observe(); 494c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHomeIntent = new Intent(Intent.ACTION_MAIN, null); 495c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHomeIntent.addCategory(Intent.CATEGORY_HOME); 496c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK 497c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 4986b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn mCarDockIntent = new Intent(Intent.ACTION_MAIN, null); 4996b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn mCarDockIntent.addCategory(Intent.CATEGORY_CAR_DOCK); 5006b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn mCarDockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK 5016b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 5026b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn mDeskDockIntent = new Intent(Intent.ACTION_MAIN, null); 5036b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn mDeskDockIntent.addCategory(Intent.CATEGORY_DESK_DOCK); 5046b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn mDeskDockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK 5056b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 506c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 507c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mBroadcastWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 508c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project "PhoneWindowManager.mBroadcastWakeLock"); 509c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mEnableShiftMenuBugReports = "1".equals(SystemProperties.get("ro.debuggable")); 5108994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn mLidOpenRotation = readRotation( 511e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood com.android.internal.R.integer.config_lidOpenRotation); 512e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood mCarDockRotation = readRotation( 513e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood com.android.internal.R.integer.config_carDockRotation); 514e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood mDeskDockRotation = readRotation( 515e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood com.android.internal.R.integer.config_deskDockRotation); 516ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood mCarDockEnablesAccelerometer = mContext.getResources().getBoolean( 517ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood com.android.internal.R.bool.config_carDockEnablesAccelerometer); 518ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood mDeskDockEnablesAccelerometer = mContext.getResources().getBoolean( 519ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood com.android.internal.R.bool.config_deskDockEnablesAccelerometer); 5208994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn mLidKeyboardAccessibility = mContext.getResources().getInteger( 5218994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn com.android.internal.R.integer.config_lidKeyboardAccessibility); 5228994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn mLidNavigationAccessibility = mContext.getResources().getInteger( 5238994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn com.android.internal.R.integer.config_lidNavigationAccessibility); 524e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood // register for dock events 5257771ef05bca4482bd428028278e0f153dcd5fd43Dianne Hackborn IntentFilter filter = new IntentFilter(); 5267771ef05bca4482bd428028278e0f153dcd5fd43Dianne Hackborn filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE); 5277771ef05bca4482bd428028278e0f153dcd5fd43Dianne Hackborn filter.addAction(UiModeManager.ACTION_EXIT_CAR_MODE); 5287771ef05bca4482bd428028278e0f153dcd5fd43Dianne Hackborn filter.addAction(UiModeManager.ACTION_ENTER_DESK_MODE); 5297771ef05bca4482bd428028278e0f153dcd5fd43Dianne Hackborn filter.addAction(UiModeManager.ACTION_EXIT_DESK_MODE); 530b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn filter.addAction(Intent.ACTION_DOCK_EVENT); 531b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn Intent intent = context.registerReceiver(mDockReceiver, filter); 532b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn if (intent != null) { 533b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn // Retrieve current sticky dock event broadcast. 534b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn mDockMode = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, 535b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn Intent.EXTRA_DOCK_STATE_UNDOCKED); 536b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn } 537086d88503e589f14560209000724fe5215a10937Dianne Hackborn mVibrator = new Vibrator(); 538086d88503e589f14560209000724fe5215a10937Dianne Hackborn mLongPressVibePattern = getLongIntArray(mContext.getResources(), 539086d88503e589f14560209000724fe5215a10937Dianne Hackborn com.android.internal.R.array.config_longPressVibePattern); 540086d88503e589f14560209000724fe5215a10937Dianne Hackborn mVirtualKeyVibePattern = getLongIntArray(mContext.getResources(), 541086d88503e589f14560209000724fe5215a10937Dianne Hackborn com.android.internal.R.array.config_virtualKeyVibePattern); 54291971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani mKeyboardTapVibePattern = getLongIntArray(mContext.getResources(), 54391971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani com.android.internal.R.array.config_keyboardTapVibePattern); 544086d88503e589f14560209000724fe5215a10937Dianne Hackborn mSafeModeDisabledVibePattern = getLongIntArray(mContext.getResources(), 545086d88503e589f14560209000724fe5215a10937Dianne Hackborn com.android.internal.R.array.config_safeModeDisabledVibePattern); 546086d88503e589f14560209000724fe5215a10937Dianne Hackborn mSafeModeEnabledVibePattern = getLongIntArray(mContext.getResources(), 547086d88503e589f14560209000724fe5215a10937Dianne Hackborn com.android.internal.R.array.config_safeModeEnabledVibePattern); 548e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood } 549e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood 550a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn public void updateSettings() { 551a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn ContentResolver resolver = mContext.getContentResolver(); 552a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn boolean updateRotation = false; 553a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn View addView = null; 554a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn View removeView = null; 555a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn synchronized (mLock) { 556a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mEndcallBehavior = Settings.System.getInt(resolver, 5574c938f402663bcdbadc08af91afdd9e96eac7e42David Brown Settings.System.END_BUTTON_BEHAVIOR, 5584c938f402663bcdbadc08af91afdd9e96eac7e42David Brown Settings.System.END_BUTTON_BEHAVIOR_DEFAULT); 5594c938f402663bcdbadc08af91afdd9e96eac7e42David Brown mIncallPowerBehavior = Settings.Secure.getInt(resolver, 5604c938f402663bcdbadc08af91afdd9e96eac7e42David Brown Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR, 5614c938f402663bcdbadc08af91afdd9e96eac7e42David Brown Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_DEFAULT); 562a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mFancyRotationAnimation = Settings.System.getInt(resolver, 563a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn "fancy_rotation_anim", 0) != 0 ? 0x80 : 0; 564a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn int accelerometerDefault = Settings.System.getInt(resolver, 565a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn Settings.System.ACCELEROMETER_ROTATION, DEFAULT_ACCELEROMETER_ROTATION); 566a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (mAccelerometerDefault != accelerometerDefault) { 567a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mAccelerometerDefault = accelerometerDefault; 568a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn updateOrientationListenerLp(); 569a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 570a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (mSystemReady) { 571a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn int pointerLocation = Settings.System.getInt(resolver, 572a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn Settings.System.POINTER_LOCATION, 0); 573a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (mPointerLocationMode != pointerLocation) { 574a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mPointerLocationMode = pointerLocation; 575a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (pointerLocation != 0) { 576a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (mPointerLocationView == null) { 577a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mPointerLocationView = new PointerLocationView(mContext); 578a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mPointerLocationView.setPrintCoords(false); 579a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn addView = mPointerLocationView; 580a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 581a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } else { 582a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn removeView = mPointerLocationView; 583a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mPointerLocationView = null; 584a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 585a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 586a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 587a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn // use screen off timeout setting as the timeout for the lockscreen 588a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mLockScreenTimeout = Settings.System.getInt(resolver, 589a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn Settings.System.SCREEN_OFF_TIMEOUT, 0); 590a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn String imId = Settings.Secure.getString(resolver, 591a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn Settings.Secure.DEFAULT_INPUT_METHOD); 592a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn boolean hasSoftInput = imId != null && imId.length() > 0; 593a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (mHasSoftInput != hasSoftInput) { 594a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mHasSoftInput = hasSoftInput; 595a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn updateRotation = true; 596a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 597a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 598a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (updateRotation) { 599a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn updateRotation(0); 600a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 601a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (addView != null) { 602a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn WindowManager.LayoutParams lp = new WindowManager.LayoutParams( 603a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn WindowManager.LayoutParams.MATCH_PARENT, 604a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn WindowManager.LayoutParams.MATCH_PARENT); 605a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; 606a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn lp.flags = 607a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE| 608a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| 609a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 610a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn lp.format = PixelFormat.TRANSLUCENT; 611a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn lp.setTitle("PointerLocation"); 612a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn WindowManagerImpl wm = (WindowManagerImpl) 613a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mContext.getSystemService(Context.WINDOW_SERVICE); 614a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn wm.addView(addView, lp); 615a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 616a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (removeView != null) { 617a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn WindowManagerImpl wm = (WindowManagerImpl) 618a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mContext.getSystemService(Context.WINDOW_SERVICE); 619a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn wm.removeView(removeView); 620a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 621a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 622a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn 623e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood private int readRotation(int resID) { 624e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood try { 625e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood int rotation = mContext.getResources().getInteger(resID); 626e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood switch (rotation) { 627e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood case 0: 628e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood return Surface.ROTATION_0; 629e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood case 90: 630e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood return Surface.ROTATION_90; 631e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood case 180: 632e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood return Surface.ROTATION_180; 633e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood case 270: 634e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood return Surface.ROTATION_270; 635e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood } 636e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood } catch (Resources.NotFoundException e) { 637e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood // fall through 638e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood } 639e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood return -1; 640c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 641c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 642c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 643c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public int checkAddPermission(WindowManager.LayoutParams attrs) { 644c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int type = attrs.type; 645525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima 646c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW 647c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project || type > WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) { 648c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return WindowManagerImpl.ADD_OKAY; 649c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 650c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project String permission = null; 651c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project switch (type) { 652c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_TOAST: 653c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // XXX right now the app process has complete control over 654c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // this... should introduce a token to let the system 655c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // monitor/control what they are doing. 656c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project break; 657c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_INPUT_METHOD: 65822aff40df0f226280c8ea648d17c5aa56e30cc0dDianne Hackborn case TYPE_WALLPAPER: 65922aff40df0f226280c8ea648d17c5aa56e30cc0dDianne Hackborn // The window manager will check these. 660c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project break; 661c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_PHONE: 662c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_PRIORITY_PHONE: 663c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_SYSTEM_ALERT: 664c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_SYSTEM_ERROR: 665c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_SYSTEM_OVERLAY: 666c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project permission = android.Manifest.permission.SYSTEM_ALERT_WINDOW; 667c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project break; 668c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project default: 669c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; 670c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 671c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (permission != null) { 672c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mContext.checkCallingOrSelfPermission(permission) 673c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 674c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return WindowManagerImpl.ADD_PERMISSION_DENIED; 675c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 676c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 677c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return WindowManagerImpl.ADD_OKAY; 678c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 679c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 680c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void adjustWindowParamsLw(WindowManager.LayoutParams attrs) { 681c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project switch (attrs.type) { 682c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_SYSTEM_OVERLAY: 683c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_TOAST: 684c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // These types of windows can't receive input events. 685c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project attrs.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 686c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; 687c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project break; 688c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 689c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 690c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 691c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project void readLidState() { 692c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project try { 693e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood int sw = mWindowManager.getSwitchState(RawInputEvent.SW_LID); 694c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (sw >= 0) { 695c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mLidOpen = sw == 0; 696c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 697c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (RemoteException e) { 698c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Ignore 699c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 700c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 701c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 7028994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn private int determineHiddenState(boolean lidOpen, 7038994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn int mode, int hiddenValue, int visibleValue) { 7048994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn switch (mode) { 7058994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn case 1: 7068994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn return lidOpen ? visibleValue : hiddenValue; 7078994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn case 2: 7088994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn return lidOpen ? hiddenValue : visibleValue; 7098994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn } 7108994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn return visibleValue; 7118994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn } 7128994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn 713c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 714c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void adjustConfigurationLw(Configuration config) { 715c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project readLidState(); 716c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final boolean lidOpen = !KEYBOARD_ALWAYS_HIDDEN && mLidOpen; 717c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mPowerManager.setKeyboardVisibility(lidOpen); 7188994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn config.hardKeyboardHidden = determineHiddenState(lidOpen, 7198994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn mLidKeyboardAccessibility, Configuration.HARDKEYBOARDHIDDEN_YES, 7208994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn Configuration.HARDKEYBOARDHIDDEN_NO); 7218994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn config.navigationHidden = determineHiddenState(lidOpen, 7228994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn mLidNavigationAccessibility, Configuration.NAVIGATIONHIDDEN_YES, 7238994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn Configuration.NAVIGATIONHIDDEN_NO); 7248994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn config.keyboardHidden = (config.hardKeyboardHidden 7258994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn == Configuration.HARDKEYBOARDHIDDEN_NO || mHasSoftInput) 7268994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn ? Configuration.KEYBOARDHIDDEN_NO 7278994287b5d1220d4558838c207495aa0ee01bcc1Dianne Hackborn : Configuration.KEYBOARDHIDDEN_YES; 728c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 729c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 730c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public boolean isCheekPressedAgainstScreen(MotionEvent ev) { 731c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if(ev.getSize() > SLIDE_TOUCH_EVENT_SIZE_LIMIT) { 732c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 733c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 734c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int size = ev.getHistorySize(); 735c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project for(int i = 0; i < size; i++) { 736c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if(ev.getHistoricalSize(i) > SLIDE_TOUCH_EVENT_SIZE_LIMIT) { 737c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 738c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 739c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 740c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 741c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 742c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 743a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn public void dispatchedPointerEventLw(MotionEvent ev, int targetX, int targetY) { 744a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (mPointerLocationView == null) { 745a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn return; 746a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 747a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn synchronized (mLock) { 748a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn if (mPointerLocationView == null) { 749a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn return; 750a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 751a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn ev.offsetLocation(targetX, targetY); 752a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mPointerLocationView.addTouchEvent(ev); 753a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn ev.offsetLocation(-targetX, -targetY); 754a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 755a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 756a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn 757c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 758c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public int windowTypeToLayerLw(int type) { 759c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) { 760c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return APPLICATION_LAYER; 761c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 762c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project switch (type) { 763c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_STATUS_BAR: 764c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return STATUS_BAR_LAYER; 765c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_STATUS_BAR_PANEL: 766c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return STATUS_BAR_PANEL_LAYER; 7674dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn case TYPE_SYSTEM_DIALOG: 7684dbf514c6c73832630e4c9bb068cf950ff044a34Dianne Hackborn return SYSTEM_DIALOG_LAYER; 769c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_SEARCH_BAR: 770c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return SEARCH_BAR_LAYER; 771c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_PHONE: 772c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return PHONE_LAYER; 773c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_KEYGUARD: 774c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return KEYGUARD_LAYER; 775c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_KEYGUARD_DIALOG: 776c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return KEYGUARD_DIALOG_LAYER; 777c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_SYSTEM_ALERT: 778c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return SYSTEM_ALERT_LAYER; 779c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_SYSTEM_ERROR: 780c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return SYSTEM_ERROR_LAYER; 781c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_INPUT_METHOD: 782c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return INPUT_METHOD_LAYER; 783c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_INPUT_METHOD_DIALOG: 784c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return INPUT_METHOD_DIALOG_LAYER; 785c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_SYSTEM_OVERLAY: 786c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return SYSTEM_OVERLAY_LAYER; 787c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_PRIORITY_PHONE: 788c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return PRIORITY_PHONE_LAYER; 789c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_TOAST: 790c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return TOAST_LAYER; 79122aff40df0f226280c8ea648d17c5aa56e30cc0dDianne Hackborn case TYPE_WALLPAPER: 79222aff40df0f226280c8ea648d17c5aa56e30cc0dDianne Hackborn return WALLPAPER_LAYER; 793c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 794c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.e(TAG, "Unknown window type: " + type); 795c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return APPLICATION_LAYER; 796c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 797c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 798c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 799c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public int subWindowTypeToLayerLw(int type) { 800c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project switch (type) { 801c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_APPLICATION_PANEL: 802c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_APPLICATION_ATTACHED_DIALOG: 803c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return APPLICATION_PANEL_SUBLAYER; 804c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_APPLICATION_MEDIA: 805c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return APPLICATION_MEDIA_SUBLAYER; 806540d7de241b39b28480bf4b1bf6870307935fd8bDianne Hackborn case TYPE_APPLICATION_MEDIA_OVERLAY: 807540d7de241b39b28480bf4b1bf6870307935fd8bDianne Hackborn return APPLICATION_MEDIA_OVERLAY_SUBLAYER; 808c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_APPLICATION_SUB_PANEL: 809c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return APPLICATION_SUB_PANEL_SUBLAYER; 810c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 811c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.e(TAG, "Unknown sub-window type: " + type); 812c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return 0; 813c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 814c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 815bdefdbe2890627130463c08d2c7838463729c59bDianne Hackborn public int getMaxWallpaperLayer() { 816bdefdbe2890627130463c08d2c7838463729c59bDianne Hackborn return STATUS_BAR_LAYER; 817bdefdbe2890627130463c08d2c7838463729c59bDianne Hackborn } 818bdefdbe2890627130463c08d2c7838463729c59bDianne Hackborn 81901f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn public boolean doesForceHide(WindowState win, WindowManager.LayoutParams attrs) { 82001f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn return attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD; 82101f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn } 82201f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn 82301f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn public boolean canBeForceHidden(WindowState win, WindowManager.LayoutParams attrs) { 82401f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn return attrs.type != WindowManager.LayoutParams.TYPE_STATUS_BAR 82501f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn && attrs.type != WindowManager.LayoutParams.TYPE_WALLPAPER; 82601f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn } 82701f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn 828c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 829c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public View addStartingWindow(IBinder appToken, String packageName, 830c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int theme, CharSequence nonLocalizedLabel, 831c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int labelRes, int icon) { 832c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (!SHOW_STARTING_ANIMATIONS) { 833c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return null; 834c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 835c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (packageName == null) { 836c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return null; 837c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 838c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 83931abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn try { 84031abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn Context context = mContext; 84131abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn boolean setTheme = false; 84231abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn //Log.i(TAG, "addStartingWindow " + packageName + ": nonLocalizedLabel=" 84331abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn // + nonLocalizedLabel + " theme=" + Integer.toHexString(theme)); 84431abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn if (theme != 0 || labelRes != 0) { 84531abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn try { 84631abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn context = context.createPackageContext(packageName, 0); 84731abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn if (theme != 0) { 84831abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn context.setTheme(theme); 84931abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn setTheme = true; 85031abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn } 85131abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 85231abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn // Ignore 85331abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn } 85431abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn } 85531abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn if (!setTheme) { 85631abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn context.setTheme(com.android.internal.R.style.Theme); 85731abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn } 85831abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn 85931abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn Window win = PolicyManager.makeNewWindow(context); 86031abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn if (win.getWindowStyle().getBoolean( 86131abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn com.android.internal.R.styleable.Window_windowDisablePreview, false)) { 86231abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn return null; 863c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 86431abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn 86531abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn Resources r = context.getResources(); 86631abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn win.setTitle(r.getText(labelRes, nonLocalizedLabel)); 86731abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn 86831abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn win.setType( 86931abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn WindowManager.LayoutParams.TYPE_APPLICATION_STARTING); 87031abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn // Force the window flags: this is a fake window, so it is not really 87131abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn // touchable or focusable by the user. We also add in the ALT_FOCUSABLE_IM 87231abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn // flag because we do know that the next window will take input 87331abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn // focus, so we want to get the IME window up on top of us right away. 87431abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn win.setFlags( 87531abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE| 87631abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| 87731abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, 87831abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE| 87931abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| 88031abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 88131abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn 88231abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn win.setLayout(WindowManager.LayoutParams.MATCH_PARENT, 88331abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn WindowManager.LayoutParams.MATCH_PARENT); 88431abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn 88531abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn final WindowManager.LayoutParams params = win.getAttributes(); 88631abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn params.token = appToken; 88731abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn params.packageName = packageName; 88831abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn params.windowAnimations = win.getWindowStyle().getResourceId( 88931abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn com.android.internal.R.styleable.Window_windowAnimationStyle, 0); 89031abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn params.setTitle("Starting " + packageName); 891c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 892c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project WindowManagerImpl wm = (WindowManagerImpl) 893c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project context.getSystemService(Context.WINDOW_SERVICE); 894c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project View view = win.getDecorView(); 895c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 896c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (win.isFloating()) { 897c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Whoops, there is no way to display an animation/preview 898c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // of such a thing! After all that work... let's skip it. 899c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // (Note that we must do this here because it is in 900c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // getDecorView() where the theme is evaluated... maybe 901c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // we should peek the floating attribute from the theme 902c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // earlier.) 903c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return null; 904c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 905c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 906c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (localLOGV) Log.v( 907c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project TAG, "Adding starting window for " + packageName 908c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project + " / " + appToken + ": " 909c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project + (view.getParent() != null ? view : null)); 910c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 911c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project wm.addView(view, params); 912c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 913c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Only return the view if it was successfully added to the 914c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // window manager... which we can tell by it having a parent. 915c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return view.getParent() != null ? view : null; 916c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (WindowManagerImpl.BadTokenException e) { 917c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // ignore 918c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.w(TAG, appToken + " already running, starting window not displayed"); 91931abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn } catch (RuntimeException e) { 92031abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn // don't crash if something else bad happens, for example a 92131abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn // failure loading resources because we are loading from an app 92231abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn // on external storage that has been unmounted. 92331abd7f677190edfa67cb96fb4ddb166e974cb3eDianne Hackborn Log.w(TAG, appToken + " failed creating starting window", e); 924c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 925c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 926c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return null; 927c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 928c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 929c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 930c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void removeStartingWindow(IBinder appToken, View window) { 931c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // RuntimeException e = new RuntimeException(); 932c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Log.i(TAG, "remove " + appToken + " " + window, e); 933c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 934c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (localLOGV) Log.v( 935c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project TAG, "Removing starting window for " + appToken + ": " + window); 936c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 937c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (window != null) { 938c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project WindowManagerImpl wm = (WindowManagerImpl) mContext.getSystemService(Context.WINDOW_SERVICE); 939c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project wm.removeView(window); 940c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 941c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 942c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 943c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** 944c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Preflight adding a window to the system. 945c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * 946c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Currently enforces that three window types are singletons: 947c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * <ul> 948c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * <li>STATUS_BAR_TYPE</li> 949c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * <li>KEYGUARD_TYPE</li> 950c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * </ul> 951c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * 952c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * @param win The window to be added 953c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * @param attrs Information about the window to be added 954c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * 955c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * @return If ok, WindowManagerImpl.ADD_OKAY. If too many singletons, WindowManagerImpl.ADD_MULTIPLE_SINGLETON 956c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 957c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public int prepareAddWindowLw(WindowState win, WindowManager.LayoutParams attrs) { 958c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project switch (attrs.type) { 959c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_STATUS_BAR: 960c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mStatusBar != null) { 961c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return WindowManagerImpl.ADD_MULTIPLE_SINGLETON; 962c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 963c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mStatusBar = win; 964c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project break; 965f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn case TYPE_STATUS_BAR_PANEL: 966f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn mStatusBarPanels.add(win); 967f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn break; 968c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case TYPE_KEYGUARD: 969c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mKeyguard != null) { 970c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return WindowManagerImpl.ADD_MULTIPLE_SINGLETON; 971c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 972c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mKeyguard = win; 973c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project break; 974c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 975c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return WindowManagerImpl.ADD_OKAY; 976c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 977c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 978c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 979c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void removeWindowLw(WindowState win) { 980c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mStatusBar == win) { 981c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mStatusBar = null; 982c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 983c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project else if (mKeyguard == win) { 984c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mKeyguard = null; 985f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn } else { 986f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn mStatusBarPanels.remove(win); 987c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 988c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 989c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 990c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static final boolean PRINT_ANIM = false; 991c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 992c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 993c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public int selectAnimationLw(WindowState win, int transit) { 994c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (PRINT_ANIM) Log.i(TAG, "selectAnimation in " + win 995c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project + ": transit=" + transit); 996c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (transit == TRANSIT_PREVIEW_DONE) { 997c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (win.hasAppShownWindows()) { 998c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (PRINT_ANIM) Log.i(TAG, "**** STARTING EXIT"); 999c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return com.android.internal.R.anim.app_starting_exit; 1000c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1001c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1002c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1003c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return 0; 1004c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1005c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 100601f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn public Animation createForceHideEnterAnimation() { 100701f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn return AnimationUtils.loadAnimation(mContext, 100801f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn com.android.internal.R.anim.lock_screen_behind_enter); 100901f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn } 101001f08aa7f5f24beb2432bb104a981567f925b40cDianne Hackborn 1011c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static ITelephony getPhoneInterface() { 1012c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return ITelephony.Stub.asInterface(ServiceManager.checkService(Context.TELEPHONY_SERVICE)); 1013c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1014c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1015c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static IAudioService getAudioInterface() { 1016c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return IAudioService.Stub.asInterface(ServiceManager.checkService(Context.AUDIO_SERVICE)); 1017c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1018c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1019c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean keyguardOn() { 1020c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return keyguardIsShowingTq() || inKeyguardRestrictedKeyInputMode(); 1021c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1022c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1023c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project private static final int[] WINDOW_TYPES_WHERE_HOME_DOESNT_WORK = { 1024c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 1025c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, 1026c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project }; 1027c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1028c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 1029c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public boolean interceptKeyTi(WindowState win, int code, int metaKeys, boolean down, 1030a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn int repeatCount, int flags) { 1031c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean keyguardOn = keyguardOn(); 1032c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1033c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (false) { 1034c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.d(TAG, "interceptKeyTi code=" + code + " down=" + down + " repeatCount=" 1035c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project + repeatCount + " keyguardOn=" + keyguardOn + " mHomePressed=" + mHomePressed); 1036c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1037c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1038c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Clear a pending HOME longpress if the user releases Home 1039c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // TODO: This could probably be inside the next bit of logic, but that code 1040c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // turned out to be a bit fragile so I'm doing it here explicitly, for now. 1041c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if ((code == KeyEvent.KEYCODE_HOME) && !down) { 1042c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHandler.removeCallbacks(mHomeLongPress); 1043c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1044c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1045c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If the HOME button is currently being held, then we do special 1046c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // chording with it. 1047c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mHomePressed) { 1048c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1049c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If we have released the home key, and didn't do anything else 1050c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // while it was pressed, then it is time to go home! 1051c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (code == KeyEvent.KEYCODE_HOME) { 1052c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (!down) { 1053c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHomePressed = false; 1054c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1055a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn if ((flags&KeyEvent.FLAG_CANCELED) == 0) { 1056a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn // If an incoming call is ringing, HOME is totally disabled. 1057a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn // (The user is already on the InCallScreen at this point, 1058a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn // and his ONLY options are to answer or reject the call.) 1059a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn boolean incomingRinging = false; 1060a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn try { 1061a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn ITelephony phoneServ = getPhoneInterface(); 1062a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn if (phoneServ != null) { 1063a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn incomingRinging = phoneServ.isRinging(); 1064a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn } else { 1065a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn Log.w(TAG, "Unable to find ITelephony interface"); 1066a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn } 1067a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn } catch (RemoteException ex) { 1068a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn Log.w(TAG, "RemoteException from getPhoneInterface()", ex); 1069a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn } 1070a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn 1071a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn if (incomingRinging) { 1072a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn Log.i(TAG, "Ignoring HOME; there's a ringing incoming call."); 1073c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1074a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn launchHomeFromHotKey(); 1075c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1076c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1077a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn Log.i(TAG, "Ignoring HOME; event canceled."); 1078c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1079c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1080c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1081c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1082c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 1083c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1084a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn 1085c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // First we always handle the home key here, so applications 1086c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // can never break it, although if keyguard is on, we do let 1087c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // it handle it, because that gives us the correct 5 second 1088c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // timeout. 1089c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (code == KeyEvent.KEYCODE_HOME) { 1090c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1091c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If a system window has focus, then it doesn't make sense 1092c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // right now to interact with applications. 1093c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null; 1094c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (attrs != null) { 1095c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final int type = attrs.type; 1096c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (type == WindowManager.LayoutParams.TYPE_KEYGUARD 1097c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project || type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) { 1098c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // the "app" is keyguard, so give it the key 1099c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 1100c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1101c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length; 1102c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project for (int i=0; i<typeCount; i++) { 1103c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) { 1104c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // don't do anything, but also don't pass it to the app 1105c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 1106c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1107c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1108c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1109c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1110c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (down && repeatCount == 0) { 1111c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (!keyguardOn) { 1112c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHandler.postDelayed(mHomeLongPress, ViewConfiguration.getGlobalActionKeyTimeout()); 1113c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1114c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHomePressed = true; 1115c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1116c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 1117c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if (code == KeyEvent.KEYCODE_MENU) { 1118c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Hijack modified menu keys for debugging features 1119c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final int chordBug = KeyEvent.META_SHIFT_ON; 1120c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1121c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (down && repeatCount == 0) { 1122c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mEnableShiftMenuBugReports && (metaKeys & chordBug) == chordBug) { 1123c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Intent intent = new Intent(Intent.ACTION_BUG_REPORT); 1124c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mContext.sendOrderedBroadcast(intent, null); 1125c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 1126c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if (SHOW_PROCESSES_ON_ALT_MENU && 1127c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project (metaKeys & KeyEvent.META_ALT_ON) == KeyEvent.META_ALT_ON) { 1128c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Intent service = new Intent(); 1129c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project service.setClassName(mContext, "com.android.server.LoadAverageService"); 1130c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project ContentResolver res = mContext.getContentResolver(); 1131c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean shown = Settings.System.getInt( 1132c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project res, Settings.System.SHOW_PROCESSES, 0) != 0; 1133c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (!shown) { 1134c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mContext.startService(service); 1135c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1136c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mContext.stopService(service); 1137c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1138c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Settings.System.putInt( 1139c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project res, Settings.System.SHOW_PROCESSES, shown ? 0 : 1); 1140c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 1141c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1142c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1143c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if (code == KeyEvent.KEYCODE_NOTIFICATION) { 1144c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (down) { 1145c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // this key doesn't exist on current hardware, but if a device 1146c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // didn't have a touchscreen, it would want one of these to open 1147c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // the status bar. 1148c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project IStatusBar sbs = IStatusBar.Stub.asInterface(ServiceManager.getService("statusbar")); 1149c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (sbs != null) { 1150c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project try { 1151c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project sbs.toggle(); 1152c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (RemoteException e) { 1153c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // we're screwed anyway, since it's in this process 1154c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project throw new RuntimeException(e); 1155c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1156c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1157c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1158c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 1159c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if (code == KeyEvent.KEYCODE_SEARCH) { 1160c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (down) { 1161c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (repeatCount == 0) { 1162c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mSearchKeyPressed = true; 1163c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1164c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1165c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mSearchKeyPressed = false; 1166c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1167c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mConsumeSearchKeyUp) { 1168c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Consume the up-event 1169c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mConsumeSearchKeyUp = false; 1170c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 1171c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1172c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1173c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1174c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1175c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Shortcuts are invoked through Search+key, so intercept those here 1176c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mSearchKeyPressed) { 1177c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (down && repeatCount == 0 && !keyguardOn) { 1178c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Intent shortcutIntent = mShortcutManager.getIntent(code, metaKeys); 1179c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (shortcutIntent != null) { 1180c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1181c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mContext.startActivity(shortcutIntent); 1182c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1183c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /* 1184c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * We launched an app, so the up-event of the search key 1185c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * should be consumed 1186c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 1187c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mConsumeSearchKeyUp = true; 1188c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 1189c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1190c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1191c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1192c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1193c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 1194c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1195c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1196c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** 1197c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * A home key -> launch home action was detected. Take the appropriate action 1198c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * given the situation with the keyguard. 1199c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 1200c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project void launchHomeFromHotKey() { 1201eb8e950ea446ce6a1b83c565718217d944dd3557Dianne Hackborn if (mKeyguardMediator.isShowingAndNotHidden()) { 1202c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // don't launch home if keyguard showing 12036b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } else if (!mHideLockScreen && mKeyguardMediator.isInputRestricted()) { 1204c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // when in keyguard restricted mode, must first verify unlock 1205c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // before launching home 1206c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mKeyguardMediator.verifyUnlock(new OnKeyguardExitResult() { 1207c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void onKeyguardExitResult(boolean success) { 1208c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (success) { 1209a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn try { 1210a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn ActivityManagerNative.getDefault().stopAppSwitches(); 1211a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn } catch (RemoteException e) { 1212a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn } 12135da799e012cc4427a4f656e2416bcd73c22acd83Joe Onorato sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY); 12146b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn startDockOrHome(); 1215c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1216c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1217c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project }); 1218c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1219c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // no keyguard stuff to worry about, just launch home! 1220a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn try { 1221a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn ActivityManagerNative.getDefault().stopAppSwitches(); 1222a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn } catch (RemoteException e) { 1223a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn } 12245da799e012cc4427a4f656e2416bcd73c22acd83Joe Onorato sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY); 12256b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn startDockOrHome(); 1226c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1227c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1228c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1229c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void getContentInsetHintLw(WindowManager.LayoutParams attrs, Rect contentInset) { 1230c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final int fl = attrs.flags; 1231c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1232c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if ((fl & 1233c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR)) 1234c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project == (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) { 1235c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project contentInset.set(mCurLeft, mCurTop, mW - mCurRight, mH - mCurBottom); 1236c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1237c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project contentInset.setEmpty(); 1238c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1239c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1240c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1241c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 1242c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void beginLayoutLw(int displayWidth, int displayHeight) { 1243c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mW = displayWidth; 1244c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mH = displayHeight; 1245c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mDockLeft = mContentLeft = mCurLeft = 0; 1246c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mDockTop = mContentTop = mCurTop = 0; 1247c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mDockRight = mContentRight = mCurRight = displayWidth; 1248c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mDockBottom = mContentBottom = mCurBottom = displayHeight; 1249c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mDockLayer = 0x10000000; 1250c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1251c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // decide where the status bar goes ahead of time 1252c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mStatusBar != null) { 1253c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final Rect pf = mTmpParentFrame; 1254c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final Rect df = mTmpDisplayFrame; 1255c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final Rect vf = mTmpVisibleFrame; 1256c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.left = df.left = vf.left = 0; 1257c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.top = df.top = vf.top = 0; 1258c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.right = df.right = vf.right = displayWidth; 1259c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.bottom = df.bottom = vf.bottom = displayHeight; 1260c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1261c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mStatusBar.computeFrameLw(pf, df, vf, vf); 1262c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mStatusBar.isVisibleLw()) { 1263c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If the status bar is hidden, we don't want to cause 1264c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // windows behind it to scroll. 1265c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mDockTop = mContentTop = mCurTop = mStatusBar.getFrameLw().bottom; 12664eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project if (DEBUG_LAYOUT) Log.v(TAG, "Status bar: mDockBottom=" 12674eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project + mDockBottom + " mContentBottom=" 12684eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project + mContentBottom + " mCurBottom=" + mCurBottom); 1269c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1270c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1271c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1272c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1273c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project void setAttachedWindowFrames(WindowState win, int fl, int sim, 1274c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project WindowState attached, boolean insetDecors, Rect pf, Rect df, Rect cf, Rect vf) { 1275c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (win.getSurfaceLayer() > mDockLayer && attached.getSurfaceLayer() < mDockLayer) { 1276c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Here's a special case: if this attached window is a panel that is 1277c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // above the dock window, and the window it is attached to is below 1278c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // the dock window, then the frames we computed for the window it is 1279c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // attached to can not be used because the dock is effectively part 1280c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // of the underlying window and the attached window is floating on top 1281c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // of the whole thing. So, we ignore the attached window and explicitly 1282c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // compute the frames that would be appropriate without the dock. 1283c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.left = cf.left = vf.left = mDockLeft; 1284c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.top = cf.top = vf.top = mDockTop; 1285c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.right = cf.right = vf.right = mDockRight; 1286c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.bottom = cf.bottom = vf.bottom = mDockBottom; 1287c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1288c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // The effective display frame of the attached window depends on 1289c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // whether it is taking care of insetting its content. If not, 1290c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // we need to use the parent's content frame so that the entire 1291c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // window is positioned within that content. Otherwise we can use 1292c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // the display frame and let the attached window take care of 1293c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // positioning its content appropriately. 1294c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if ((sim & SOFT_INPUT_MASK_ADJUST) != SOFT_INPUT_ADJUST_RESIZE) { 1295c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project cf.set(attached.getDisplayFrameLw()); 1296c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1297c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If the window is resizing, then we want to base the content 1298c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // frame on our attached content frame to resize... however, 1299c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // things can be tricky if the attached window is NOT in resize 1300c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // mode, in which case its content frame will be larger. 1301c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Ungh. So to deal with that, make sure the content frame 1302c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // we end up using is not covering the IM dock. 1303c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project cf.set(attached.getContentFrameLw()); 1304c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (attached.getSurfaceLayer() < mDockLayer) { 1305c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (cf.left < mContentLeft) cf.left = mContentLeft; 1306c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (cf.top < mContentTop) cf.top = mContentTop; 1307c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (cf.right > mContentRight) cf.right = mContentRight; 1308c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (cf.bottom > mContentBottom) cf.bottom = mContentBottom; 1309c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1310c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1311c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.set(insetDecors ? attached.getDisplayFrameLw() : cf); 1312c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.set(attached.getVisibleFrameLw()); 1313c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1314c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // The LAYOUT_IN_SCREEN flag is used to determine whether the attached 1315c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // window should be positioned relative to its parent or the entire 1316c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // screen. 1317c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.set((fl & FLAG_LAYOUT_IN_SCREEN) == 0 1318c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project ? attached.getFrameLw() : df); 1319c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1320c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1321c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 13225b06cd8d5ada1f33d37710cba58dfa0db8f8ed2aDianne Hackborn public void layoutWindowLw(WindowState win, WindowManager.LayoutParams attrs, 13235b06cd8d5ada1f33d37710cba58dfa0db8f8ed2aDianne Hackborn WindowState attached) { 1324c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // we've already done the status bar 1325c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (win == mStatusBar) { 1326c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return; 1327c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1328c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1329c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (false) { 1330c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if ("com.google.android.youtube".equals(attrs.packageName) 1331c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project && attrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) { 1332c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.i(TAG, "GOTCHA!"); 1333c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1334c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1335c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1336c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final int fl = attrs.flags; 1337c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final int sim = attrs.softInputMode; 1338c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1339c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final Rect pf = mTmpParentFrame; 1340c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final Rect df = mTmpDisplayFrame; 1341c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final Rect cf = mTmpContentFrame; 1342c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final Rect vf = mTmpVisibleFrame; 1343c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1344c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (attrs.type == TYPE_INPUT_METHOD) { 1345c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.left = df.left = cf.left = vf.left = mDockLeft; 1346c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.top = df.top = cf.top = vf.top = mDockTop; 1347c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.right = df.right = cf.right = vf.right = mDockRight; 1348c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.bottom = df.bottom = cf.bottom = vf.bottom = mDockBottom; 1349c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // IM dock windows always go to the bottom of the screen. 1350c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project attrs.gravity = Gravity.BOTTOM; 1351c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mDockLayer = win.getSurfaceLayer(); 1352c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1353c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if ((fl & 1354c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR)) 1355c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project == (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) { 1356c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // This is the case for a normal activity window: we want it 1357c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // to cover all of the screen space, and it can take care of 1358c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // moving its contents to account for screen decorations that 1359c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // intrude into that space. 1360c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (attached != null) { 1361c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If this window is attached to another, our display 1362c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // frame is the same as the one we are attached to. 1363c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project setAttachedWindowFrames(win, fl, sim, attached, true, pf, df, cf, vf); 1364c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1365c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.left = df.left = 0; 1366c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.top = df.top = 0; 1367c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.right = df.right = mW; 1368c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.bottom = df.bottom = mH; 1369c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if ((sim & SOFT_INPUT_MASK_ADJUST) != SOFT_INPUT_ADJUST_RESIZE) { 1370c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project cf.left = mDockLeft; 1371c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project cf.top = mDockTop; 1372c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project cf.right = mDockRight; 1373c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project cf.bottom = mDockBottom; 1374c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1375c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project cf.left = mContentLeft; 1376c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project cf.top = mContentTop; 1377c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project cf.right = mContentRight; 1378c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project cf.bottom = mContentBottom; 1379c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1380c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.left = mCurLeft; 1381c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.top = mCurTop; 1382c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.right = mCurRight; 1383c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.bottom = mCurBottom; 1384c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1385c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if ((fl & FLAG_LAYOUT_IN_SCREEN) != 0) { 1386c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // A window that has requested to fill the entire screen just 1387c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // gets everything, period. 1388c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.left = df.left = cf.left = 0; 1389c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.top = df.top = cf.top = 0; 1390c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.right = df.right = cf.right = mW; 1391c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.bottom = df.bottom = cf.bottom = mH; 1392c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.left = mCurLeft; 1393c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.top = mCurTop; 1394c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.right = mCurRight; 1395c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.bottom = mCurBottom; 1396c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if (attached != null) { 1397c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // A child window should be placed inside of the same visible 1398c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // frame that its parent had. 1399c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project setAttachedWindowFrames(win, fl, sim, attached, false, pf, df, cf, vf); 1400c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1401c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Otherwise, a normal window must be placed inside the content 1402c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // of all screen decorations. 1403c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.left = mContentLeft; 1404c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.top = mContentTop; 1405c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.right = mContentRight; 1406c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project pf.bottom = mContentBottom; 1407c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if ((sim & SOFT_INPUT_MASK_ADJUST) != SOFT_INPUT_ADJUST_RESIZE) { 1408c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.left = cf.left = mDockLeft; 1409c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.top = cf.top = mDockTop; 1410c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.right = cf.right = mDockRight; 1411c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.bottom = cf.bottom = mDockBottom; 1412c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1413c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.left = cf.left = mContentLeft; 1414c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.top = cf.top = mContentTop; 1415c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.right = cf.right = mContentRight; 1416c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.bottom = cf.bottom = mContentBottom; 1417c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1418c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.left = mCurLeft; 1419c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.top = mCurTop; 1420c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.right = mCurRight; 1421c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project vf.bottom = mCurBottom; 1422c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1423c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1424c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1425c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if ((fl & FLAG_LAYOUT_NO_LIMITS) != 0) { 1426c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.left = df.top = cf.left = cf.top = vf.left = vf.top = -10000; 1427c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project df.right = df.bottom = cf.right = cf.bottom = vf.right = vf.bottom = 10000; 1428c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1429c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 14304eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project if (DEBUG_LAYOUT) Log.v(TAG, "Compute frame " + attrs.getTitle() 14314eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project + ": sim=#" + Integer.toHexString(sim) 14324eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project + " pf=" + pf.toShortString() + " df=" + df.toShortString() 14334eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project + " cf=" + cf.toShortString() + " vf=" + vf.toShortString()); 14344eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project 1435c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (false) { 1436c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if ("com.google.android.youtube".equals(attrs.packageName) 1437c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project && attrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) { 1438c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (true || localLOGV) Log.v(TAG, "Computing frame of " + win + 14394eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project ": sim=#" + Integer.toHexString(sim) 14404eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project + " pf=" + pf.toShortString() + " df=" + df.toShortString() 1441c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project + " cf=" + cf.toShortString() + " vf=" + vf.toShortString()); 1442c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1443c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1444c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1445c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project win.computeFrameLw(pf, df, cf, vf); 1446c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1447c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Dock windows carve out the bottom of the screen, so normal windows 1448c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // can't appear underneath them. 1449c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (attrs.type == TYPE_INPUT_METHOD && !win.getGivenInsetsPendingLw()) { 1450c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int top = win.getContentFrameLw().top; 1451c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project top += win.getGivenContentInsetsLw().top; 1452c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mContentBottom > top) { 1453c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mContentBottom = top; 1454c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1455c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project top = win.getVisibleFrameLw().top; 1456c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project top += win.getGivenVisibleInsetsLw().top; 1457c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mCurBottom > top) { 1458c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mCurBottom = top; 1459c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 14604eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project if (DEBUG_LAYOUT) Log.v(TAG, "Input method: mDockBottom=" 14614eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project + mDockBottom + " mContentBottom=" 14624eba15568959633a97ecd6e50ecc0541e3a69de5The Android Open Source Project + mContentBottom + " mCurBottom=" + mCurBottom); 1463c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1464c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1465c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1466c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 14676b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn public int finishLayoutLw() { 146867accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn return 0; 146967accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 147067accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn 147167accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn /** {@inheritDoc} */ 147267accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn public void beginAnimationLw(int displayWidth, int displayHeight) { 147367accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn mTopFullscreenOpaqueWindowState = null; 147467accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn mForceStatusBar = false; 147567accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn 147667accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn mHideLockScreen = false; 147767accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn mAllowLockscreenWhenOn = false; 147867accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn mDismissKeyguard = false; 147967accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 148067accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn 148167accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn /** {@inheritDoc} */ 148267accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn public void animatingWindowLw(WindowState win, 148367accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn WindowManager.LayoutParams attrs) { 148467accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if (mTopFullscreenOpaqueWindowState == null && 148567accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn win.isVisibleOrBehindKeyguardLw()) { 148667accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if ((attrs.flags & FLAG_FORCE_NOT_FULLSCREEN) != 0) { 148767accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn mForceStatusBar = true; 148867accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 148967accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if (attrs.type >= FIRST_APPLICATION_WINDOW 149067accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn && attrs.type <= LAST_APPLICATION_WINDOW 149167accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn && win.fillsScreenLw(mW, mH, false, false)) { 149267accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if (DEBUG_LAYOUT) Log.v(TAG, "Fullscreen window: " + win); 149367accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn mTopFullscreenOpaqueWindowState = win; 149467accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if ((attrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0) { 149567accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if (localLOGV) Log.v(TAG, "Setting mHideLockScreen to true by win " + win); 149667accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn mHideLockScreen = true; 149767accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 149867accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if ((attrs.flags & FLAG_DISMISS_KEYGUARD) != 0) { 149967accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if (localLOGV) Log.v(TAG, "Setting mDismissKeyguard to true by win " + win); 150067accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn mDismissKeyguard = true; 150167accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 150267accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if ((attrs.flags & FLAG_ALLOW_LOCK_WHILE_SCREEN_ON) != 0) { 150367accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn mAllowLockscreenWhenOn = true; 150467accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 150567accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 150667accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 150767accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 150867accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn 150967accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn /** {@inheritDoc} */ 151067accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn public int finishAnimationLw() { 15116b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn int changes = 0; 151267accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn 15132c7bbd9c5b2c5515a0efa531f51473f5fb26dbd9The Android Open Source Project boolean hiding = false; 1514c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mStatusBar != null) { 1515e526c56eb01db55706f07afc3b763786565d251bDianne Hackborn if (localLOGV) Log.i(TAG, "force=" + mForceStatusBar 1516e526c56eb01db55706f07afc3b763786565d251bDianne Hackborn + " top=" + mTopFullscreenOpaqueWindowState); 1517c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mForceStatusBar) { 15185b06cd8d5ada1f33d37710cba58dfa0db8f8ed2aDianne Hackborn if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar"); 15196b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn if (mStatusBar.showLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT; 1520c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if (mTopFullscreenOpaqueWindowState != null) { 1521c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project //Log.i(TAG, "frame: " + mTopFullscreenOpaqueWindowState.getFrameLw() 1522c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // + " shown frame: " + mTopFullscreenOpaqueWindowState.getShownFrameLw()); 1523c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project //Log.i(TAG, "attr: " + mTopFullscreenOpaqueWindowState.getAttrs()); 1524c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project WindowManager.LayoutParams lp = 1525c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mTopFullscreenOpaqueWindowState.getAttrs(); 1526c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean hideStatusBar = 1527c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project (lp.flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0; 1528c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (hideStatusBar) { 15295b06cd8d5ada1f33d37710cba58dfa0db8f8ed2aDianne Hackborn if (DEBUG_LAYOUT) Log.v(TAG, "Hiding status bar"); 15306b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn if (mStatusBar.hideLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT; 15312c7bbd9c5b2c5515a0efa531f51473f5fb26dbd9The Android Open Source Project hiding = true; 1532c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 15335b06cd8d5ada1f33d37710cba58dfa0db8f8ed2aDianne Hackborn if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar"); 15346b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn if (mStatusBar.showLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT; 1535c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1536c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1537c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 153867accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn 153967accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if (changes != 0 && hiding) { 154067accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn IStatusBar sbs = IStatusBar.Stub.asInterface(ServiceManager.getService("statusbar")); 154167accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn if (sbs != null) { 154267accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn try { 154367accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn // Make sure the window shade is hidden. 154467accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn sbs.deactivate(); 154567accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } catch (RemoteException e) { 154667accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 154767accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 154867accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn } 154967accfd37face47d46d770aa3b7b6458b1e44a74Dianne Hackborn 15501615d63b8fd58d1e8d19207ffb0aeccf09840021Suchi Amalapurapu // Hide the key guard if a visible window explicitly specifies that it wants to be displayed 15511615d63b8fd58d1e8d19207ffb0aeccf09840021Suchi Amalapurapu // when the screen is locked 15521615d63b8fd58d1e8d19207ffb0aeccf09840021Suchi Amalapurapu if (mKeyguard != null) { 1553adda0c0fb04a828a71aba1bffa20689427b972bdDianne Hackborn if (localLOGV) Log.v(TAG, "finishLayoutLw::mHideKeyguard="+mHideLockScreen); 1554adda0c0fb04a828a71aba1bffa20689427b972bdDianne Hackborn if (mDismissKeyguard && !mKeyguardMediator.isSecure()) { 1555f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn if (mKeyguard.hideLw(true)) { 15566b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn changes |= FINISH_LAYOUT_REDO_LAYOUT 15576b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn | FINISH_LAYOUT_REDO_CONFIG 15586b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn | FINISH_LAYOUT_REDO_WALLPAPER; 15596b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 1560adda0c0fb04a828a71aba1bffa20689427b972bdDianne Hackborn if (mKeyguardMediator.isShowing()) { 1561a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn mHandler.post(new Runnable() { 1562a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn public void run() { 1563adda0c0fb04a828a71aba1bffa20689427b972bdDianne Hackborn mKeyguardMediator.keyguardDone(false, false); 1564a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn } 1565a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn }); 1566a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn } 1567adda0c0fb04a828a71aba1bffa20689427b972bdDianne Hackborn } else if (mHideLockScreen) { 1568f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn if (mKeyguard.hideLw(true)) { 15696b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn changes |= FINISH_LAYOUT_REDO_LAYOUT 15706b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn | FINISH_LAYOUT_REDO_CONFIG 15716b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn | FINISH_LAYOUT_REDO_WALLPAPER; 15726b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 1573ccd5aeef0bccfa7963a3dc5d33d467a1446865f1Mike Lockwood mKeyguardMediator.setHidden(true); 15741615d63b8fd58d1e8d19207ffb0aeccf09840021Suchi Amalapurapu } else { 1575f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn if (mKeyguard.showLw(true)) { 15766b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn changes |= FINISH_LAYOUT_REDO_LAYOUT 15776b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn | FINISH_LAYOUT_REDO_CONFIG 15786b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn | FINISH_LAYOUT_REDO_WALLPAPER; 15796b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 1580ccd5aeef0bccfa7963a3dc5d33d467a1446865f1Mike Lockwood mKeyguardMediator.setHidden(false); 15811615d63b8fd58d1e8d19207ffb0aeccf09840021Suchi Amalapurapu } 15821615d63b8fd58d1e8d19207ffb0aeccf09840021Suchi Amalapurapu } 15832c7bbd9c5b2c5515a0efa531f51473f5fb26dbd9The Android Open Source Project 1584faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood // update since mAllowLockscreenWhenOn might have changed 1585faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood updateLockScreenTimeout(); 15866b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn return changes; 1587c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1588c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1589f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn public boolean allowAppAnimationsLw() { 1590f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn if (mKeyguard != null && mKeyguard.isVisibleLw()) { 1591f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn // If keyguard is currently visible, no reason to animate 1592f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn // behind it. 1593f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn return false; 1594f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn } 1595f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn if (mStatusBar != null && mStatusBar.isVisibleLw()) { 1596f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn Rect rect = new Rect(mStatusBar.getShownFrameLw()); 1597f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn for (int i=mStatusBarPanels.size()-1; i>=0; i--) { 1598f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn WindowState w = mStatusBarPanels.get(i); 1599f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn if (w.isVisibleLw()) { 1600f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn rect.union(w.getShownFrameLw()); 1601f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn } 1602f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn } 1603f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn final int insetw = mW/10; 1604f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn final int inseth = mH/10; 1605f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn if (rect.contains(insetw, inseth, mW-insetw, mH-inseth)) { 1606f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn // All of the status bar windows put together cover the 1607f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn // screen, so the app can't be seen. (Note this test doesn't 1608f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn // work if the rects of these windows are at off offsets or 1609f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn // sizes, causing gaps in the rect union we have computed.) 1610f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn return false; 1611f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn } 1612f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn } 1613f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn return true; 1614f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn } 1615f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn 16165b06cd8d5ada1f33d37710cba58dfa0db8f8ed2aDianne Hackborn /** {@inheritDoc} */ 1617c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public boolean preprocessInputEventTq(RawInputEvent event) { 1618c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project switch (event.type) { 1619c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case RawInputEvent.EV_SW: 1620e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood if (event.keycode == RawInputEvent.SW_LID) { 1621c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // lid changed state 1622c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mLidOpen = event.value == 0; 1623a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn boolean awakeNow = mKeyguardMediator.doLidChangeTq(mLidOpen); 1624a985dd81d649d677e7d943a2d345a859cb1985b5Dianne Hackborn updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE); 1625a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn if (awakeNow) { 1626a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn // If the lid opening and we don't have to keep the 1627a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn // keyguard up, then we can turn on the screen 1628a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn // immediately. 1629a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn mKeyguardMediator.pokeWakelock(); 1630a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn } else if (keyguardIsShowingTq()) { 1631c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mLidOpen) { 1632a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn // If we are opening the lid and not hiding the 1633a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn // keyguard, then we need to have it turn on the 1634a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn // screen once it is shown. 1635a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn mKeyguardMediator.onWakeKeyWhenKeyguardShowingTq( 1636a0a8e1546a6f722cb886f3badac9de711d1b0e3bDianne Hackborn KeyEvent.KEYCODE_POWER); 1637c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1638c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1639c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Light up the keyboard if we are sliding up. 1640c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mLidOpen) { 1641c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mPowerManager.userActivity(SystemClock.uptimeMillis(), false, 1642c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project LocalPowerManager.BUTTON_EVENT); 1643c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1644c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mPowerManager.userActivity(SystemClock.uptimeMillis(), false, 1645c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project LocalPowerManager.OTHER_EVENT); 1646c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1647c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1648c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1649c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1650c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 1651c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1652c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1653c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1654c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 1655c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public boolean isAppSwitchKeyTqTiLwLi(int keycode) { 1656c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return keycode == KeyEvent.KEYCODE_HOME 1657c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project || keycode == KeyEvent.KEYCODE_ENDCALL; 1658c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1659c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1660c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 1661c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public boolean isMovementKeyTi(int keycode) { 1662c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project switch (keycode) { 1663c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case KeyEvent.KEYCODE_DPAD_UP: 1664c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case KeyEvent.KEYCODE_DPAD_DOWN: 1665c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case KeyEvent.KEYCODE_DPAD_LEFT: 1666c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case KeyEvent.KEYCODE_DPAD_RIGHT: 1667c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 1668c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1669c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 1670c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1671c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1672c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1673c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** 1674c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * @return Whether a telephone call is in progress right now. 1675c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 1676c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean isInCall() { 1677c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final ITelephony phone = getPhoneInterface(); 1678c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (phone == null) { 1679c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.w(TAG, "couldn't get ITelephony reference"); 1680c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 1681c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1682c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project try { 1683c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return phone.isOffhook(); 1684c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (RemoteException e) { 1685c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.w(TAG, "ITelephony.isOffhhook threw RemoteException " + e); 1686c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 1687c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1688c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1689c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1690c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** 1691c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * @return Whether music is being played right now. 1692c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 1693c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean isMusicActive() { 1694945704a08f6d896ed4c2d35a7fca340f3a33583eEric Laurent final AudioManager am = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); 1695945704a08f6d896ed4c2d35a7fca340f3a33583eEric Laurent if (am == null) { 1696945704a08f6d896ed4c2d35a7fca340f3a33583eEric Laurent Log.w(TAG, "isMusicActive: couldn't get AudioManager reference"); 1697c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 1698c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1699945704a08f6d896ed4c2d35a7fca340f3a33583eEric Laurent return am.isMusicActive(); 1700c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1701c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1702c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** 1703c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Tell the audio service to adjust the volume appropriate to the event. 1704c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * @param keycode 1705c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 170625ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood void handleVolumeKey(int stream, int keycode) { 1707c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final IAudioService audio = getAudioInterface(); 1708c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (audio == null) { 170925ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood Log.w(TAG, "handleVolumeKey: couldn't get IAudioService reference"); 1710c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return; 1711c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1712c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project try { 1713c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // since audio is playing, we shouldn't have to hold a wake lock 1714c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // during the call, but we do it as a precaution for the rare possibility 1715c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // that the music stops right before we call this 1716c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mBroadcastWakeLock.acquire(); 171725ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood audio.adjustStreamVolume(stream, 1718c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project keycode == KeyEvent.KEYCODE_VOLUME_UP 1719c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project ? AudioManager.ADJUST_RAISE 1720c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project : AudioManager.ADJUST_LOWER, 1721c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 0); 1722c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (RemoteException e) { 1723c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.w(TAG, "IAudioService.adjustStreamVolume() threw RemoteException " + e); 1724c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } finally { 1725c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mBroadcastWakeLock.release(); 1726c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1727c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1728c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1729c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static boolean isMediaKey(int code) { 1730c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (code == KeyEvent.KEYCODE_HEADSETHOOK || 17314ea45182a1239fb75ac3c9e92032b43365081cf1Andy Stadler code == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE || 17324ea45182a1239fb75ac3c9e92032b43365081cf1Andy Stadler code == KeyEvent.KEYCODE_MEDIA_STOP || 17334ea45182a1239fb75ac3c9e92032b43365081cf1Andy Stadler code == KeyEvent.KEYCODE_MEDIA_NEXT || 17344ea45182a1239fb75ac3c9e92032b43365081cf1Andy Stadler code == KeyEvent.KEYCODE_MEDIA_PREVIOUS || 1735d4d7452e0827bd065845845823c3f734b13b92e7Johan Redestig code == KeyEvent.KEYCODE_MEDIA_REWIND || 17364ea45182a1239fb75ac3c9e92032b43365081cf1Andy Stadler code == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { 1737c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 1738c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1739c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 1740c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1741c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1742c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 1743c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public int interceptKeyTq(RawInputEvent event, boolean screenIsOn) { 1744c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int result = ACTION_PASS_TO_USER; 1745c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final boolean isWakeKey = isWakeKeyTq(event); 1746b64c72dfb3e635093b00690454cb905ffff68ab9Mike Lockwood // If screen is off then we treat the case where the keyguard is open but hidden 1747b64c72dfb3e635093b00690454cb905ffff68ab9Mike Lockwood // the same as if it were open and in front. 1748b64c72dfb3e635093b00690454cb905ffff68ab9Mike Lockwood // This will prevent any keys other than the power button from waking the screen 1749b64c72dfb3e635093b00690454cb905ffff68ab9Mike Lockwood // when the keyguard is hidden by another activity. 1750b64c72dfb3e635093b00690454cb905ffff68ab9Mike Lockwood final boolean keyguardActive = (screenIsOn ? 1751b64c72dfb3e635093b00690454cb905ffff68ab9Mike Lockwood mKeyguardMediator.isShowingAndNotHidden() : 1752b64c72dfb3e635093b00690454cb905ffff68ab9Mike Lockwood mKeyguardMediator.isShowing()); 1753c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1754c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (false) { 1755c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.d(TAG, "interceptKeyTq event=" + event + " keycode=" + event.keycode 1756b64c72dfb3e635093b00690454cb905ffff68ab9Mike Lockwood + " screenIsOn=" + screenIsOn + " keyguardActive=" + keyguardActive); 1757c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1758c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1759b64c72dfb3e635093b00690454cb905ffff68ab9Mike Lockwood if (keyguardActive) { 1760c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (screenIsOn) { 1761c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // when the screen is on, always give the event to the keyguard 1762c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project result |= ACTION_PASS_TO_USER; 1763c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1764c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // otherwise, don't pass it to the user 1765c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project result &= ~ACTION_PASS_TO_USER; 1766c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1767c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project final boolean isKeyDown = 1768c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project (event.type == RawInputEvent.EV_KEY) && (event.value != 0); 1769c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (isWakeKey && isKeyDown) { 1770c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1771c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // tell the mediator about a wake key, it may decide to 1772c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // turn on the screen depending on whether the key is 1773c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // appropriate. 1774c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (!mKeyguardMediator.onWakeKeyWhenKeyguardShowingTq(event.keycode) 1775c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project && (event.keycode == KeyEvent.KEYCODE_VOLUME_DOWN 1776c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project || event.keycode == KeyEvent.KEYCODE_VOLUME_UP)) { 1777e7ef42416088235d9e220e3b031d4f612f436a06Mike Lockwood // when keyguard is showing and screen off, we need 1778e7ef42416088235d9e220e3b031d4f612f436a06Mike Lockwood // to handle the volume key for calls and music here 1779c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (isInCall()) { 1780e7ef42416088235d9e220e3b031d4f612f436a06Mike Lockwood handleVolumeKey(AudioManager.STREAM_VOICE_CALL, event.keycode); 1781c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if (isMusicActive()) { 178225ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood handleVolumeKey(AudioManager.STREAM_MUSIC, event.keycode); 1783c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1784c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1785c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1786c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1787c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if (!screenIsOn) { 178825ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood // If we are in-call with screen off and keyguard is not showing, 178925ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood // then handle the volume key ourselves. 179025ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood // This is necessary because the phone app will disable the keyguard 179125ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood // when the proximity sensor is in use. 179225ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood if (isInCall() && event.type == RawInputEvent.EV_KEY && 179325ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood (event.keycode == KeyEvent.KEYCODE_VOLUME_DOWN 179425ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood || event.keycode == KeyEvent.KEYCODE_VOLUME_UP)) { 179525ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood result &= ~ACTION_PASS_TO_USER; 179625ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood handleVolumeKey(AudioManager.STREAM_VOICE_CALL, event.keycode); 179725ca181b82daaa42a2ec5a990f2afc6aad5be536Mike Lockwood } 1798c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (isWakeKey) { 1799c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // a wake key has a sole purpose of waking the device; don't pass 1800c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // it to the user 1801c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project result |= ACTION_POKE_USER_ACTIVITY; 1802c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project result &= ~ACTION_PASS_TO_USER; 1803c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1804c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1805c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1806c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int type = event.type; 1807c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int code = event.keycode; 1808c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean down = event.value != 0; 1809c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1810c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (type == RawInputEvent.EV_KEY) { 1811a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn if (code == KeyEvent.KEYCODE_ENDCALL 1812a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn || code == KeyEvent.KEYCODE_POWER) { 1813c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (down) { 1814b17c86966b29f3b2604bc256c3ee056576133a03Mike Lockwood boolean handled = false; 18154c938f402663bcdbadc08af91afdd9e96eac7e42David Brown boolean hungUp = false; 1816c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // key repeats are generated by the window manager, and we don't see them 1817c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // here, so unless the driver is doing something it shouldn't be, we know 1818c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // this is the real press event. 1819146ef723bc0fc87aba00400196a5e64ab128ee17Mike Lockwood ITelephony phoneServ = getPhoneInterface(); 1820146ef723bc0fc87aba00400196a5e64ab128ee17Mike Lockwood if (phoneServ != null) { 1821a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn try { 1822b17c86966b29f3b2604bc256c3ee056576133a03Mike Lockwood if (code == KeyEvent.KEYCODE_ENDCALL) { 18234c938f402663bcdbadc08af91afdd9e96eac7e42David Brown handled = hungUp = phoneServ.endCall(); 18244c938f402663bcdbadc08af91afdd9e96eac7e42David Brown } else if (code == KeyEvent.KEYCODE_POWER) { 18254c938f402663bcdbadc08af91afdd9e96eac7e42David Brown if (phoneServ.isRinging()) { 18264c938f402663bcdbadc08af91afdd9e96eac7e42David Brown // Pressing Power while there's a ringing incoming 18274c938f402663bcdbadc08af91afdd9e96eac7e42David Brown // call should silence the ringer. 18284c938f402663bcdbadc08af91afdd9e96eac7e42David Brown phoneServ.silenceRinger(); 18294c938f402663bcdbadc08af91afdd9e96eac7e42David Brown handled = true; 18304c938f402663bcdbadc08af91afdd9e96eac7e42David Brown } else if (phoneServ.isOffhook() && 18314c938f402663bcdbadc08af91afdd9e96eac7e42David Brown ((mIncallPowerBehavior 18324c938f402663bcdbadc08af91afdd9e96eac7e42David Brown & Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP) 18334c938f402663bcdbadc08af91afdd9e96eac7e42David Brown != 0)) { 18344c938f402663bcdbadc08af91afdd9e96eac7e42David Brown // Otherwise, if "Power button ends call" is enabled, 18354c938f402663bcdbadc08af91afdd9e96eac7e42David Brown // the Power button will hang up any current active call. 18364c938f402663bcdbadc08af91afdd9e96eac7e42David Brown handled = hungUp = phoneServ.endCall(); 18374c938f402663bcdbadc08af91afdd9e96eac7e42David Brown } 1838a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn } 1839a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn } catch (RemoteException ex) { 1840146ef723bc0fc87aba00400196a5e64ab128ee17Mike Lockwood Log.w(TAG, "ITelephony threw RemoteException" + ex); 1841c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1842146ef723bc0fc87aba00400196a5e64ab128ee17Mike Lockwood } else { 1843146ef723bc0fc87aba00400196a5e64ab128ee17Mike Lockwood Log.w(TAG, "!!! Unable to find ITelephony interface !!!"); 1844c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 18454c938f402663bcdbadc08af91afdd9e96eac7e42David Brown 18464c938f402663bcdbadc08af91afdd9e96eac7e42David Brown if (!screenIsOn 18474c938f402663bcdbadc08af91afdd9e96eac7e42David Brown || (handled && code != KeyEvent.KEYCODE_POWER) 18484c938f402663bcdbadc08af91afdd9e96eac7e42David Brown || (handled && hungUp && code == KeyEvent.KEYCODE_POWER)) { 1849c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mShouldTurnOffOnKeyUp = false; 1850c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1851c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // only try to turn off the screen if we didn't already hang up 1852c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mShouldTurnOffOnKeyUp = true; 1853a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn mHandler.postDelayed(mPowerLongPress, 1854c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project ViewConfiguration.getGlobalActionKeyTimeout()); 1855c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project result &= ~ACTION_PASS_TO_USER; 1856c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1857c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1858a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn mHandler.removeCallbacks(mPowerLongPress); 1859c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mShouldTurnOffOnKeyUp) { 1860c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mShouldTurnOffOnKeyUp = false; 1861aab8769005ed52a3e82aedf8d87c902d762bdb24Mike Lockwood boolean gohome, sleeps; 1862aab8769005ed52a3e82aedf8d87c902d762bdb24Mike Lockwood if (code == KeyEvent.KEYCODE_ENDCALL) { 18634c938f402663bcdbadc08af91afdd9e96eac7e42David Brown gohome = (mEndcallBehavior 18644c938f402663bcdbadc08af91afdd9e96eac7e42David Brown & Settings.System.END_BUTTON_BEHAVIOR_HOME) != 0; 18654c938f402663bcdbadc08af91afdd9e96eac7e42David Brown sleeps = (mEndcallBehavior 18664c938f402663bcdbadc08af91afdd9e96eac7e42David Brown & Settings.System.END_BUTTON_BEHAVIOR_SLEEP) != 0; 1867aab8769005ed52a3e82aedf8d87c902d762bdb24Mike Lockwood } else { 1868aab8769005ed52a3e82aedf8d87c902d762bdb24Mike Lockwood gohome = false; 1869aab8769005ed52a3e82aedf8d87c902d762bdb24Mike Lockwood sleeps = true; 1870aab8769005ed52a3e82aedf8d87c902d762bdb24Mike Lockwood } 1871b64c72dfb3e635093b00690454cb905ffff68ab9Mike Lockwood if (keyguardActive 1872c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project || (sleeps && !gohome) 1873c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project || (gohome && !goHome() && sleeps)) { 1874c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // they must already be on the keyguad or home screen, 1875c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // go to sleep instead 1876c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.d(TAG, "I'm tired mEndcallBehavior=0x" 1877c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project + Integer.toHexString(mEndcallBehavior)); 1878c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project result &= ~ACTION_POKE_USER_ACTIVITY; 1879c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project result |= ACTION_GO_TO_SLEEP; 1880c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1881c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project result &= ~ACTION_PASS_TO_USER; 1882c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1883c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1884c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if (isMediaKey(code)) { 1885c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // This key needs to be handled even if the screen is off. 1886c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If others need to be handled while it's off, this is a reasonable 1887c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // pattern to follow. 1888c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if ((result & ACTION_PASS_TO_USER) == 0) { 1889c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Only do this if we would otherwise not pass it to the user. In that 1890c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // case, the PhoneWindow class will do the same thing, except it will 1891c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // only do it if the showing app doesn't process the key on its own. 1892c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project KeyEvent keyEvent = new KeyEvent(event.when, event.when, 1893c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project down ? KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP, 1894c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project code, 0); 1895c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mBroadcastWakeLock.acquire(); 1896c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHandler.post(new PassHeadsetKey(keyEvent)); 1897c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1898c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if (code == KeyEvent.KEYCODE_CALL) { 1899c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If an incoming call is ringing, answer it! 1900c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // (We handle this key here, rather than in the InCallScreen, to make 1901c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // sure we'll respond to the key even if the InCallScreen hasn't come to 1902c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // the foreground yet.) 1903c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1904c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // We answer the call on the DOWN event, to agree with 1905c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // the "fallback" behavior in the InCallScreen. 1906c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (down) { 1907c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project try { 1908c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project ITelephony phoneServ = getPhoneInterface(); 1909c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (phoneServ != null) { 1910c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (phoneServ.isRinging()) { 1911c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.i(TAG, "interceptKeyTq:" 1912c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project + " CALL key-down while ringing: Answer the call!"); 1913c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project phoneServ.answerRingingCall(); 1914c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1915c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // And *don't* pass this key thru to the current activity 1916c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // (which is presumably the InCallScreen.) 1917c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project result &= ~ACTION_PASS_TO_USER; 1918c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1919c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1920c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.w(TAG, "CALL button: Unable to find ITelephony interface"); 1921c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1922c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (RemoteException ex) { 1923c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.w(TAG, "CALL button: RemoteException from getPhoneInterface()", ex); 1924c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1925c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1926c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else if ((code == KeyEvent.KEYCODE_VOLUME_UP) 1927c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project || (code == KeyEvent.KEYCODE_VOLUME_DOWN)) { 1928c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // If an incoming call is ringing, either VOLUME key means 1929c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // "silence ringer". We handle these keys here, rather than 1930c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // in the InCallScreen, to make sure we'll respond to them 1931c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // even if the InCallScreen hasn't come to the foreground yet. 1932c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1933c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Look for the DOWN event here, to agree with the "fallback" 1934c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // behavior in the InCallScreen. 1935c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (down) { 1936c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project try { 1937c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project ITelephony phoneServ = getPhoneInterface(); 1938c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (phoneServ != null) { 1939c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (phoneServ.isRinging()) { 1940c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.i(TAG, "interceptKeyTq:" 1941c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project + " VOLUME key-down while ringing: Silence ringer!"); 1942c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Silence the ringer. (It's safe to call this 1943c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // even if the ringer has already been silenced.) 1944c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project phoneServ.silenceRinger(); 1945c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1946c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // And *don't* pass this key thru to the current activity 1947c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // (which is probably the InCallScreen.) 1948c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project result &= ~ACTION_PASS_TO_USER; 1949c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1950c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 1951c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.w(TAG, "VOLUME button: Unable to find ITelephony interface"); 1952c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1953c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (RemoteException ex) { 1954c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Log.w(TAG, "VOLUME button: RemoteException from getPhoneInterface()", ex); 1955c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1956c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1957c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1958c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1959c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1960c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return result; 1961c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1962c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1963c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project class PassHeadsetKey implements Runnable { 1964c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project KeyEvent mKeyEvent; 1965c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1966c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project PassHeadsetKey(KeyEvent keyEvent) { 1967c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mKeyEvent = keyEvent; 1968c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1969c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1970c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void run() { 1971c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (ActivityManagerNative.isSystemReady()) { 1972c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); 1973c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project intent.putExtra(Intent.EXTRA_KEY_EVENT, mKeyEvent); 1974c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mContext.sendOrderedBroadcast(intent, null, mBroadcastDone, 1975c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHandler, Activity.RESULT_OK, null, null); 1976c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1977c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1978c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1979c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 1980c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project BroadcastReceiver mBroadcastDone = new BroadcastReceiver() { 1981c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void onReceive(Context context, Intent intent) { 1982c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mBroadcastWakeLock.release(); 1983c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 1984c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project }; 1985e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood 1986e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood BroadcastReceiver mDockReceiver = new BroadcastReceiver() { 1987e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood public void onReceive(Context context, Intent intent) { 1988b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn if (Intent.ACTION_DOCK_EVENT.equals(intent.getAction())) { 1989b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn mDockMode = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, 1990b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn Intent.EXTRA_DOCK_STATE_UNDOCKED); 1991b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn } else { 1992b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn try { 1993b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn IUiModeManager uiModeService = IUiModeManager.Stub.asInterface( 1994b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn ServiceManager.getService(Context.UI_MODE_SERVICE)); 1995b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn mUiMode = uiModeService.getCurrentModeType(); 1996b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn } catch (RemoteException e) { 1997b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn } 1998b4ccee6f4c4bff3e063a06b26a3314121d06467dDianne Hackborn } 1999e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE); 2000ad12b1407b4f615765bca0f496ccbb0a11678a4fMike Lockwood updateOrientationListenerLp(); 2001e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood } 2002e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood }; 2003e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood 2004c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 2005c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public boolean isWakeRelMovementTq(int device, int classes, 2006c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project RawInputEvent event) { 2007c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // if it's tagged with one of the wake bits, it wakes up the device 2008c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return ((event.flags & (FLAG_WAKE | FLAG_WAKE_DROPPED)) != 0); 2009c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2010c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2011c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 2012c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public boolean isWakeAbsMovementTq(int device, int classes, 2013c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project RawInputEvent event) { 2014c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // if it's tagged with one of the wake bits, it wakes up the device 2015c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return ((event.flags & (FLAG_WAKE | FLAG_WAKE_DROPPED)) != 0); 2016c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2017c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2018c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** 2019c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Given the current state of the world, should this key wake up the device? 2020c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 2021c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project protected boolean isWakeKeyTq(RawInputEvent event) { 2022c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // There are not key maps for trackball devices, but we'd still 2023c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // like to have pressing it wake the device up, so force it here. 2024c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int keycode = event.keycode; 2025c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int flags = event.flags; 2026c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (keycode == RawInputEvent.BTN_MOUSE) { 2027c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project flags |= WindowManagerPolicy.FLAG_WAKE; 2028c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2029c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return (flags 2030c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project & (WindowManagerPolicy.FLAG_WAKE | WindowManagerPolicy.FLAG_WAKE_DROPPED)) != 0; 2031c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2032c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2033c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 2034c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void screenTurnedOff(int why) { 2035bf685b9b9d67687b3ad3cb07814e94ce98676256Dianne Hackborn EventLog.writeEvent(70000, 0); 2036bf685b9b9d67687b3ad3cb07814e94ce98676256Dianne Hackborn mKeyguardMediator.onScreenTurnedOff(why); 2037d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project synchronized (mLock) { 2038d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project mScreenOn = false; 2039d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project updateOrientationListenerLp(); 2040faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood updateLockScreenTimeout(); 2041d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project } 2042c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2043c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2044c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 2045c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void screenTurnedOn() { 2046bf685b9b9d67687b3ad3cb07814e94ce98676256Dianne Hackborn EventLog.writeEvent(70000, 1); 2047bf685b9b9d67687b3ad3cb07814e94ce98676256Dianne Hackborn mKeyguardMediator.onScreenTurnedOn(); 2048d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project synchronized (mLock) { 2049d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project mScreenOn = true; 2050d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project updateOrientationListenerLp(); 2051faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood updateLockScreenTimeout(); 2052d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project } 2053c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2054c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2055c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 2056f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn public boolean isScreenOn() { 2057f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn return mScreenOn; 2058f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn } 2059f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn 2060f30a5a4482e4d1d8ec7be96ad97117cb2ca4354cDianne Hackborn /** {@inheritDoc} */ 2061c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void enableKeyguard(boolean enabled) { 2062c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mKeyguardMediator.setKeyguardEnabled(enabled); 2063c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2064c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2065c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 2066c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void exitKeyguardSecurely(OnKeyguardExitResult callback) { 2067c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mKeyguardMediator.verifyUnlock(callback); 2068c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2069c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 207055039bde3ff8a76a51410b23257f71496bbdbde5Mike Lockwood private boolean keyguardIsShowingTq() { 2071eb8e950ea446ce6a1b83c565718217d944dd3557Dianne Hackborn return mKeyguardMediator.isShowingAndNotHidden(); 2072c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2073c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2074c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 2075c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public boolean inKeyguardRestrictedKeyInputMode() { 2076c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return mKeyguardMediator.isInputRestricted(); 2077c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2078c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2079c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project void sendCloseSystemWindows() { 2080c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project sendCloseSystemWindows(mContext, null); 2081c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2082c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2083c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project void sendCloseSystemWindows(String reason) { 2084c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project sendCloseSystemWindows(mContext, reason); 2085c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2086c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2087c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project static void sendCloseSystemWindows(Context context, String reason) { 2088c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (ActivityManagerNative.isSystemReady()) { 20891dc1ccaf5c8cc136b71537f310a3f13150aaef41Dianne Hackborn try { 20901dc1ccaf5c8cc136b71537f310a3f13150aaef41Dianne Hackborn ActivityManagerNative.getDefault().closeSystemDialogs(reason); 20911dc1ccaf5c8cc136b71537f310a3f13150aaef41Dianne Hackborn } catch (RemoteException e) { 2092c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2093c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2094c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2095c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2096d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project public int rotationForOrientationLw(int orientation, int lastRotation, 2097c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean displayEnabled) { 2098525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima 2099525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima if (mPortraitRotation < 0) { 2100525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima // Initialize the rotation angles for each orientation once. 2101525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima Display d = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)) 2102525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima .getDefaultDisplay(); 2103525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima if (d.getWidth() > d.getHeight()) { 2104525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima mPortraitRotation = Surface.ROTATION_90; 2105525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima mLandscapeRotation = Surface.ROTATION_0; 2106525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima } else { 2107525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima mPortraitRotation = Surface.ROTATION_0; 2108525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima mLandscapeRotation = Surface.ROTATION_90; 2109525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima } 2110525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima } 2111525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima 2112d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project synchronized (mLock) { 2113d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project switch (orientation) { 2114d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE: 2115d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project //always return landscape if orientation set to landscape 2116525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima return mLandscapeRotation; 2117d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT: 2118d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project //always return portrait if orientation set to portrait 2119525258d21cf9570461507f3668e24668e18c9f99Mitsuru Oshima return mPortraitRotation; 2120d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project } 2121d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project // case for nosensor meaning ignore sensor and consider only lid 2122d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project // or orientation sensor disabled 2123d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project //or case.unspecified 2124d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project if (mLidOpen) { 2125e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood return mLidOpenRotation; 2126b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn } else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR && mCarDockRotation >= 0) { 2127e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood return mCarDockRotation; 2128b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn } else if (mDockMode == Intent.EXTRA_DOCK_STATE_DESK && mDeskDockRotation >= 0) { 2129e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood return mDeskDockRotation; 2130d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project } else { 213180c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn if (useSensorForOrientationLp(orientation)) { 2132d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project // If the user has enabled auto rotation by default, do it. 213380c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn int curRotation = mOrientationListener.getCurrentRotation(); 213480c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn return curRotation >= 0 ? curRotation : lastRotation; 2135d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project } 2136c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return Surface.ROTATION_0; 2137c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2138c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2139c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2140c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2141c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public boolean detectSafeMode() { 2142c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project try { 2143c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int menuState = mWindowManager.getKeycodeState(KeyEvent.KEYCODE_MENU); 2144086d88503e589f14560209000724fe5215a10937Dianne Hackborn int sState = mWindowManager.getKeycodeState(KeyEvent.KEYCODE_S); 2145bbacc28ff4ea2892ae4c0a0d9a639a960a4dd93aDianne Hackborn int dpadState = mWindowManager.getDPadKeycodeState(KeyEvent.KEYCODE_DPAD_CENTER); 2146bbacc28ff4ea2892ae4c0a0d9a639a960a4dd93aDianne Hackborn int trackballState = mWindowManager.getTrackballScancodeState(RawInputEvent.BTN_MOUSE); 2147086d88503e589f14560209000724fe5215a10937Dianne Hackborn mSafeMode = menuState > 0 || sState > 0 || dpadState > 0 || trackballState > 0; 2148086d88503e589f14560209000724fe5215a10937Dianne Hackborn performHapticFeedbackLw(null, mSafeMode 2149086d88503e589f14560209000724fe5215a10937Dianne Hackborn ? HapticFeedbackConstants.SAFE_MODE_ENABLED 2150086d88503e589f14560209000724fe5215a10937Dianne Hackborn : HapticFeedbackConstants.SAFE_MODE_DISABLED, true); 2151a95e1cd1f846a949663e33e5a93f689702415b5aDianne Hackborn if (mSafeMode) { 2152a95e1cd1f846a949663e33e5a93f689702415b5aDianne Hackborn Log.i(TAG, "SAFE MODE ENABLED (menu=" + menuState + " s=" + sState 2153a95e1cd1f846a949663e33e5a93f689702415b5aDianne Hackborn + " dpad=" + dpadState + " trackball=" + trackballState + ")"); 2154a95e1cd1f846a949663e33e5a93f689702415b5aDianne Hackborn } else { 2155a95e1cd1f846a949663e33e5a93f689702415b5aDianne Hackborn Log.i(TAG, "SAFE MODE not enabled"); 2156a95e1cd1f846a949663e33e5a93f689702415b5aDianne Hackborn } 2157c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return mSafeMode; 2158c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (RemoteException e) { 2159c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Doom! (it's also local) 2160c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project throw new RuntimeException("window manager dead"); 2161c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2162c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2163c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2164397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn static long[] getLongIntArray(Resources r, int resid) { 2165397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn int[] ar = r.getIntArray(resid); 2166397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn if (ar == null) { 2167397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn return null; 2168397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn } 2169397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn long[] out = new long[ar.length]; 2170397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn for (int i=0; i<ar.length; i++) { 2171397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn out[i] = ar[i]; 2172397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn } 2173397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn return out; 2174397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn } 2175397f18b642426c5d4d86d188fb3c9d0eef034306Dianne Hackborn 2176c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 2177c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void systemReady() { 2178086d88503e589f14560209000724fe5215a10937Dianne Hackborn // tell the keyguard 2179086d88503e589f14560209000724fe5215a10937Dianne Hackborn mKeyguardMediator.onSystemReady(); 2180086d88503e589f14560209000724fe5215a10937Dianne Hackborn android.os.SystemProperties.set("dev.bootcomplete", "1"); 2181086d88503e589f14560209000724fe5215a10937Dianne Hackborn synchronized (mLock) { 2182086d88503e589f14560209000724fe5215a10937Dianne Hackborn updateOrientationListenerLp(); 2183a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mSystemReady = true; 2184a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn mHandler.post(new Runnable() { 2185a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn public void run() { 2186a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn updateSettings(); 2187a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn } 2188a64ca83920cff19903087e5fca06a16a635ad635Dianne Hackborn }); 2189c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2190c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2191c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2192faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood /** {@inheritDoc} */ 2193faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood public void userActivity() { 2194faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood synchronized (mScreenLockTimeout) { 2195faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood if (mLockScreenTimerActive) { 2196faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood // reset the timer 2197faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood mHandler.removeCallbacks(mScreenLockTimeout); 2198faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout); 2199faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood } 2200faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood } 2201faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood } 2202faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood 2203faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood Runnable mScreenLockTimeout = new Runnable() { 2204faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood public void run() { 2205faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood synchronized (this) { 2206faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood if (localLOGV) Log.v(TAG, "mScreenLockTimeout activating keyguard"); 2207faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood mKeyguardMediator.doKeyguardTimeout(); 2208faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood mLockScreenTimerActive = false; 2209faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood } 2210faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood } 2211faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood }; 2212faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood 2213faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood private void updateLockScreenTimeout() { 2214faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood synchronized (mScreenLockTimeout) { 2215faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood boolean enable = (mAllowLockscreenWhenOn && mScreenOn && mKeyguardMediator.isSecure()); 2216faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood if (mLockScreenTimerActive != enable) { 2217faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood if (enable) { 2218faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood if (localLOGV) Log.v(TAG, "setting lockscreen timer"); 2219faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout); 2220faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood } else { 2221faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood if (localLOGV) Log.v(TAG, "clearing lockscreen timer"); 2222faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood mHandler.removeCallbacks(mScreenLockTimeout); 2223faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood } 2224faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood mLockScreenTimerActive = enable; 2225faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood } 2226faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood } 2227faeb50a924e219df689c16c57bb1b5ff1a095d62Mike Lockwood } 2228c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2229c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** {@inheritDoc} */ 2230c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project public void enableScreenAfterBoot() { 2231c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project readLidState(); 2232a985dd81d649d677e7d943a2d345a859cb1985b5Dianne Hackborn updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE); 2233c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2234655ec0dc07e1978879336ac7adbf638a7f8fc85eDianne Hackborn 223580c8dc5f5c15c6dd38b4e97291a51cf9921e2e29Dianne Hackborn void updateRotation(int animFlags) { 2236c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mPowerManager.setKeyboardVisibility(mLidOpen); 2237e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood int rotation = Surface.ROTATION_0; 2238c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (mLidOpen) { 2239e0905994fb3e66007582ca86a868a0ea2b6327efMike Lockwood rotation = mLidOpenRotation; 2240b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn } else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR && mCarDockRotation >= 0) { 2241e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood rotation = mCarDockRotation; 2242b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn } else if (mDockMode == Intent.EXTRA_DOCK_STATE_DESK && mDeskDockRotation >= 0) { 2243e39a8dbd6b0c4249d9ecbf35f9999d1e4764457cMike Lockwood rotation = mDeskDockRotation; 2244c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2245c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project //if lid is closed orientation will be portrait 2246c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project try { 2247c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project //set orientation on WindowManager 2248a985dd81d649d677e7d943a2d345a859cb1985b5Dianne Hackborn mWindowManager.setRotation(rotation, true, 2249a985dd81d649d677e7d943a2d345a859cb1985b5Dianne Hackborn mFancyRotationAnimation | animFlags); 2250c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (RemoteException e) { 2251c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // Ignore 2252c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2253c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2254c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2255c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project /** 22566b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn * Return an Intent to launch the currently active dock as home. Returns 22576b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn * null if the standard home should be launched. 22586b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn * @return 22596b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn */ 22606b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn Intent createHomeDockIntent() { 22616b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn Intent intent; 2262b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn 2263b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn // What home does is based on the mode, not the dock state. That 2264b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn // is, when in car mode you should be taken to car home regardless 2265b0d3a2371f92d19d01aa2ca8e4f382738273f2ddDianne Hackborn // of whether we are actually in a car dock. 22667771ef05bca4482bd428028278e0f153dcd5fd43Dianne Hackborn if (mUiMode == Configuration.UI_MODE_TYPE_CAR) { 22676b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn intent = mCarDockIntent; 22687771ef05bca4482bd428028278e0f153dcd5fd43Dianne Hackborn } else if (mUiMode == Configuration.UI_MODE_TYPE_DESK) { 22696b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn intent = mDeskDockIntent; 22706b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } else { 22716b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn return null; 22726b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 22736b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn 22746b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn ActivityInfo ai = intent.resolveActivityInfo( 22756b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn mContext.getPackageManager(), PackageManager.GET_META_DATA); 22766b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn if (ai == null) { 22776b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn return null; 22786b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 22796b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn 22806b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn if (ai.metaData != null && ai.metaData.getBoolean(Intent.METADATA_DOCK_HOME)) { 22816b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn intent = new Intent(intent); 22826b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn intent.setClassName(ai.packageName, ai.name); 22836b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn return intent; 22846b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 22856b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn 22866b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn return null; 22876b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 22886b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn 22896b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn void startDockOrHome() { 22906b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn Intent dock = createHomeDockIntent(); 22916b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn if (dock != null) { 22926b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn try { 22936b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn mContext.startActivity(dock); 22946b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn return; 22956b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } catch (ActivityNotFoundException e) { 22966b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 22976b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 22986b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn mContext.startActivity(mHomeIntent); 22996b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 23006b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn 23016b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn /** 2302c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * goes to the home screen 2303c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * @return whether it did anything 2304c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */ 2305c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project boolean goHome() { 2306c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (false) { 2307c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // This code always brings home to the front. 2308a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn try { 2309a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn ActivityManagerNative.getDefault().stopAppSwitches(); 2310a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn } catch (RemoteException e) { 2311a56b1c78713257bc0e138ddf73f7c72e917e7d0dDianne Hackborn } 23121dc1ccaf5c8cc136b71537f310a3f13150aaef41Dianne Hackborn sendCloseSystemWindows(); 23136b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn startDockOrHome(); 2314c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } else { 2315c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // This code brings home to the front or, if it is already 2316c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // at the front, puts the device to sleep. 2317c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project try { 2318f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville if (SystemProperties.getInt("persist.sys.uts-test-mode", 0) == 1) { 2319f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville /// Roll back EndcallBehavior as the cupcake design to pass P1 lab entry. 2320f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville Log.d(TAG, "UTS-TEST-MODE"); 2321f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville } else { 2322f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville ActivityManagerNative.getDefault().stopAppSwitches(); 2323f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville sendCloseSystemWindows(); 2324f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville Intent dock = createHomeDockIntent(); 2325f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville if (dock != null) { 2326f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville int result = ActivityManagerNative.getDefault() 2327f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville .startActivity(null, dock, 2328f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville dock.resolveTypeIfNeeded(mContext.getContentResolver()), 2329f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville null, 0, null, null, 0, true /* onlyIfNeeded*/, false); 2330f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville if (result == IActivityManager.START_RETURN_INTENT_TO_CALLER) { 2331f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville return false; 2332f010b5d26f1e1c93b93576995e76ffd63db2f96eWink Saville } 23336b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 23346b2309f8dfeac86b825a688d48b20e12782fe135Dianne Hackborn } 2335c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project int result = ActivityManagerNative.getDefault() 2336c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project .startActivity(null, mHomeIntent, 2337c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mHomeIntent.resolveTypeIfNeeded(mContext.getContentResolver()), 2338c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project null, 0, null, null, 0, true /* onlyIfNeeded*/, false); 2339c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project if (result == IActivityManager.START_RETURN_INTENT_TO_CALLER) { 2340c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 2341c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2342c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } catch (RemoteException ex) { 2343c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project // bummer, the activity manager, which is in this process, is dead 2344c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2345c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2346c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return true; 2347c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2348c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2349d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project public void setCurrentOrientationLw(int newOrientation) { 2350d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project synchronized (mLock) { 2351d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project if (newOrientation != mCurrentAppOrientation) { 2352d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project mCurrentAppOrientation = newOrientation; 2353d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project updateOrientationListenerLp(); 2354d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project } 2355c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2356c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 235791971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani 2358d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project public boolean performHapticFeedbackLw(WindowState win, int effectId, boolean always) { 23593179826b1694e89ab48a487a41cf20a8d84b7822Jim Miller final boolean hapticsDisabled = Settings.System.getInt(mContext.getContentResolver(), 23603179826b1694e89ab48a487a41cf20a8d84b7822Jim Miller Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 0; 2361eb8e950ea446ce6a1b83c565718217d944dd3557Dianne Hackborn if (!always && (hapticsDisabled || mKeyguardMediator.isShowingAndNotHidden())) { 2362c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project return false; 2363c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 236491971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani long[] pattern = null; 2365c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project switch (effectId) { 2366c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project case HapticFeedbackConstants.LONG_PRESS: 236791971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani pattern = mLongPressVibePattern; 236891971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani break; 2369086d88503e589f14560209000724fe5215a10937Dianne Hackborn case HapticFeedbackConstants.VIRTUAL_KEY: 237091971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani pattern = mVirtualKeyVibePattern; 237191971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani break; 237291971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani case HapticFeedbackConstants.KEYBOARD_TAP: 237391971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani pattern = mKeyboardTapVibePattern; 237491971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani break; 2375086d88503e589f14560209000724fe5215a10937Dianne Hackborn case HapticFeedbackConstants.SAFE_MODE_DISABLED: 237691971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani pattern = mSafeModeDisabledVibePattern; 237791971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani break; 2378086d88503e589f14560209000724fe5215a10937Dianne Hackborn case HapticFeedbackConstants.SAFE_MODE_ENABLED: 237991971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani pattern = mSafeModeEnabledVibePattern; 238091971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani break; 238191971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani default: 238291971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani return false; 2383c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 238491971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani if (pattern.length == 1) { 238591971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani // One-shot vibration 238691971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani mVibrator.vibrate(pattern[0]); 238791971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani } else { 238891971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani // Pattern vibration 238991971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani mVibrator.vibrate(pattern, -1); 239091971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani } 239191971c370fc87252bcf35d1d9f57c56e7c2360a7Amith Yamasani return true; 2392c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2393c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project 2394a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn public void keyFeedbackFromInput(KeyEvent event) { 2395a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn if (event.getAction() == KeyEvent.ACTION_DOWN 2396a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn && (event.getFlags()&KeyEvent.FLAG_VIRTUAL_HARD_KEY) != 0) { 2397086d88503e589f14560209000724fe5215a10937Dianne Hackborn performHapticFeedbackLw(null, HapticFeedbackConstants.VIRTUAL_KEY, false); 2398a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn } 2399a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn } 2400a6f43a471ffda3d4ae8b82f01a600e952e4c3500Dianne Hackborn 2401d915f3ac2fca2287f73f1e8d633275f6bdbafdb7The Android Open Source Project public void screenOnStoppedLw() { 2402eb8e950ea446ce6a1b83c565718217d944dd3557Dianne Hackborn if (!mKeyguardMediator.isShowingAndNotHidden() && mPowerManager.isScreenOn()) { 2403c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project long curTime = SystemClock.uptimeMillis(); 2404c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project mPowerManager.userActivity(curTime, false, LocalPowerManager.OTHER_EVENT); 2405c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2406c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project } 2407d6adf0ae620ca3b64eee38cd53aaeedb7bd98457Mike Lockwood 2408d6adf0ae620ca3b64eee38cd53aaeedb7bd98457Mike Lockwood public boolean allowKeyRepeat() { 2409d6adf0ae620ca3b64eee38cd53aaeedb7bd98457Mike Lockwood // disable key repeat when screen is off 2410d6adf0ae620ca3b64eee38cd53aaeedb7bd98457Mike Lockwood return mScreenOn; 2411d6adf0ae620ca3b64eee38cd53aaeedb7bd98457Mike Lockwood } 2412c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project} 2413