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