1808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato/*
2808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato * Copyright (C) 2010 The Android Open Source Project
3808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato *
4808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
5808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato * you may not use this file except in compliance with the License.
6808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato * You may obtain a copy of the License at
7808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato *
8808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
9808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato *
10808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato * Unless required by applicable law or agreed to in writing, software
11808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
12808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato * See the License for the specific language governing permissions and
14808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato * limitations under the License.
15808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato */
16808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
17fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratopackage com.android.systemui.statusbar.phone;
18808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
19d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandlerimport android.animation.Animator;
20d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandlerimport android.animation.AnimatorListenerAdapter;
21d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandlerimport android.animation.AnimatorSet;
220761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandlerimport android.animation.ObjectAnimator;
23101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandlerimport android.animation.TimeInterpolator;
24fc8fa638617efb5695a1f89ea75375faebbe2a40Dianne Hackbornimport android.app.ActivityManager;
25808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.app.ActivityManagerNative;
26808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.app.Notification;
27808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.app.PendingIntent;
28808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.app.StatusBarManager;
29808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.content.BroadcastReceiver;
30808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.content.Context;
31808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.content.Intent;
32808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.content.IntentFilter;
33b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandlerimport android.content.SharedPreferences;
347f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurkaimport android.content.res.Resources;
35919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlockimport android.database.ContentObserver;
36648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guyimport android.graphics.Canvas;
37648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guyimport android.graphics.ColorFilter;
38808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.graphics.PixelFormat;
39e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandlerimport android.graphics.Point;
40648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guyimport android.graphics.PorterDuff;
41808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.graphics.Rect;
42648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guyimport android.graphics.drawable.Drawable;
437f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurkaimport android.inputmethodservice.InputMethodService;
44919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlockimport android.os.Handler;
45808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.os.IBinder;
46808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.os.Message;
477f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurkaimport android.os.RemoteException;
481d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandlerimport android.os.ServiceManager;
49808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.os.SystemClock;
50f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
51d309056d36759446c91ff5c1e17a217bfa4fdcfbDaniel Sandlerimport android.provider.Settings;
52be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.service.dreams.DreamService;
53a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandlerimport android.service.dreams.IDreamManager;
5436412a7e7c4929bdac1221b7ced9e73d0d204691Daniel Sandlerimport android.util.DisplayMetrics;
55808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.util.Log;
567f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurkaimport android.util.Slog;
57808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.Display;
58808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.Gravity;
59808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.MotionEvent;
60808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.VelocityTracker;
61808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.View;
62808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.ViewGroup;
63f2a16b27afd1ede5880d05eb9e19090c7e3e820eJim Millerimport android.view.ViewGroup.LayoutParams;
64101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandlerimport android.view.ViewPropertyAnimator;
65b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandlerimport android.view.ViewStub;
66808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.WindowManager;
67d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandlerimport android.view.animation.AccelerateInterpolator;
68808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.animation.Animation;
69808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.animation.AnimationUtils;
7067e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandlerimport android.view.animation.DecelerateInterpolator;
7121b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandlerimport android.widget.FrameLayout;
72808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.widget.ImageView;
73808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.widget.LinearLayout;
74808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.widget.ScrollView;
75808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.widget.TextView;
76a600fd9ba76e7916f18521447446671f0e431560Michael Jurka
77808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport com.android.internal.statusbar.StatusBarIcon;
78808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport com.android.internal.statusbar.StatusBarNotification;
79808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport com.android.systemui.R;
80c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandlerimport com.android.systemui.statusbar.BaseStatusBar;
81a600fd9ba76e7916f18521447446671f0e431560Michael Jurkaimport com.android.systemui.statusbar.CommandQueue;
823380534a62abf20b4509db6068ac02b1b880712fDaniel Sandlerimport com.android.systemui.statusbar.GestureRecorder;
837f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurkaimport com.android.systemui.statusbar.NotificationData;
8458b173b1ca10bfb8bd8f7fac676f51178e57ff83Daniel Sandlerimport com.android.systemui.statusbar.NotificationData.Entry;
852e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport com.android.systemui.statusbar.SignalClusterView;
867f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurkaimport com.android.systemui.statusbar.StatusBarIconView;
872b69735e014872ca2183b4a39a8381daa337e146Daniel Sandlerimport com.android.systemui.statusbar.policy.BatteryController;
88d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport com.android.systemui.statusbar.policy.BluetoothController;
897f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurkaimport com.android.systemui.statusbar.policy.DateView;
906a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandlerimport com.android.systemui.statusbar.policy.IntruderAlertView;
912b69735e014872ca2183b4a39a8381daa337e146Daniel Sandlerimport com.android.systemui.statusbar.policy.LocationController;
922b69735e014872ca2183b4a39a8381daa337e146Daniel Sandlerimport com.android.systemui.statusbar.policy.NetworkController;
938ba33c965f940070060585e45e1c833519bb45c9Daniel Sandlerimport com.android.systemui.statusbar.policy.NotificationRowLayout;
94a600fd9ba76e7916f18521447446671f0e431560Michael Jurkaimport com.android.systemui.statusbar.policy.OnSizeChangedListener;
95b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandlerimport com.android.systemui.statusbar.policy.Prefs;
96808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
976a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandlerimport java.io.FileDescriptor;
986a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandlerimport java.io.PrintWriter;
996a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandlerimport java.util.ArrayList;
1006a858c347f4d4e5db4c8f00d5e285967631b71caDaniel Sandler
101c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandlerpublic class PhoneStatusBar extends BaseStatusBar {
102fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    static final String TAG = "PhoneStatusBar";
103198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final boolean DEBUG = BaseStatusBar.DEBUG;
104c1ebee40b60472553e9678b063b32f4e80b180e8Daniel Sandler    public static final boolean SPEW = DEBUG;
1057579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler    public static final boolean DUMPTRUCK = true; // extra dumpsys info
106151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler    public static final boolean DEBUG_GESTURES = false;
107808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
108b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    public static final boolean DEBUG_CLINGS = false;
109b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
110ace0bd77438c89578ff821a86ff1ae91f8000ed3Daniel Sandler    public static final boolean ENABLE_NOTIFICATION_PANEL_CLING = false;
111ace0bd77438c89578ff821a86ff1ae91f8000ed3Daniel Sandler
112040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    public static final boolean SETTINGS_DRAG_SHORTCUT = true;
113040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler
11496e61c3c86b2aff3d298d8757ba51eb568c30543Daniel Sandler    // additional instrumentation for testing purposes; intended to be left on during development
1157c35174a6f0fd6a01b6d63418bf4355f16b8ae64Daniel Sandler    public static final boolean CHATTY = DEBUG;
11696e61c3c86b2aff3d298d8757ba51eb568c30543Daniel Sandler
117808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public static final String ACTION_STATUSBAR_START
118808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            = "com.android.internal.policy.statusbar.START";
119808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1208ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler    private static final int MSG_OPEN_NOTIFICATION_PANEL = 1000;
12111cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler    private static final int MSG_CLOSE_PANELS = 1001;
12211cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler    private static final int MSG_OPEN_SETTINGS_PANEL = 1002;
1237f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka    // 1020-1030 reserved for BaseStatusBar
124808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
125808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // will likely move to a resource or other tunable param at some point
126fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    private static final int INTRUDER_ALERT_DECAY_MS = 0; // disabled, was 10000;
127808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1288cc36e572876f3bb9197f0109db3042466e5f917Daniel Sandler    private static final boolean CLOSE_PANEL_WHEN_EMPTIED = true;
1298cc36e572876f3bb9197f0109db3042466e5f917Daniel Sandler
13058b173b1ca10bfb8bd8f7fac676f51178e57ff83Daniel Sandler    private static final int NOTIFICATION_PRIORITY_MULTIPLIER = 10; // see NotificationManagerService
13158b173b1ca10bfb8bd8f7fac676f51178e57ff83Daniel Sandler    private static final int HIDE_ICONS_BELOW_SCORE = Notification.PRIORITY_LOW * NOTIFICATION_PRIORITY_MULTIPLIER;
13258b173b1ca10bfb8bd8f7fac676f51178e57ff83Daniel Sandler
133dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler    // fling gesture tuning parameters, scaled to display density
134dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler    private float mSelfExpandVelocityPx; // classic value: 2000px/s
135dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler    private float mSelfCollapseVelocityPx; // classic value: 2000px/s (will be negated to collapse "up")
136dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler    private float mFlingExpandMinVelocityPx; // classic value: 200px/s
137dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler    private float mFlingCollapseMinVelocityPx; // classic value: 200px/s
138dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler    private float mCollapseMinDisplayFraction; // classic value: 0.08 (25px/min(320px,480px) on G1)
139dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler    private float mExpandMinDisplayFraction; // classic value: 0.5 (drag open halfway to expand)
140dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler    private float mFlingGestureMaxXVelocityPx; // classic value: 150px/s
141dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler
142dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler    private float mExpandAccelPx; // classic value: 2000px/s/s
143dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler    private float mCollapseAccelPx; // classic value: 2000px/s/s (will be negated to collapse "up")
144dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler
145e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler    private float mFlingGestureMaxOutputVelocityPx; // how fast can it really go? (should be a little
146e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler                                                    // faster than mSelfCollapseVelocityPx)
147e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler
148fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    PhoneStatusBarPolicy mIconPolicy;
149808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1502b69735e014872ca2183b4a39a8381daa337e146Daniel Sandler    // These are no longer handled by the policy, because we need custom strategies for them
151d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    BluetoothController mBluetoothController;
1522b69735e014872ca2183b4a39a8381daa337e146Daniel Sandler    BatteryController mBatteryController;
1532b69735e014872ca2183b4a39a8381daa337e146Daniel Sandler    LocationController mLocationController;
1542b69735e014872ca2183b4a39a8381daa337e146Daniel Sandler    NetworkController mNetworkController;
1555e6af448045f20f7a1b393960d200c25e9d976e8Jim Miller
1567c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler    int mNaturalBarHeight = -1;
1577c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler    int mIconSize = -1;
1587c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler    int mIconHPadding = -1;
159808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    Display mDisplay;
160e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler    Point mCurrentDisplaySize = new Point();
161808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
162a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler    IDreamManager mDreamManager;
1631d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler
164c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    StatusBarWindowView mStatusBarWindow;
165fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    PhoneStatusBarView mStatusBarView;
166a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler
167808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    int mPixelFormat;
168808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    Object mQueueLock = new Object();
169808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
170173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler    // viewgroup containing the normal contents of the statusbar
171173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler    LinearLayout mStatusBarContents;
172173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler
173173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler    // right-hand icons
174173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler    LinearLayout mSystemIconArea;
175173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler
176173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler    // left-hand icons
177173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler    LinearLayout mStatusIcons;
178173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler    // the icons themselves
179808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    IconMerger mNotificationIcons;
180173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler    // [+>
18105e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler    View mMoreIcon;
182808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
183808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // expanded notifications
184040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window
185808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    ScrollView mScrollView;
186808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    View mExpandedContents;
18721b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler    int mNotificationPanelGravity;
1888e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    int mNotificationPanelMarginBottomPx, mNotificationPanelMarginPx;
189e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler    float mNotificationPanelMinHeightFrac;
19066d92f81093e648186b31d0416555ec05aff0e0bDaniel Sandler    boolean mNotificationPanelIsFullScreenWidth;
191b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler    TextView mNotificationPanelDebugText;
19221b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler
1938e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    // settings
194101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    QuickSettings mQS;
195101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    boolean mHasSettingsPanel, mHasFlipSettings;
1963ffdcc70c28d7a2abbb4f248d32d70d45d61fd44Daniel Sandler    SettingsPanelView mSettingsPanel;
197101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    View mFlipSettingsView;
198101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    QuickSettingsContainerView mSettingsContainer;
1998e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    int mSettingsPanelGravity;
2008e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler
201808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // top bar
2023679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler    View mNotificationPanelHeader;
2033679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler    View mDateTimeView;
2041347c30824ce3544dff03c93ffad9af7f0327e41Daniel Sandler    View mClearButton;
205101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    ImageView mSettingsButton, mNotificationButton;
206d309056d36759446c91ff5c1e17a217bfa4fdcfbDaniel Sandler
2073d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    // carrier/wifi label
2083d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    private TextView mCarrierLabel;
2093d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    private boolean mCarrierLabelVisible = false;
2103d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    private int mCarrierLabelHeight;
211dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler    private TextView mEmergencyCallLabel;
212bf526d14f3252b8a5c123291e4cd8b1c51346560Daniel Sandler    private int mNotificationHeaderHeight;
213bf526d14f3252b8a5c123291e4cd8b1c51346560Daniel Sandler
214bf526d14f3252b8a5c123291e4cd8b1c51346560Daniel Sandler    private boolean mShowCarrierInPanel = false;
2153d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler
216808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // position
217808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    int[] mPositionTmp = new int[2];
218808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    boolean mExpandedVisible;
219808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
220808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // the date view
221808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    DateView mDateView;
222808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
223808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // for immersive activities
224fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    private IntruderAlertView mIntruderAlertView;
225808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2268956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler    // on-screen navigation buttons
2270129b31ff493bb0aa10b778cbeacbec5964644f8Daniel Sandler    private NavigationBarView mNavigationBarView = null;
2288956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler
229808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // the tracker view
230808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    int mTrackingPosition; // the position of the top of the tracking view.
231808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
232808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // ticker
233808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    private Ticker mTicker;
234808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    private View mTickerView;
235808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    private boolean mTicking;
236808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
237808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // Tracking finger for opening/closing.
238808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    int mEdgeBorder; // corresponds to R.dimen.status_bar_edge_ignore
239808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    boolean mTracking;
240808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    VelocityTracker mVelocityTracker;
241808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
242b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    // help screen
243b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    private boolean mClingShown;
244b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    private ViewGroup mCling;
245b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    private boolean mSuppressStatusBarDrags; // while a cling is up, briefly deaden the bar to give things time to settle
246b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
247808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    boolean mAnimating;
248fbab8ae9d562ee7ebe22ec6bcf3aa03d4db106fbDaniel Sandler    boolean mClosing; // only valid when mAnimating; indicates the initial acceleration
249808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    float mAnimY;
250808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    float mAnimVel;
251808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    float mAnimAccel;
252ed5f45ab8f26740f7f12c2ac7b46ad908f3e9ee5Jeff Brown    long mAnimLastTimeNanos;
253808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    boolean mAnimatingReveal = false;
254808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    int mViewDelta;
255804df70112204a492730a5632e4524fddf0e4f48John Spurlock    float mFlingVelocity;
256804df70112204a492730a5632e4524fddf0e4f48John Spurlock    int mFlingY;
257808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    int[] mAbsPos = new int[2];
2582f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    Runnable mPostCollapseCleanup = null;
2592f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
260173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler    private Animator mLightsOutAnimation;
261173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler    private Animator mLightsOnAnimation;
262808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
263808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // for disabling the status bar
264808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    int mDisabled = 0;
265808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
26660ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler    // tracking calls to View.setSystemUiVisibility()
26760ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler    int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
26860ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler
26936412a7e7c4929bdac1221b7ced9e73d0d204691Daniel Sandler    DisplayMetrics mDisplayMetrics = new DisplayMetrics();
2701dacf2772d0099ae74f42f81d162a3d0e180ffb7Dianne Hackborn
2713380534a62abf20b4509db6068ac02b1b880712fDaniel Sandler    // XXX: gesture research
272151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler    private final GestureRecorder mGestureRec = DEBUG_GESTURES
273151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        ? new GestureRecorder("/sdcard/statusbar_gestures.dat")
274151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        : null;
2753380534a62abf20b4509db6068ac02b1b880712fDaniel Sandler
276328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler    private int mNavigationIconHints = 0;
277f7f16f7f3fec4e422b6382a3caead9eeb0c22a1eRomain Guy    private final Animator.AnimatorListener mMakeIconsInvisible = new AnimatorListenerAdapter() {
278f7f16f7f3fec4e422b6382a3caead9eeb0c22a1eRomain Guy        @Override
279f7f16f7f3fec4e422b6382a3caead9eeb0c22a1eRomain Guy        public void onAnimationEnd(Animator animation) {
28067e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler            // double-check to avoid races
281173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler            if (mStatusBarContents.getAlpha() == 0) {
2827ff30113de68539ec840c524b8f1561f938f96c5Dianne Hackborn                if (DEBUG) Slog.d(TAG, "makeIconsInvisible");
283173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                mStatusBarContents.setVisibility(View.INVISIBLE);
28467e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler            }
285f7f16f7f3fec4e422b6382a3caead9eeb0c22a1eRomain Guy        }
286f7f16f7f3fec4e422b6382a3caead9eeb0c22a1eRomain Guy    };
287328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler
288919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock    // ensure quick settings is disabled until the current user makes it through the setup wizard
289919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock    private boolean mUserSetup = false;
290919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock    private ContentObserver mUserSetupObserver = new ContentObserver(new Handler()) {
291919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock        @Override
292919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock        public void onChange(boolean selfChange) {
293919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock            final boolean userSetup = 0 != Settings.Secure.getIntForUser(
294919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                    mContext.getContentResolver(),
295919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                    Settings.Secure.USER_SETUP_COMPLETE,
296919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                    0 /*default */,
297919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                    mCurrentUserId);
298e4e8c5619c3951e5af79648f82f1dc9bbb1104d2John Spurlock            if (MULTIUSER_DEBUG) Slog.d(TAG, String.format("User setup changed: " +
299e4e8c5619c3951e5af79648f82f1dc9bbb1104d2John Spurlock                    "selfChange=%s userSetup=%s mUserSetup=%s",
300e4e8c5619c3951e5af79648f82f1dc9bbb1104d2John Spurlock                    selfChange, userSetup, mUserSetup));
30191ffeddb8b6ceec9a18ae34f88bd56560335de7fDaniel Sandler            if (mSettingsButton != null && !mHasSettingsPanel) {
302101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                mSettingsButton.setVisibility(userSetup ? View.VISIBLE : View.INVISIBLE);
303101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            }
304101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            if (mSettingsPanel != null) {
305e4e8c5619c3951e5af79648f82f1dc9bbb1104d2John Spurlock                mSettingsPanel.setEnabled(userSetup);
306101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            }
307919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock            if (userSetup != mUserSetup) {
308919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                mUserSetup = userSetup;
309919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                if (!mUserSetup && mStatusBarView != null)
310919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                    animateCollapseQuickSettings();
311919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock            }
312919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock        }
313919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock    };
314919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock
315808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    @Override
316f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    public void start() {
317f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
318f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato                .getDefaultDisplay();
319808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
320a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler        mDreamManager = IDreamManager.Stub.asInterface(
321be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn                ServiceManager.checkService(DreamService.DREAM_SERVICE));
322a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler
323c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        super.start(); // calls createAndAddWindows()
324808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
3258956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler        addNavigationBar();
3268956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler
327fc6fda3950338ce737f096548a079342317cfd7fDaniel Sandler        if (ENABLE_INTRUDERS) addIntruderView();
328808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
329808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        // Lastly, call to the icon policy to install/update all the icons.
330fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mIconPolicy = new PhoneStatusBarPolicy(mContext);
331808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
332808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
333808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // ================================================================================
334808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // Constructing the view
335808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // ================================================================================
336e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    protected PhoneStatusBarView makeStatusBarView() {
337f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        final Context context = mContext;
338808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
339808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        Resources res = context.getResources();
340808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
3416e8db88b4b31a6e0211561f25ee1a422e4797ba1Daniel Sandler        updateDisplaySize(); // populates mDisplayMetrics
3427c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        loadDimens();
343808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
3441dacf2772d0099ae74f42f81d162a3d0e180ffb7Dianne Hackborn        mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size);
3451dacf2772d0099ae74f42f81d162a3d0e180ffb7Dianne Hackborn
346c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        mStatusBarWindow = (StatusBarWindowView) View.inflate(context,
347a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler                R.layout.super_status_bar, null);
348c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        mStatusBarWindow.mService = this;
34921b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler        mStatusBarWindow.setOnTouchListener(new View.OnTouchListener() {
35021b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler            @Override
35121b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler            public boolean onTouch(View v, MotionEvent event) {
35221b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler                if (event.getAction() == MotionEvent.ACTION_DOWN) {
353e7237fceb1cd17af006815c4338fe8e4a7971ff7Daniel Sandler                    if (mExpandedVisible && !mAnimating) {
35411cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                        animateCollapsePanels();
35521b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler                    }
35621b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler                }
3575de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren                return mStatusBarWindow.onTouchEvent(event);
35821b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler            }});
35921b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler
360a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        mStatusBarView = (PhoneStatusBarView) mStatusBarWindow.findViewById(R.id.status_bar);
36108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mStatusBarView.setBar(this);
362efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
36308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
36408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        PanelHolder holder = (PanelHolder) mStatusBarWindow.findViewById(R.id.panel_holder);
36508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mStatusBarView.setPanelHolder(holder);
36608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
367040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mNotificationPanel = (NotificationPanelView) mStatusBarWindow.findViewById(R.id.notification_panel);
368040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mNotificationPanel.setStatusBar(this);
36966d92f81093e648186b31d0416555ec05aff0e0bDaniel Sandler        mNotificationPanelIsFullScreenWidth =
37066d92f81093e648186b31d0416555ec05aff0e0bDaniel Sandler            (mNotificationPanel.getLayoutParams().width == ViewGroup.LayoutParams.MATCH_PARENT);
371808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
372efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        // make the header non-responsive to clicks
373efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        mNotificationPanel.findViewById(R.id.header).setOnTouchListener(
374efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                new View.OnTouchListener() {
375efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                    @Override
376efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                    public boolean onTouch(View v, MotionEvent event) {
377efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                        return true; // e eats everything
378efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                    }
379efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                });
380efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
38198365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (!ActivityManager.isHighEndGfx()) {
382328b35827e6ce7eba844e338e59427c8cae7b681Romain Guy            mStatusBarWindow.setBackground(null);
383648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy            mNotificationPanel.setBackground(new FastColorDrawable(context.getResources().getColor(
384648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy                    R.color.notification_panel_solid_background)));
385328b35827e6ce7eba844e338e59427c8cae7b681Romain Guy        }
3866b31880838196806dff991551f197684b5809d8bDaniel Sandler        if (ENABLE_INTRUDERS) {
3876b31880838196806dff991551f197684b5809d8bDaniel Sandler            mIntruderAlertView = (IntruderAlertView) View.inflate(context, R.layout.intruder_alert, null);
3886b31880838196806dff991551f197684b5809d8bDaniel Sandler            mIntruderAlertView.setVisibility(View.GONE);
3896b31880838196806dff991551f197684b5809d8bDaniel Sandler            mIntruderAlertView.setBar(this);
3906b31880838196806dff991551f197684b5809d8bDaniel Sandler        }
391b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler        if (MULTIUSER_DEBUG) {
392b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler            mNotificationPanelDebugText = (TextView) mNotificationPanel.findViewById(R.id.header_debug_info);
393b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler            mNotificationPanelDebugText.setVisibility(View.VISIBLE);
394b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler        }
395808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
396d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock        updateShowSearchHoldoff();
397d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock
3980129b31ff493bb0aa10b778cbeacbec5964644f8Daniel Sandler        try {
39998365d7663cbd82979a5700faf0050220b01084dJeff Brown            boolean showNav = mWindowManagerService.hasNavigationBar();
4004a066c5c77109431f50806fc29179d28f1472871Daniel Sandler            if (DEBUG) Slog.v(TAG, "hasNavigationBar=" + showNav);
4010129b31ff493bb0aa10b778cbeacbec5964644f8Daniel Sandler            if (showNav) {
4025e6af448045f20f7a1b393960d200c25e9d976e8Jim Miller                mNavigationBarView =
4030129b31ff493bb0aa10b778cbeacbec5964644f8Daniel Sandler                    (NavigationBarView) View.inflate(context, R.layout.navigation_bar, null);
40460ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler
4056da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler                mNavigationBarView.setDisabledFlags(mDisabled);
406e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                mNavigationBarView.setBar(this);
4070129b31ff493bb0aa10b778cbeacbec5964644f8Daniel Sandler            }
4080c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler        } catch (RemoteException ex) {
4090c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler            // no window manager? good luck with that
4100129b31ff493bb0aa10b778cbeacbec5964644f8Daniel Sandler        }
4118956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler
412808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        // figure out which pixel-format to use for the status bar.
413f733c2aaa652f3ead60c8b2bc982dc9bdbc7df8eDaniel Sandler        mPixelFormat = PixelFormat.OPAQUE;
414173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler
415173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler        mSystemIconArea = (LinearLayout) mStatusBarView.findViewById(R.id.system_icon_area);
416a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        mStatusIcons = (LinearLayout)mStatusBarView.findViewById(R.id.statusIcons);
417a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        mNotificationIcons = (IconMerger)mStatusBarView.findViewById(R.id.notificationIcons);
41805e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        mNotificationIcons.setOverflowIndicator(mMoreIcon);
419173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler        mStatusBarContents = (LinearLayout)mStatusBarView.findViewById(R.id.status_bar_contents);
420a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        mTickerView = mStatusBarView.findViewById(R.id.ticker);
421808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
422a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        mPile = (NotificationRowLayout)mStatusBarWindow.findViewById(R.id.latestItems);
423e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        mPile.setLayoutTransitionsEnabled(false);
424f7a1956b06faeb6025fdea331f81d66edda58b3cDaniel Sandler        mPile.setLongPressListener(getNotificationLongClicker());
4250761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler        mExpandedContents = mPile; // was: expanded.findViewById(R.id.notificationLinearLayout);
426d714148bd2752c63a46f51b12cea288fb1f10528Daniel Sandler
4273679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        mNotificationPanelHeader = mStatusBarWindow.findViewById(R.id.header);
4283679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler
429a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        mClearButton = mStatusBarWindow.findViewById(R.id.clear_all_button);
430808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mClearButton.setOnClickListener(mClearButtonListener);
4310761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler        mClearButton.setAlpha(0f);
4328900e631940fdffe7b941b56dc0f17e55345441eRomain Guy        mClearButton.setVisibility(View.INVISIBLE);
4338ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler        mClearButton.setEnabled(false);
434a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        mDateView = (DateView)mStatusBarWindow.findViewById(R.id.date);
435e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler
436e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler        mHasSettingsPanel = res.getBoolean(R.bool.config_hasSettingsPanel);
437101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        mHasFlipSettings = res.getBoolean(R.bool.config_hasFlipSettingsPanel);
438e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler
4393679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        mDateTimeView = mNotificationPanelHeader.findViewById(R.id.datetime);
4403679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        if (mHasFlipSettings) {
4413679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler            mDateTimeView.setOnClickListener(mClockClickListener);
4423679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler            mDateTimeView.setEnabled(true);
4433679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        }
4443679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler
445e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler        mSettingsButton = (ImageView) mStatusBarWindow.findViewById(R.id.settings_button);
4466e5fe432f38f6ba8734a2b242f74c4df805223f9Daniel Sandler        if (mSettingsButton != null) {
447e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            mSettingsButton.setOnClickListener(mSettingsButtonListener);
448e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            if (mHasSettingsPanel) {
449e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                if (mStatusBarView.hasFullWidthNotifications()) {
450e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                    // the settings panel is hiding behind this button
451e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                    mSettingsButton.setImageResource(R.drawable.ic_notify_quicksettings);
452e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                    mSettingsButton.setVisibility(View.VISIBLE);
453e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                } else {
454e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                    // there is a settings panel, but it's on the other side of the (large) screen
4557382a025a73064164ab81a7800cebcec3677af25Daniel Sandler                    final View buttonHolder = mStatusBarWindow.findViewById(
4567382a025a73064164ab81a7800cebcec3677af25Daniel Sandler                            R.id.settings_button_holder);
4577382a025a73064164ab81a7800cebcec3677af25Daniel Sandler                    if (buttonHolder != null) {
4587382a025a73064164ab81a7800cebcec3677af25Daniel Sandler                        buttonHolder.setVisibility(View.GONE);
4597382a025a73064164ab81a7800cebcec3677af25Daniel Sandler                    }
460e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                }
461efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            } else {
462e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                // no settings panel, go straight to settings
463e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                mSettingsButton.setVisibility(View.VISIBLE);
464e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                mSettingsButton.setImageResource(R.drawable.ic_notify_settings);
465efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            }
4666e5fe432f38f6ba8734a2b242f74c4df805223f9Daniel Sandler        }
467101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        if (mHasFlipSettings) {
468101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            mNotificationButton = (ImageView) mStatusBarWindow.findViewById(R.id.notification_button);
469101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            if (mNotificationButton != null) {
470101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                mNotificationButton.setOnClickListener(mNotificationButtonListener);
471101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            }
472101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        }
473101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
474a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        mScrollView = (ScrollView)mStatusBarWindow.findViewById(R.id.scroll);
475079b33d215a49bc38b488489b0cc13d7273cdc66Daniel Sandler        mScrollView.setVerticalScrollBarEnabled(false); // less drawing during pulldowns
4763679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        if (!mNotificationPanelIsFullScreenWidth) {
4773679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler            mScrollView.setSystemUiVisibility(
4783679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER |
4793679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    View.STATUS_BAR_DISABLE_NOTIFICATION_ICONS |
4803679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    View.STATUS_BAR_DISABLE_CLOCK);
4813679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        }
482808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
483a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        mTicker = new MyTicker(context, mStatusBarView);
484808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
485a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        TickerView tickerView = (TickerView)mStatusBarView.findViewById(R.id.tickerText);
486808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        tickerView.mTicker = mTicker;
487808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
488808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore);
489808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
490808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        // set the inital view visibility
491808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        setAreThereNotifications();
492808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
4932b69735e014872ca2183b4a39a8381daa337e146Daniel Sandler        // Other icons
4942b69735e014872ca2183b4a39a8381daa337e146Daniel Sandler        mLocationController = new LocationController(mContext); // will post a notification
4952b69735e014872ca2183b4a39a8381daa337e146Daniel Sandler        mBatteryController = new BatteryController(mContext);
496a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        mBatteryController.addIconView((ImageView)mStatusBarView.findViewById(R.id.battery));
4972b69735e014872ca2183b4a39a8381daa337e146Daniel Sandler        mNetworkController = new NetworkController(mContext);
498d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        mBluetoothController = new BluetoothController(mContext);
4995e6af448045f20f7a1b393960d200c25e9d976e8Jim Miller        final SignalClusterView signalCluster =
500a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler                (SignalClusterView)mStatusBarView.findViewById(R.id.signal_cluster);
5013d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler
502d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
5032e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mNetworkController.addSignalCluster(signalCluster);
50428f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        signalCluster.setNetworkController(mNetworkController);
50518ac7826ae037990551e8dae6870affaaca0599fDaniel Sandler
506dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler        mEmergencyCallLabel = (TextView)mStatusBarWindow.findViewById(R.id.emergency_calls_only);
507dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler        if (mEmergencyCallLabel != null) {
508dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler            mNetworkController.addEmergencyLabelView(mEmergencyCallLabel);
5093679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler            mEmergencyCallLabel.setOnClickListener(new View.OnClickListener() {
5103679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                public void onClick(View v) { }});
511dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler            mEmergencyCallLabel.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
512dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler                @Override
513dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler                public void onLayoutChange(View v, int left, int top, int right, int bottom,
514dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler                        int oldLeft, int oldTop, int oldRight, int oldBottom) {
515dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler                    updateCarrierLabelVisibility(false);
516dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler                }});
517dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler        }
518dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler
519bf526d14f3252b8a5c123291e4cd8b1c51346560Daniel Sandler        mCarrierLabel = (TextView)mStatusBarWindow.findViewById(R.id.carrier_label);
520bf526d14f3252b8a5c123291e4cd8b1c51346560Daniel Sandler        mShowCarrierInPanel = (mCarrierLabel != null);
5217ff30113de68539ec840c524b8f1561f938f96c5Dianne Hackborn        if (DEBUG) Slog.v(TAG, "carrierlabel=" + mCarrierLabel + " show=" + mShowCarrierInPanel);
522bf526d14f3252b8a5c123291e4cd8b1c51346560Daniel Sandler        if (mShowCarrierInPanel) {
523dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler            mCarrierLabel.setVisibility(mCarrierLabelVisible ? View.VISIBLE : View.INVISIBLE);
524dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler
52567234c4b87f767a8d5ebbd1ab6bc803f7fe8504cDaniel Sandler            // for mobile devices, we always show mobile connection info here (SPN/PLMN)
52667234c4b87f767a8d5ebbd1ab6bc803f7fe8504cDaniel Sandler            // for other devices, we show whatever network is connected
52718ac7826ae037990551e8dae6870affaaca0599fDaniel Sandler            if (mNetworkController.hasMobileDataFeature()) {
52818ac7826ae037990551e8dae6870affaaca0599fDaniel Sandler                mNetworkController.addMobileLabelView(mCarrierLabel);
52918ac7826ae037990551e8dae6870affaaca0599fDaniel Sandler            } else {
53067234c4b87f767a8d5ebbd1ab6bc803f7fe8504cDaniel Sandler                mNetworkController.addCombinedLabelView(mCarrierLabel);
53118ac7826ae037990551e8dae6870affaaca0599fDaniel Sandler            }
532dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler
533dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler            // set up the dynamic hide/show of the label
534dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler            mPile.setOnSizeChangedListener(new OnSizeChangedListener() {
535dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler                @Override
536dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler                public void onSizeChanged(View view, int w, int h, int oldw, int oldh) {
537dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler                    updateCarrierLabelVisibility(false);
538dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler                }
539dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler            });
5403d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        }
5413d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler
542e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler        // Quick Settings (where available, some restrictions apply)
543e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler        if (mHasSettingsPanel) {
544101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            // first, figure out where quick settings should be inflated
545101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            final View settings_stub;
546101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            if (mHasFlipSettings) {
547101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                // a version of quick settings that flips around behind the notifications
548101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                settings_stub = mStatusBarWindow.findViewById(R.id.flip_settings_stub);
549101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                if (settings_stub != null) {
550101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                    mFlipSettingsView = ((ViewStub)settings_stub).inflate();
551101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                    mFlipSettingsView.setVisibility(View.GONE);
552101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                    mFlipSettingsView.setVerticalScrollBarEnabled(false);
553101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                }
554e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            } else {
555101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                // full quick settings panel
556101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                settings_stub = mStatusBarWindow.findViewById(R.id.quick_settings_stub);
557101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                if (settings_stub != null) {
558101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                    mSettingsPanel = (SettingsPanelView) ((ViewStub)settings_stub).inflate();
559101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                } else {
560101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                    mSettingsPanel = (SettingsPanelView) mStatusBarWindow.findViewById(R.id.settings_panel);
561101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                }
562101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
563101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                if (mSettingsPanel != null) {
564101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                    if (!ActivityManager.isHighEndGfx()) {
565101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                        mSettingsPanel.setBackground(new FastColorDrawable(context.getResources().getColor(
566101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                                R.color.notification_panel_solid_background)));
567101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                    }
568101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                }
569e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            }
570e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler
571101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            // wherever you find it, Quick Settings needs a container to survive
572101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            mSettingsContainer = (QuickSettingsContainerView)
573101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                    mStatusBarWindow.findViewById(R.id.quick_settings_container);
574101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            if (mSettingsContainer != null) {
575101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                mQS = new QuickSettings(mContext, mSettingsContainer);
5763679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                if (!mNotificationPanelIsFullScreenWidth) {
5773679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    mSettingsContainer.setSystemUiVisibility(
5783679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                            View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER
5793679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                            | View.STATUS_BAR_DISABLE_SYSTEM_INFO);
5803679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                }
581101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                if (mSettingsPanel != null) {
582101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                    mSettingsPanel.setQuickSettings(mQS);
583e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                }
584101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                mQS.setService(this);
585fe3376b41aa48b6894afad9b977170bc658a6ac1Daniel Sandler                mQS.setBar(mStatusBarView);
586101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                mQS.setup(mNetworkController, mBluetoothController, mBatteryController,
587101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                        mLocationController);
588101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            } else {
589101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                mQS = null; // fly away, be free
590e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            }
591537421bed204a3a0cb8160a9be8a61d67c2c25f4Siva Velusamy        }
592537421bed204a3a0cb8160a9be8a61d67c2c25f4Siva Velusamy
593b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        mClingShown = ! (DEBUG_CLINGS
594b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            || !Prefs.read(mContext).getBoolean(Prefs.SHOWN_QUICK_SETTINGS_HELP, false));
595b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
596ace0bd77438c89578ff821a86ff1ae91f8000ed3Daniel Sandler        if (!ENABLE_NOTIFICATION_PANEL_CLING || ActivityManager.isRunningInTestHarness()) {
597b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            mClingShown = true;
598b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        }
599b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
6005e6af448045f20f7a1b393960d200c25e9d976e8Jim Miller//        final ImageView wimaxRSSI =
601633eabe56d3126fa92eb56636019e5792e20a5daDaniel Sandler//                (ImageView)sb.findViewById(R.id.wimax_signal);
602633eabe56d3126fa92eb56636019e5792e20a5daDaniel Sandler//        if (wimaxRSSI != null) {
603633eabe56d3126fa92eb56636019e5792e20a5daDaniel Sandler//            mNetworkController.addWimaxIconView(wimaxRSSI);
604633eabe56d3126fa92eb56636019e5792e20a5daDaniel Sandler//        }
6053b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka
606808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        // receive broadcasts
607808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        IntentFilter filter = new IntentFilter();
608808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
609808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
610808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        filter.addAction(Intent.ACTION_SCREEN_OFF);
6117f3cf9586ef51d6a870d941e56a0f12471cbbad2Daniel Sandler        filter.addAction(Intent.ACTION_SCREEN_ON);
612808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        context.registerReceiver(mBroadcastReceiver, filter);
613808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
614919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock        // listen for USER_SETUP_COMPLETE setting (per-user)
615919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock        resetUserSetupObserver();
616919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock
617a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        return mStatusBarView;
618808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
619808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
6207f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka    @Override
621cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    protected View getStatusBarView() {
622cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        return mStatusBarView;
623cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
624cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
625cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    @Override
626f2a16b27afd1ede5880d05eb9e19090c7e3e820eJim Miller    protected WindowManager.LayoutParams getRecentsLayoutParams(LayoutParams layoutParams) {
6273cd0a593937c0724d77db1e2e3995255cfae61acMichael Jurka        boolean opaque = false;
6283b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
629f2a16b27afd1ede5880d05eb9e19090c7e3e820eJim Miller                layoutParams.width,
630f2a16b27afd1ede5880d05eb9e19090c7e3e820eJim Miller                layoutParams.height,
6313b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
6323b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
6333b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
634fc8fa638617efb5695a1f89ea75375faebbe2a40Dianne Hackborn                | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
6353cd0a593937c0724d77db1e2e3995255cfae61acMichael Jurka                (opaque ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT));
63698365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (ActivityManager.isHighEndGfx()) {
637fc8fa638617efb5695a1f89ea75375faebbe2a40Dianne Hackborn            lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
638f16fc51d96be53a844877674b98cb70e60b45278Michael Jurka        } else {
639f16fc51d96be53a844877674b98cb70e60b45278Michael Jurka            lp.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
640f3abbad5a72171a796c7200600383940c882285aMichael Jurka            lp.dimAmount = 0.75f;
641fc8fa638617efb5695a1f89ea75375faebbe2a40Dianne Hackborn        }
6423b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        lp.gravity = Gravity.BOTTOM | Gravity.LEFT;
6433b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        lp.setTitle("RecentsPanel");
64499a9655b9333c3bff6e462b12baa56a5fcd4cb20Michael Jurka        lp.windowAnimations = com.android.internal.R.style.Animation_RecentApplications;
6453b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
6463b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
6473b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        return lp;
6483b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka    }
6493b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka
650e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    @Override
651e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    protected WindowManager.LayoutParams getSearchLayoutParams(LayoutParams layoutParams) {
652e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        boolean opaque = false;
653e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
654e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                LayoutParams.MATCH_PARENT,
655e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                LayoutParams.MATCH_PARENT,
656e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
657e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
658e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
659e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
660e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                (opaque ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT));
66198365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (ActivityManager.isHighEndGfx()) {
662e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
663e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        }
664e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        lp.gravity = Gravity.BOTTOM | Gravity.LEFT;
665e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        lp.setTitle("SearchPanel");
666e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        // TODO: Define custom animation for Search panel
667e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        lp.windowAnimations = com.android.internal.R.style.Animation_RecentApplications;
668e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
669e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
670e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        return lp;
671e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    }
672e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
673e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    @Override
674e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    protected void updateSearchPanel() {
675e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        super.updateSearchPanel();
676354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller        mSearchPanelView.setStatusBarView(mNavigationBarView);
677e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        mNavigationBarView.setDelegateView(mSearchPanelView);
678e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    }
679e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
680e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    @Override
681e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    public void showSearchPanel() {
682b490c3e64d4671133eb5e2c7a263f38879ef0ce3Jim Miller        super.showSearchPanel();
6837a73344bbe1636fd01a8b551b0b539168a9a9987John Spurlock        mHandler.removeCallbacks(mShowSearchPanel);
684d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler
685d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler        // we want to freeze the sysui state wherever it is
686d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler        mSearchPanelView.setSystemUiVisibility(mSystemUiVisibility);
687d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler
688e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        WindowManager.LayoutParams lp =
689e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            (android.view.WindowManager.LayoutParams) mNavigationBarView.getLayoutParams();
690e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
69198365d7663cbd82979a5700faf0050220b01084dJeff Brown        mWindowManager.updateViewLayout(mNavigationBarView, lp);
692e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    }
693e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
694e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    @Override
695e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    public void hideSearchPanel() {
696e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        super.hideSearchPanel();
697e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        WindowManager.LayoutParams lp =
698e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            (android.view.WindowManager.LayoutParams) mNavigationBarView.getLayoutParams();
699e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        lp.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
70098365d7663cbd82979a5700faf0050220b01084dJeff Brown        mWindowManager.updateViewLayout(mNavigationBarView, lp);
701e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    }
702e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
703808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    protected int getStatusBarGravity() {
704808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        return Gravity.TOP | Gravity.FILL_HORIZONTAL;
705808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
706808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
707dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    public int getStatusBarHeight() {
708a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        if (mNaturalBarHeight < 0) {
709a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler            final Resources res = mContext.getResources();
710a073e570789e5b49e8339af44516444b13db4428Jim Miller            mNaturalBarHeight =
711a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler                    res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
712a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        }
713a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        return mNaturalBarHeight;
714dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    }
715dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato
7165c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler    private View.OnClickListener mRecentsClickListener = new View.OnClickListener() {
7175c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler        public void onClick(View v) {
7185c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler            toggleRecentApps();
7195c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler        }
7205c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler    };
7210c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren
7229a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller    private int mShowSearchHoldoff = 0;
7239a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller    private Runnable mShowSearchPanel = new Runnable() {
7249a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller        public void run() {
7259a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller            showSearchPanel();
726a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler            awakenDreams();
7279a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller        }
7289a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller    };
7299a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller
730e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    View.OnTouchListener mHomeSearchActionListener = new View.OnTouchListener() {
731e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        public boolean onTouch(View v, MotionEvent event) {
732e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            switch(event.getAction()) {
7339a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller            case MotionEvent.ACTION_DOWN:
734d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler                if (!shouldDisableNavbarGestures()) {
7359a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller                    mHandler.removeCallbacks(mShowSearchPanel);
7369a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller                    mHandler.postDelayed(mShowSearchPanel, mShowSearchHoldoff);
7379a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller                }
7389a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller            break;
7399a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller
7409a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller            case MotionEvent.ACTION_UP:
7419a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller            case MotionEvent.ACTION_CANCEL:
7429a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller                mHandler.removeCallbacks(mShowSearchPanel);
743a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler                awakenDreams();
7449a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller            break;
7459a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller        }
7469a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller        return false;
747e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        }
748e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    };
7495c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler
750a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler    private void awakenDreams() {
751a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler        if (mDreamManager != null) {
752a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler            try {
753a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler                mDreamManager.awaken();
754a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler            } catch (RemoteException e) {
755a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler                // fine, stay asleep then
756a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler            }
757a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler        }
758a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler    }
759a2fbe53f1e59a9b015d27213fbc8588883f4d408Daniel Sandler
760412cba8aa10231cdf515d9400a754e8a16a8eb3dMichael Jurka    private void prepareNavigationBarView() {
761412cba8aa10231cdf515d9400a754e8a16a8eb3dMichael Jurka        mNavigationBarView.reorient();
762412cba8aa10231cdf515d9400a754e8a16a8eb3dMichael Jurka
763412cba8aa10231cdf515d9400a754e8a16a8eb3dMichael Jurka        mNavigationBarView.getRecentsButton().setOnClickListener(mRecentsClickListener);
76480343f646f9686528212f82163a77ef48e30f4c3Michael Jurka        mNavigationBarView.getRecentsButton().setOnTouchListener(mRecentsPreloadOnTouchListener);
765998bb765290066822ff8a3b378dadd71deb0ce73Jim Miller        mNavigationBarView.getHomeButton().setOnTouchListener(mHomeSearchActionListener);
766207d548ccf34f7feaa9164ebfa8f81679cb0d55fDaniel Sandler        mNavigationBarView.getSearchLight().setOnTouchListener(mHomeSearchActionListener);
767e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        updateSearchPanel();
768412cba8aa10231cdf515d9400a754e8a16a8eb3dMichael Jurka    }
769412cba8aa10231cdf515d9400a754e8a16a8eb3dMichael Jurka
7708956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler    // For small-screen devices (read: phones) that lack hardware navigation buttons
7718956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler    private void addNavigationBar() {
7724a066c5c77109431f50806fc29179d28f1472871Daniel Sandler        if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);
7730129b31ff493bb0aa10b778cbeacbec5964644f8Daniel Sandler        if (mNavigationBarView == null) return;
77417dfec7111fcc53a4f6ae6e92b4a7f85a278fe71Jim Miller
775412cba8aa10231cdf515d9400a754e8a16a8eb3dMichael Jurka        prepareNavigationBarView();
7765c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler
77798365d7663cbd82979a5700faf0050220b01084dJeff Brown        mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
7788956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler    }
7798956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler
7808956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler    private void repositionNavigationBar() {
7810129b31ff493bb0aa10b778cbeacbec5964644f8Daniel Sandler        if (mNavigationBarView == null) return;
78217dfec7111fcc53a4f6ae6e92b4a7f85a278fe71Jim Miller
783412cba8aa10231cdf515d9400a754e8a16a8eb3dMichael Jurka        prepareNavigationBarView();
7845c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler
78598365d7663cbd82979a5700faf0050220b01084dJeff Brown        mWindowManager.updateViewLayout(mNavigationBarView, getNavigationBarLayoutParams());
7868956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler    }
7878956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler
7881bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock    private void notifyNavigationBarScreenOn(boolean screenOn) {
7891bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock        if (mNavigationBarView == null) return;
7901bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock        mNavigationBarView.notifyScreenOn(screenOn);
7911bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock    }
7921bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock
7938956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler    private WindowManager.LayoutParams getNavigationBarLayoutParams() {
7948956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
7951f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
7968956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR,
7978956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler                    0
7988956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler                    | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
7998956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
800df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
801c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandler                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
802d99e7fd9fadfa46b6732c21e6a7a54755ceeb3c3Jim Miller                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
803a388449e632fadb75a0eae67f77ff618b3a39a01Daniel Sandler                PixelFormat.OPAQUE);
804c638c1eb1bbed67d7d8f0d43f39137d766366f54Daniel Sandler        // this will allow the navbar to run in an overlay on devices that support this
80598365d7663cbd82979a5700faf0050220b01084dJeff Brown        if (ActivityManager.isHighEndGfx()) {
806c638c1eb1bbed67d7d8f0d43f39137d766366f54Daniel Sandler            lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
807c638c1eb1bbed67d7d8f0d43f39137d766366f54Daniel Sandler        }
8088956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler
8098956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler        lp.setTitle("NavigationBar");
8108956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler        lp.windowAnimations = 0;
8118956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler        return lp;
8128956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler    }
8138956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler
814dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    private void addIntruderView() {
815808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
816808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                ViewGroup.LayoutParams.MATCH_PARENT,
817808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                ViewGroup.LayoutParams.WRAP_CONTENT,
818fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, // above the status bar!
819808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
820808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
821808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
822808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
82346e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown                    | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
82446e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
825808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                PixelFormat.TRANSLUCENT);
826808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL;
827fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        //lp.y += height * 1.5; // FIXME
828808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        lp.setTitle("IntruderAlert");
82959aed3885e7bf34b4d7c021db4243484fa267526Dianne Hackborn        lp.packageName = mContext.getPackageName();
83059aed3885e7bf34b4d7c021db4243484fa267526Dianne Hackborn        lp.windowAnimations = R.style.Animation_StatusBar_IntruderAlert;
831808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
83298365d7663cbd82979a5700faf0050220b01084dJeff Brown        mWindowManager.addView(mIntruderAlertView, lp);
833808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
834808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
835808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) {
836808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (SPEW) Slog.d(TAG, "addIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
837808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                + " icon=" + icon);
8386179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        StatusBarIconView view = new StatusBarIconView(mContext, slot, null);
839808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        view.set(icon);
840808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams(mIconSize, mIconSize));
841808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
842808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
843808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void updateIcon(String slot, int index, int viewIndex,
844808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            StatusBarIcon old, StatusBarIcon icon) {
845808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (SPEW) Slog.d(TAG, "updateIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
846808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                + " old=" + old + " icon=" + icon);
847808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        StatusBarIconView view = (StatusBarIconView)mStatusIcons.getChildAt(viewIndex);
848808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        view.set(icon);
849808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
850808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
851808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void removeIcon(String slot, int index, int viewIndex) {
852808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (SPEW) Slog.d(TAG, "removeIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex);
853808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mStatusIcons.removeViewAt(viewIndex);
854808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
855808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
856808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void addNotification(IBinder key, StatusBarNotification notification) {
8577ff30113de68539ec840c524b8f1561f938f96c5Dianne Hackborn        if (DEBUG) Slog.d(TAG, "addNotification score=" + notification.score);
858808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        StatusBarIconView iconView = addNotificationViews(key, notification);
859808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (iconView == null) return;
860808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
861808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        boolean immersive = false;
862808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        try {
863808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            immersive = ActivityManagerNative.getDefault().isTopActivityImmersive();
8648355e932a033398625eef676ac93aec0cb084efeDaniel Sandler            if (DEBUG) {
8658355e932a033398625eef676ac93aec0cb084efeDaniel Sandler                Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive"));
8668355e932a033398625eef676ac93aec0cb084efeDaniel Sandler            }
867808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        } catch (RemoteException ex) {
868808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
8696b31880838196806dff991551f197684b5809d8bDaniel Sandler
8706b31880838196806dff991551f197684b5809d8bDaniel Sandler        /*
8716b31880838196806dff991551f197684b5809d8bDaniel Sandler         * DISABLED due to missing API
872fc6fda3950338ce737f096548a079342317cfd7fDaniel Sandler        if (ENABLE_INTRUDERS && (
873fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                   // TODO(dsandler): Only if the screen is on
874fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                notification.notification.intruderView != null)) {
8752561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            Slog.d(TAG, "Presenting high-priority notification");
8762561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            // special new transient ticker mode
8772561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            // 1. Populate mIntruderAlertView
878e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
879fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            if (notification.notification.intruderView == null) {
880fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                Slog.e(TAG, notification.notification.toString() + " wanted to intrude but intruderView was null");
881fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                return;
882fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            }
8832561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
884fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            // bind the click event to the content area
885fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            PendingIntent contentIntent = notification.notification.contentIntent;
886fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            final View.OnClickListener listener = (contentIntent != null)
887fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                    ? new NotificationClicker(contentIntent,
888fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                            notification.pkg, notification.tag, notification.id)
889fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                    : null;
8902561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
891fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            mIntruderAlertView.applyIntruderContent(notification.notification.intruderView, listener);
8922561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
893fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            mCurrentlyIntrudingNotification = notification;
894e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
8952561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            // 2. Animate mIntruderAlertView in
8962561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            mHandler.sendEmptyMessage(MSG_SHOW_INTRUDER);
8972561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler
8982561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            // 3. Set alarm to age the notification off (TODO)
8992561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler            mHandler.removeMessages(MSG_HIDE_INTRUDER);
900fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            if (INTRUDER_ALERT_DECAY_MS > 0) {
901fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                mHandler.sendEmptyMessageDelayed(MSG_HIDE_INTRUDER, INTRUDER_ALERT_DECAY_MS);
902fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            }
903a073e570789e5b49e8339af44516444b13db4428Jim Miller        } else
9046b31880838196806dff991551f197684b5809d8bDaniel Sandler         */
905a073e570789e5b49e8339af44516444b13db4428Jim Miller
9066b31880838196806dff991551f197684b5809d8bDaniel Sandler        if (notification.notification.fullScreenIntent != null) {
907c9ce0abe29baecc540c48f4913255a71586bcfd3Daniel Sandler            // Stop screensaver if the notification has a full-screen intent.
908c9ce0abe29baecc540c48f4913255a71586bcfd3Daniel Sandler            // (like an incoming phone call)
909c9ce0abe29baecc540c48f4913255a71586bcfd3Daniel Sandler            awakenDreams();
910c9ce0abe29baecc540c48f4913255a71586bcfd3Daniel Sandler
911808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            // not immersive & a full-screen alert should be shown
9127ff30113de68539ec840c524b8f1561f938f96c5Dianne Hackborn            if (DEBUG) Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
913808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            try {
914808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                notification.notification.fullScreenIntent.send();
915808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            } catch (PendingIntent.CanceledException e) {
916808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
917808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        } else {
918808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            // usual case: status bar visible & not immersive
919808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
920fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            // show the ticker if there isn't an intruder too
921fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            if (mCurrentlyIntrudingNotification == null) {
9220c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren                tick(null, notification, true);
923808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
924935865923fdad9f47061ff0aedfe92d0b912d5d6Joe Onorato        }
925808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
926808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        // Recalculate the position of the sliding windows and the titles.
927808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        setAreThereNotifications();
928808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
929808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
930808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
931808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void removeNotification(IBinder key) {
932808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        StatusBarNotification old = removeNotificationViews(key);
933fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        if (SPEW) Slog.d(TAG, "removeNotification key=" + key + " old=" + old);
934808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
935808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (old != null) {
936808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            // Cancel the ticker if it's still running
937808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mTicker.removeEntry(old);
938808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
939808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            // Recalculate the position of the sliding windows and the titles.
940808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
941e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
9426b31880838196806dff991551f197684b5809d8bDaniel Sandler            if (ENABLE_INTRUDERS && old == mCurrentlyIntrudingNotification) {
943fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                mHandler.sendEmptyMessage(MSG_HIDE_INTRUDER);
944fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            }
9458cc36e572876f3bb9197f0109db3042466e5f917Daniel Sandler
9468cc36e572876f3bb9197f0109db3042466e5f917Daniel Sandler            if (CLOSE_PANEL_WHEN_EMPTIED && mNotificationData.size() == 0 && !mAnimating) {
94711cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                animateCollapsePanels();
9488cc36e572876f3bb9197f0109db3042466e5f917Daniel Sandler            }
949808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
9500761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler
9510761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler        setAreThereNotifications();
952808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
953808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
954d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock    private void updateShowSearchHoldoff() {
955d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock        mShowSearchHoldoff = mContext.getResources().getInteger(
956d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock            R.integer.config_show_search_delay);
9573b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka    }
9583b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka
9597c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler    private void loadNotificationShade() {
96026cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler        if (mPile == null) return;
96126cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler
9627c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        int N = mNotificationData.size();
9637c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
9647c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        ArrayList<View> toShow = new ArrayList<View>();
9657c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
96626cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler        final boolean provisioned = isDeviceProvisioned();
96726cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler        // If the device hasn't been through Setup, we only show system notifications
9687c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        for (int i=0; i<N; i++) {
96926cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler            Entry ent = mNotificationData.get(N-i-1);
970b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler            if (!(provisioned || showNotificationEvenIfUnprovisioned(ent.notification))) continue;
971b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler            if (!notificationIsForCurrentUser(ent.notification)) continue;
972b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler            toShow.add(ent.row);
9737c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        }
9747c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
9757c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        ArrayList<View> toRemove = new ArrayList<View>();
9767c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        for (int i=0; i<mPile.getChildCount(); i++) {
9777c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            View child = mPile.getChildAt(i);
9787c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            if (!toShow.contains(child)) {
9797c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler                toRemove.add(child);
980808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
981808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
982808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
9837c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        for (View remove : toRemove) {
9847c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            mPile.removeView(remove);
9857c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        }
9867c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
9877c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        for (int i=0; i<toShow.size(); i++) {
9887c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            View v = toShow.get(i);
9897c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            if (v.getParent() == null) {
9902561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler                mPile.addView(v, i);
9917c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            }
9927c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        }
99326cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler
9946e5fe432f38f6ba8734a2b242f74c4df805223f9Daniel Sandler        if (mSettingsButton != null) {
9956e5fe432f38f6ba8734a2b242f74c4df805223f9Daniel Sandler            mSettingsButton.setEnabled(isDeviceProvisioned());
9966e5fe432f38f6ba8734a2b242f74c4df805223f9Daniel Sandler        }
997808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
998808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
9990c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren    @Override
10000c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren    protected void updateNotificationIcons() {
100126cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler        if (mNotificationIcons == null) return;
100226cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler
10037c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        loadNotificationShade();
10047c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
10057c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        final LinearLayout.LayoutParams params
10067c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            = new LinearLayout.LayoutParams(mIconSize + 2*mIconHPadding, mNaturalBarHeight);
1007808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
10087c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        int N = mNotificationData.size();
10097c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
10107c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        if (DEBUG) {
10117c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            Slog.d(TAG, "refreshing icons: " + N + " notifications, mNotificationIcons=" + mNotificationIcons);
10127c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        }
10137c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
10147c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        ArrayList<View> toShow = new ArrayList<View>();
10157c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
101626cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler        final boolean provisioned = isDeviceProvisioned();
101726cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler        // If the device hasn't been through Setup, we only show system notifications
10187c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        for (int i=0; i<N; i++) {
101958b173b1ca10bfb8bd8f7fac676f51178e57ff83Daniel Sandler            Entry ent = mNotificationData.get(N-i-1);
1020b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler            if (!((provisioned && ent.notification.score >= HIDE_ICONS_BELOW_SCORE)
1021b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler                    || showNotificationEvenIfUnprovisioned(ent.notification))) continue;
1022b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler            if (!notificationIsForCurrentUser(ent.notification)) continue;
1023b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler            toShow.add(ent.icon);
10247c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        }
10257c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
10267c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        ArrayList<View> toRemove = new ArrayList<View>();
10277c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        for (int i=0; i<mNotificationIcons.getChildCount(); i++) {
10287c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            View child = mNotificationIcons.getChildAt(i);
10297c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            if (!toShow.contains(child)) {
10307c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler                toRemove.add(child);
10317c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            }
10327c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        }
10337c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
10347c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        for (View remove : toRemove) {
10357c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            mNotificationIcons.removeView(remove);
10367c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        }
10377c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
10387c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        for (int i=0; i<toShow.size(); i++) {
10397c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            View v = toShow.get(i);
10407c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            if (v.getParent() == null) {
10417c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler                mNotificationIcons.addView(v, i, params);
10427c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            }
10437c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        }
10447c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler    }
10457c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
1046e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler    protected void updateCarrierLabelVisibility(boolean force) {
1047bf526d14f3252b8a5c123291e4cd8b1c51346560Daniel Sandler        if (!mShowCarrierInPanel) return;
10483d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        // The idea here is to only show the carrier label when there is enough room to see it,
10493d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        // i.e. when there aren't enough notifications to fill the panel.
10503d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        if (DEBUG) {
10513d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler            Slog.d(TAG, String.format("pileh=%d scrollh=%d carrierh=%d",
10523d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                    mPile.getHeight(), mScrollView.getHeight(), mCarrierLabelHeight));
10533d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        }
1054dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler
1055dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler        final boolean emergencyCallsShownElsewhere = mEmergencyCallLabel != null;
1056dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler        final boolean makeVisible =
1057dd4ef49f4545dad2a6503d29e129472aba5392fcDaniel Sandler            !(emergencyCallsShownElsewhere && mNetworkController.isEmergencyOnly())
1058101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            && mPile.getHeight() < (mNotificationPanel.getHeight() - mCarrierLabelHeight - mNotificationHeaderHeight)
1059101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            && mScrollView.getVisibility() == View.VISIBLE;
10603d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler
1061e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        if (force || mCarrierLabelVisible != makeVisible) {
10623d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler            mCarrierLabelVisible = makeVisible;
10633d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler            if (DEBUG) {
10643d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                Slog.d(TAG, "making carrier label " + (makeVisible?"visible":"invisible"));
10653d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler            }
10663d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler            mCarrierLabel.animate().cancel();
10673d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler            if (makeVisible) {
10683d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                mCarrierLabel.setVisibility(View.VISIBLE);
10693d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler            }
10703d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler            mCarrierLabel.animate()
10713d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                .alpha(makeVisible ? 1f : 0f)
10723d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                //.setStartDelay(makeVisible ? 500 : 0)
10733d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                //.setDuration(makeVisible ? 750 : 100)
10743d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                .setDuration(150)
10753d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                .setListener(makeVisible ? null : new AnimatorListenerAdapter() {
10763d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                    @Override
10773d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                    public void onAnimationEnd(Animator animation) {
10783d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                        if (!mCarrierLabelVisible) { // race
10793d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                            mCarrierLabel.setVisibility(View.INVISIBLE);
10803d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                            mCarrierLabel.setAlpha(0f);
10813d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                        }
10823d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                    }
10833d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                })
10843d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler                .start();
10853d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        }
10863d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler    }
10873d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler
10880c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren    @Override
10890c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren    protected void setAreThereNotifications() {
10900761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler        final boolean any = mNotificationData.size() > 0;
10917c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
10920761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler        final boolean clearable = any && mNotificationData.hasClearableItems();
10930761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler
10940761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler        if (DEBUG) {
10950761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler            Slog.d(TAG, "setAreThereNotifications: N=" + mNotificationData.size()
10960761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler                    + " any=" + any + " clearable=" + clearable);
10970761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler        }
10980761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler
10996e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler        if (mHasFlipSettings
11006e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler                && mFlipSettingsView != null
1101f249efcf3709b0feace01b9e3875cfd64b4d061eDaniel Sandler                && mFlipSettingsView.getVisibility() == View.VISIBLE
1102f249efcf3709b0feace01b9e3875cfd64b4d061eDaniel Sandler                && mScrollView.getVisibility() != View.VISIBLE) {
1103f249efcf3709b0feace01b9e3875cfd64b4d061eDaniel Sandler            // the flip settings panel is unequivocally showing; we should not be shown
11046e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler            mClearButton.setVisibility(View.INVISIBLE);
11056e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler        } else if (mClearButton.isShown()) {
11060761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler            if (clearable != (mClearButton.getAlpha() == 1.0f)) {
11078900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                ObjectAnimator clearAnimation = ObjectAnimator.ofFloat(
11088900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                        mClearButton, "alpha", clearable ? 1.0f : 0.0f).setDuration(250);
11098900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                clearAnimation.addListener(new AnimatorListenerAdapter() {
11108900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                    @Override
11118900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                    public void onAnimationEnd(Animator animation) {
11128900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                        if (mClearButton.getAlpha() <= 0.0f) {
11138900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                            mClearButton.setVisibility(View.INVISIBLE);
11148900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                        }
11158900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                    }
11168900e631940fdffe7b941b56dc0f17e55345441eRomain Guy
11178900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                    @Override
11188900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                    public void onAnimationStart(Animator animation) {
11198900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                        if (mClearButton.getAlpha() <= 0.0f) {
11208900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                            mClearButton.setVisibility(View.VISIBLE);
11218900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                        }
11228900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                    }
11238900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                });
11248900e631940fdffe7b941b56dc0f17e55345441eRomain Guy                clearAnimation.start();
11250761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler            }
11260761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler        } else {
11270761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler            mClearButton.setAlpha(clearable ? 1.0f : 0.0f);
11288900e631940fdffe7b941b56dc0f17e55345441eRomain Guy            mClearButton.setVisibility(clearable ? View.VISIBLE : View.INVISIBLE);
11290761e4cd95b6968dd4b1659a766ef504d13f6d50Daniel Sandler        }
11308ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler        mClearButton.setEnabled(clearable);
11318900e631940fdffe7b941b56dc0f17e55345441eRomain Guy
1132d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        final View nlo = mStatusBarView.findViewById(R.id.notification_lights_out);
1133d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        final boolean showDot = (any&&!areLightsOn());
1134d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        if (showDot != (nlo.getAlpha() == 1.0f)) {
1135d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler            if (showDot) {
1136d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                nlo.setAlpha(0f);
1137d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                nlo.setVisibility(View.VISIBLE);
1138d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler            }
1139d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler            nlo.animate()
1140d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                .alpha(showDot?1:0)
1141d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                .setDuration(showDot?750:250)
1142d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                .setInterpolator(new AccelerateInterpolator(2.0f))
1143d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                .setListener(showDot ? null : new AnimatorListenerAdapter() {
1144d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                    @Override
1145d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                    public void onAnimationEnd(Animator _a) {
1146d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                        nlo.setVisibility(View.GONE);
1147d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                    }
1148d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                })
1149d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                .start();
1150d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        }
11513d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler
1152e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        updateCarrierLabelVisibility(false);
1153808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1154808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1155f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey    public void showClock(boolean show) {
1156c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        if (mStatusBarView == null) return;
1157f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey        View clock = mStatusBarView.findViewById(R.id.clock);
1158f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey        if (clock != null) {
1159f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey            clock.setVisibility(show ? View.VISIBLE : View.GONE);
1160f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey        }
1161f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey    }
1162808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1163808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    /**
1164808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato     * State is one or more of the DISABLE constants from StatusBarManager.
1165808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato     */
1166808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void disable(int state) {
1167808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        final int old = mDisabled;
1168808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        final int diff = state ^ old;
1169808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mDisabled = state;
1170808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1171e21f288358df2c1cea57c0a359dcf647baeb970dDaniel Sandler        if (DEBUG) {
1172e21f288358df2c1cea57c0a359dcf647baeb970dDaniel Sandler            Slog.d(TAG, String.format("disable: 0x%08x -> 0x%08x (diff: 0x%08x)",
1173e21f288358df2c1cea57c0a359dcf647baeb970dDaniel Sandler                old, state, diff));
1174e21f288358df2c1cea57c0a359dcf647baeb970dDaniel Sandler        }
1175e21f288358df2c1cea57c0a359dcf647baeb970dDaniel Sandler
11766da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        StringBuilder flagdbg = new StringBuilder();
11776da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append("disable: < ");
11786da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((state & StatusBarManager.DISABLE_EXPAND) != 0) ? "EXPAND" : "expand");
11796da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((diff  & StatusBarManager.DISABLE_EXPAND) != 0) ? "* " : " ");
11806da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) ? "ICONS" : "icons");
11816da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((diff  & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) ? "* " : " ");
11826da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((state & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) != 0) ? "ALERTS" : "alerts");
11836da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((diff  & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) != 0) ? "* " : " ");
11846da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) ? "TICKER" : "ticker");
11856da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((diff  & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) ? "* " : " ");
11866da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((state & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) ? "SYSTEM_INFO" : "system_info");
11876da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((diff  & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) ? "* " : " ");
11886da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((state & StatusBarManager.DISABLE_BACK) != 0) ? "BACK" : "back");
11896da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((diff  & StatusBarManager.DISABLE_BACK) != 0) ? "* " : " ");
1190dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler        flagdbg.append(((state & StatusBarManager.DISABLE_HOME) != 0) ? "HOME" : "home");
1191dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler        flagdbg.append(((diff  & StatusBarManager.DISABLE_HOME) != 0) ? "* " : " ");
1192dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler        flagdbg.append(((state & StatusBarManager.DISABLE_RECENT) != 0) ? "RECENT" : "recent");
1193dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler        flagdbg.append(((diff  & StatusBarManager.DISABLE_RECENT) != 0) ? "* " : " ");
11946da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((state & StatusBarManager.DISABLE_CLOCK) != 0) ? "CLOCK" : "clock");
11956da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(((diff  & StatusBarManager.DISABLE_CLOCK) != 0) ? "* " : " ");
1196d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler        flagdbg.append(((state & StatusBarManager.DISABLE_SEARCH) != 0) ? "SEARCH" : "search");
1197d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler        flagdbg.append(((diff  & StatusBarManager.DISABLE_SEARCH) != 0) ? "* " : " ");
11986da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        flagdbg.append(">");
11996da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler        Slog.d(TAG, flagdbg.toString());
1200a073e570789e5b49e8339af44516444b13db4428Jim Miller
12018e18dc77579cdb2b2dad036afd18f8ca4963782aDaniel Sandler        if ((diff & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) {
1202173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler            mSystemIconArea.animate().cancel();
12038e18dc77579cdb2b2dad036afd18f8ca4963782aDaniel Sandler            if ((state & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) {
1204173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                mSystemIconArea.animate()
120567e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .alpha(0f)
120667e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .translationY(mNaturalBarHeight*0.5f)
120767e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .setDuration(175)
120867e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .setInterpolator(new DecelerateInterpolator(1.5f))
120967e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .setListener(mMakeIconsInvisible)
121067e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .start();
12118e18dc77579cdb2b2dad036afd18f8ca4963782aDaniel Sandler            } else {
1212173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                mSystemIconArea.setVisibility(View.VISIBLE);
1213173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                mSystemIconArea.animate()
121467e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .alpha(1f)
121567e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .translationY(0)
121667e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .setStartDelay(0)
121767e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .setInterpolator(new DecelerateInterpolator(1.5f))
121867e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .setDuration(175)
121967e7d90376150042b9f464e8ca44f4b3a032f11cDaniel Sandler                    .start();
12208e18dc77579cdb2b2dad036afd18f8ca4963782aDaniel Sandler            }
12218e18dc77579cdb2b2dad036afd18f8ca4963782aDaniel Sandler        }
12226da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler
1223f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey        if ((diff & StatusBarManager.DISABLE_CLOCK) != 0) {
1224f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey            boolean show = (state & StatusBarManager.DISABLE_CLOCK) == 0;
1225f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey            showClock(show);
1226f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey        }
1227808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) {
1228808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            if ((state & StatusBarManager.DISABLE_EXPAND) != 0) {
122911cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                animateCollapsePanels();
1230808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
1231808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1232e21f288358df2c1cea57c0a359dcf647baeb970dDaniel Sandler
12335e6af448045f20f7a1b393960d200c25e9d976e8Jim Miller        if ((diff & (StatusBarManager.DISABLE_HOME
12345e6af448045f20f7a1b393960d200c25e9d976e8Jim Miller                        | StatusBarManager.DISABLE_RECENT
1235d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler                        | StatusBarManager.DISABLE_BACK
1236d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler                        | StatusBarManager.DISABLE_SEARCH)) != 0) {
1237dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler            // the nav bar will take care of these
1238d9283b903125c875f973bf6f724f23e595bce756Daniel Sandler            if (mNavigationBarView != null) mNavigationBarView.setDisabledFlags(state);
12396da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler
1240dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler            if ((state & StatusBarManager.DISABLE_RECENT) != 0) {
12416da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler                // close recents if it's visible
12426da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler                mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
12436da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler                mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
12446da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler            }
1245e21f288358df2c1cea57c0a359dcf647baeb970dDaniel Sandler        }
1246e21f288358df2c1cea57c0a359dcf647baeb970dDaniel Sandler
1247808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
1248808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
1249808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                if (mTicking) {
1250f59a90c24788d6d67a492aa5a9d8efbf350bbd7eDaniel Sandler                    haltTicker();
1251808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                }
1252173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler
1253173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                mNotificationIcons.animate()
1254173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .alpha(0f)
1255173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .translationY(mNaturalBarHeight*0.5f)
1256173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .setDuration(175)
1257173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .setInterpolator(new DecelerateInterpolator(1.5f))
1258173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .setListener(mMakeIconsInvisible)
1259173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .start();
1260808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            } else {
1261173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                mNotificationIcons.setVisibility(View.VISIBLE);
1262173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                mNotificationIcons.animate()
1263173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .alpha(1f)
1264173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .translationY(0)
1265173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .setStartDelay(0)
1266173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .setInterpolator(new DecelerateInterpolator(1.5f))
1267173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .setDuration(175)
1268173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler                    .start();
1269808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
1270808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
1271808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            if (mTicking && (state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
1272f59a90c24788d6d67a492aa5a9d8efbf350bbd7eDaniel Sandler                haltTicker();
1273808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
1274808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1275808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1276808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
12777f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka    @Override
1278ecc395a51053c433e359a6cfd6c23a193ee546c0Michael Jurka    protected BaseStatusBar.H createHandler() {
12797f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka        return new PhoneStatusBar.H();
12807f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka    }
12817f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka
1282808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    /**
1283808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato     * All changes to the status bar and notifications funnel through here and are batched.
1284808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato     */
12857f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka    private class H extends BaseStatusBar.H {
1286808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        public void handleMessage(Message m) {
12877f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka            super.handleMessage(m);
1288808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            switch (m.what) {
12898ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                case MSG_OPEN_NOTIFICATION_PANEL:
129011cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                    animateExpandNotificationsPanel();
12918ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                    break;
129211cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                case MSG_OPEN_SETTINGS_PANEL:
129311cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                    animateExpandSettingsPanel();
129411cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                    break;
129511cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                case MSG_CLOSE_PANELS:
129611cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                    animateCollapsePanels();
12978ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                    break;
1298808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                case MSG_SHOW_INTRUDER:
1299808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    setIntruderAlertVisibility(true);
1300808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    break;
1301808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                case MSG_HIDE_INTRUDER:
1302808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    setIntruderAlertVisibility(false);
1303fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                    mCurrentlyIntrudingNotification = null;
1304808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    break;
1305808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
1306808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1307808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1308808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1309040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    public Handler getHandler() {
1310040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        return mHandler;
1311040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    }
1312040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler
1313808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    View.OnFocusChangeListener mFocusChangeListener = new View.OnFocusChangeListener() {
1314808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        public void onFocusChange(View v, boolean hasFocus) {
1315808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            // Because 'v' is a ViewGroup, all its children will be (un)selected
1316808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            // too, which allows marqueeing to work.
1317808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            v.setSelected(hasFocus);
1318808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1319808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    };
1320808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
132108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    void makeExpandedVisible(boolean revealAfterDraw) {
1322808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (SPEW) Slog.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible);
1323808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (mExpandedVisible) {
1324808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            return;
1325808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1326a073e570789e5b49e8339af44516444b13db4428Jim Miller
1327808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mExpandedVisible = true;
1328e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        mPile.setLayoutTransitionsEnabled(true);
1329d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock        if (mNavigationBarView != null)
1330d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock            mNavigationBarView.setSlippery(true);
1331808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1332e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        updateCarrierLabelVisibility(true);
13333d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler
1334808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
1335a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler
1336a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        // Expand the window to encompass the full screen in anticipation of the drag.
1337a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        // This is only possible to do atomically because the status bar is at the top of the screen!
1338a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams();
13394391b0bc6949365e5ed26990a1f206bfbae31015Daniel Sandler        lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
13404391b0bc6949365e5ed26990a1f206bfbae31015Daniel Sandler        lp.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
134121b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler        lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
134298365d7663cbd82979a5700faf0050220b01084dJeff Brown        mWindowManager.updateViewLayout(mStatusBarWindow, lp);
1343a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler
1344804df70112204a492730a5632e4524fddf0e4f48John Spurlock        // Updating the window layout will force an expensive traversal/redraw.
1345804df70112204a492730a5632e4524fddf0e4f48John Spurlock        // Kick off the reveal animation after this is complete to avoid animation latency.
1346804df70112204a492730a5632e4524fddf0e4f48John Spurlock        if (revealAfterDraw) {
134708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler//            mHandler.post(mStartRevealAnimation);
1348804df70112204a492730a5632e4524fddf0e4f48John Spurlock        }
1349804df70112204a492730a5632e4524fddf0e4f48John Spurlock
1350a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        visibilityChanged(true);
1351808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1352808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
135311cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler    public void animateCollapsePanels() {
135411cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler        animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
13553b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka    }
13563b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka
135711cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler    public void animateCollapsePanels(int flags) {
1358808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (SPEW) {
1359198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            Slog.d(TAG, "animateCollapse():"
1360808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    + " mExpandedVisible=" + mExpandedVisible
1361808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    + " mAnimating=" + mAnimating
1362ed930e5ad537eb63b3b96fd583025bf4269da16fDaniel Sandler                    + " mAnimatingReveal=" + mAnimatingReveal
1363808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    + " mAnimY=" + mAnimY
13649a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller                    + " mAnimVel=" + mAnimVel
13659a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller                    + " flags=" + flags);
1366808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1367808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
13689a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller        if ((flags & CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL) == 0) {
13693b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka            mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
13703b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka            mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
13713b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        }
13729a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller
13739a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller        if ((flags & CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL) == 0) {
13749a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller            mHandler.removeMessages(MSG_CLOSE_SEARCH_PANEL);
13759a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller            mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL);
13769a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller        }
13773b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka
1378ac47ff70c322614ff2ca9ad82fe41338daf55877Daniel Sandler        mStatusBarWindow.cancelExpandHelper();
137908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mStatusBarView.collapseAllPanels(true);
1380808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1381808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1382101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    public ViewPropertyAnimator setVisibilityWhenDone(
1383101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            final ViewPropertyAnimator a, final View v, final int vis) {
1384101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        a.setListener(new AnimatorListenerAdapter() {
1385101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            @Override
1386101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            public void onAnimationEnd(Animator animation) {
1387101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                v.setVisibility(vis);
1388101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                a.setListener(null); // oneshot
1389101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            }
1390101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        });
1391101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        return a;
1392101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    }
1393101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
1394101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    public Animator setVisibilityWhenDone(
1395101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            final Animator a, final View v, final int vis) {
1396101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        a.addListener(new AnimatorListenerAdapter() {
1397101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            @Override
1398101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            public void onAnimationEnd(Animator animation) {
1399101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler                v.setVisibility(vis);
1400101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            }
1401101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        });
1402101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        return a;
1403101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    }
1404101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
1405101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    public Animator interpolator(TimeInterpolator ti, Animator a) {
1406101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        a.setInterpolator(ti);
1407101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        return a;
1408101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    }
1409101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
1410101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    public Animator startDelay(int d, Animator a) {
1411101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        a.setStartDelay(d);
1412101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        return a;
1413101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    }
1414101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
1415101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    public Animator start(Animator a) {
1416101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        a.start();
1417101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        return a;
1418101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    }
1419101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
1420101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    final TimeInterpolator mAccelerateInterpolator = new AccelerateInterpolator();
1421101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    final TimeInterpolator mDecelerateInterpolator = new DecelerateInterpolator();
1422101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    final int FLIP_DURATION_OUT = 125;
1423101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    final int FLIP_DURATION_IN = 225;
1424101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    final int FLIP_DURATION = (FLIP_DURATION_IN + FLIP_DURATION_OUT);
1425101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
1426101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    Animator mScrollViewAnim, mFlipSettingsViewAnim, mNotificationButtonAnim,
1427101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        mSettingsButtonAnim, mClearButtonAnim;
1428101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
142908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    @Override
143011cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler    public void animateExpandNotificationsPanel() {
1431e7237fceb1cd17af006815c4338fe8e4a7971ff7Daniel Sandler        if (SPEW) Slog.d(TAG, "animateExpand: mExpandedVisible=" + mExpandedVisible);
1432808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) {
1433808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            return ;
1434808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1435808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
143608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mNotificationPanel.expand();
1437040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mHasFlipSettings && mScrollView.getVisibility() != View.VISIBLE) {
1438040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            flipToNotifications();
1439101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        }
1440808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1441808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (false) postStartTracing();
1442808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1443808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1444040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    public void flipToNotifications() {
1445040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel();
1446040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mScrollViewAnim != null) mScrollViewAnim.cancel();
1447040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel();
1448040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel();
1449040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mClearButtonAnim != null) mClearButtonAnim.cancel();
1450040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler
1451040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mScrollView.setVisibility(View.VISIBLE);
1452040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mScrollViewAnim = start(
1453040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            startDelay(FLIP_DURATION_OUT,
1454040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                interpolator(mDecelerateInterpolator,
1455040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                    ObjectAnimator.ofFloat(mScrollView, View.SCALE_X, 0f, 1f)
1456040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                        .setDuration(FLIP_DURATION_IN)
1457040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                    )));
1458040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mFlipSettingsViewAnim = start(
1459040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            setVisibilityWhenDone(
1460040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                interpolator(mAccelerateInterpolator,
1461040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                        ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 1f, 0f)
1462040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                        )
1463040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                    .setDuration(FLIP_DURATION_OUT),
1464040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                mFlipSettingsView, View.INVISIBLE));
1465040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mNotificationButtonAnim = start(
1466040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            setVisibilityWhenDone(
1467040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 0f)
1468040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                    .setDuration(FLIP_DURATION),
1469040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                mNotificationButton, View.INVISIBLE));
1470040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mSettingsButton.setVisibility(View.VISIBLE);
1471040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mSettingsButtonAnim = start(
1472040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 1f)
1473040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                .setDuration(FLIP_DURATION));
1474040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mClearButton.setVisibility(View.VISIBLE);
1475040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mClearButton.setAlpha(0f);
1476040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        setAreThereNotifications(); // this will show/hide the button as necessary
1477040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mNotificationPanel.postDelayed(new Runnable() {
1478040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            public void run() {
1479040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                updateCarrierLabelVisibility(false);
1480040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            }
1481040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        }, FLIP_DURATION - 150);
1482040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    }
1483040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler
1484e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov    @Override
148511cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler    public void animateExpandSettingsPanel() {
1486e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov        if (SPEW) Slog.d(TAG, "animateExpand: mExpandedVisible=" + mExpandedVisible);
1487e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov        if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) {
1488e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov            return;
1489e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov        }
1490e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov
1491101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        if (mHasFlipSettings) {
1492101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            mNotificationPanel.expand();
1493101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            if (mFlipSettingsView.getVisibility() != View.VISIBLE) {
1494040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                flipToSettings();
1495101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            }
1496101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        } else if (mSettingsPanel != null) {
1497101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            mSettingsPanel.expand();
1498101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        }
1499e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov
1500e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov        if (false) postStartTracing();
1501e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov    }
1502e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov
1503040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    public void switchToSettings() {
1504040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mFlipSettingsView.setScaleX(1f);
1505040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mFlipSettingsView.setVisibility(View.VISIBLE);
1506040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mSettingsButton.setVisibility(View.GONE);
1507040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mScrollView.setVisibility(View.GONE);
1508720a34d60ac466913a46ad3d757553b72ec50404Daniel Sandler        mScrollView.setScaleX(0f);
1509040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mNotificationButton.setVisibility(View.VISIBLE);
1510040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mNotificationButton.setAlpha(1f);
1511040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mClearButton.setVisibility(View.GONE);
1512040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    }
1513040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler
1514040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    public void flipToSettings() {
1515040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel();
1516040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mScrollViewAnim != null) mScrollViewAnim.cancel();
1517040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel();
1518040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel();
1519040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mClearButtonAnim != null) mClearButtonAnim.cancel();
1520040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler
1521040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mFlipSettingsView.setVisibility(View.VISIBLE);
1522040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mFlipSettingsView.setScaleX(0f);
1523040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mFlipSettingsViewAnim = start(
1524040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            startDelay(FLIP_DURATION_OUT,
1525040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                interpolator(mDecelerateInterpolator,
1526040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                    ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 0f, 1f)
1527040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                        .setDuration(FLIP_DURATION_IN)
1528040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                    )));
1529040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mScrollViewAnim = start(
1530040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            setVisibilityWhenDone(
1531040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                interpolator(mAccelerateInterpolator,
1532040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                        ObjectAnimator.ofFloat(mScrollView, View.SCALE_X, 1f, 0f)
1533040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                        )
1534040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                    .setDuration(FLIP_DURATION_OUT),
1535040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                mScrollView, View.INVISIBLE));
1536040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mSettingsButtonAnim = start(
1537040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            setVisibilityWhenDone(
1538040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 0f)
1539040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                    .setDuration(FLIP_DURATION),
1540040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                    mScrollView, View.INVISIBLE));
1541040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mNotificationButton.setVisibility(View.VISIBLE);
1542040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mNotificationButtonAnim = start(
1543040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 1f)
1544040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                .setDuration(FLIP_DURATION));
1545040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mClearButtonAnim = start(
1546040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            setVisibilityWhenDone(
1547040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                ObjectAnimator.ofFloat(mClearButton, View.ALPHA, 0f)
1548040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                .setDuration(FLIP_DURATION),
1549040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                mClearButton, View.INVISIBLE));
1550040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        mNotificationPanel.postDelayed(new Runnable() {
1551040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            public void run() {
1552040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                updateCarrierLabelVisibility(false);
1553040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            }
1554040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        }, FLIP_DURATION - 150);
1555040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    }
1556040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler
1557040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    public void flipPanels() {
1558040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mHasFlipSettings) {
1559040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            if (mFlipSettingsView.getVisibility() != View.VISIBLE) {
1560040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                flipToSettings();
1561040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            } else {
1562040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                flipToNotifications();
1563040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            }
1564040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        }
1565040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler    }
1566040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler
1567e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov    public void animateCollapseQuickSettings() {
1568e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov        mStatusBarView.collapseAllPanels(true);
1569e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov    }
1570e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov
15716e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler    void makeExpandedInvisibleSoon() {
15726e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler        mHandler.postDelayed(new Runnable() { public void run() { makeExpandedInvisible(); }}, 50);
15736e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler    }
15746e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler
157508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    void makeExpandedInvisible() {
1576e7237fceb1cd17af006815c4338fe8e4a7971ff7Daniel Sandler        if (SPEW) Slog.d(TAG, "makeExpandedInvisible: mExpandedVisible=" + mExpandedVisible
1577808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                + " mExpandedVisible=" + mExpandedVisible);
1578808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1579808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (!mExpandedVisible) {
1580808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            return;
1581808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1582ed930e5ad537eb63b3b96fd583025bf4269da16fDaniel Sandler
1583c38bbc391ae4ec5945d5fa408da3994552f775ebDaniel Sandler        // Ensure the panel is fully collapsed (just in case; bug 6765842, 7260868)
1584c38bbc391ae4ec5945d5fa408da3994552f775ebDaniel Sandler        mStatusBarView.collapseAllPanels(/*animate=*/ false);
1585ed930e5ad537eb63b3b96fd583025bf4269da16fDaniel Sandler
1586040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        if (mHasFlipSettings) {
1587040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            // reset things to their proper state
158850bc4f5a7c78b949f466891094851bfca9a3f613Daniel Sandler            if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel();
158950bc4f5a7c78b949f466891094851bfca9a3f613Daniel Sandler            if (mScrollViewAnim != null) mScrollViewAnim.cancel();
159050bc4f5a7c78b949f466891094851bfca9a3f613Daniel Sandler            if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel();
159150bc4f5a7c78b949f466891094851bfca9a3f613Daniel Sandler            if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel();
159250bc4f5a7c78b949f466891094851bfca9a3f613Daniel Sandler            if (mClearButtonAnim != null) mClearButtonAnim.cancel();
159350bc4f5a7c78b949f466891094851bfca9a3f613Daniel Sandler
1594040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            mScrollView.setScaleX(1f);
1595040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            mScrollView.setVisibility(View.VISIBLE);
1596040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            mSettingsButton.setAlpha(1f);
1597040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            mSettingsButton.setVisibility(View.VISIBLE);
1598040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            mNotificationPanel.setVisibility(View.GONE);
1599040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            mFlipSettingsView.setVisibility(View.GONE);
1600040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            mNotificationButton.setVisibility(View.GONE);
1601040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler            setAreThereNotifications(); // show the clear button
1602040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler        }
1603040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler
1604808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mExpandedVisible = false;
1605e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        mPile.setLayoutTransitionsEnabled(false);
1606d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock        if (mNavigationBarView != null)
1607d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock            mNavigationBarView.setSlippery(false);
1608808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        visibilityChanged(false);
1609a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler
1610a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        // Shrink the window to the size of the status bar only
1611a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams();
1612a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        lp.height = getStatusBarHeight();
16134391b0bc6949365e5ed26990a1f206bfbae31015Daniel Sandler        lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
16144391b0bc6949365e5ed26990a1f206bfbae31015Daniel Sandler        lp.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
161598365d7663cbd82979a5700faf0050220b01084dJeff Brown        mWindowManager.updateViewLayout(mStatusBarWindow, lp);
1616808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1617808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if ((mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS) == 0) {
1618808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);
1619808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1620808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1621469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler        // Close any "App info" popups that might have snuck on-screen
1622469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler        dismissPopups();
1623469e96e206f8df44b32ce393f8d19f0cae730030Daniel Sandler
16242f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        if (mPostCollapseCleanup != null) {
16252f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mPostCollapseCleanup.run();
16262f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mPostCollapseCleanup = null;
16272f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        }
1628808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1629808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
163054ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy    /**
163154ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy     * Enables or disables layers on the children of the notifications pile.
163254ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy     *
163354ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy     * When layers are enabled, this method attempts to enable layers for the minimal
163454ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy     * number of children. Only children visible when the notification area is fully
163554ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy     * expanded will receive a layer. The technique used in this method might cause
163654ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy     * more children than necessary to get a layer (at most one extra child with the
163754ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy     * current UI.)
163854ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy     *
163954ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy     * @param layerType {@link View#LAYER_TYPE_NONE} or {@link View#LAYER_TYPE_HARDWARE}
164054ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy     */
164154ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy    private void setPileLayers(int layerType) {
164254ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy        final int count = mPile.getChildCount();
164354ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy
164454ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy        switch (layerType) {
164554ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy            case View.LAYER_TYPE_NONE:
164654ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                for (int i = 0; i < count; i++) {
164754ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                    mPile.getChildAt(i).setLayerType(layerType, null);
164854ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                }
164954ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                break;
165054ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy            case View.LAYER_TYPE_HARDWARE:
165154ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                final int[] location = new int[2];
165254ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                mNotificationPanel.getLocationInWindow(location);
165354ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy
165454ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                final int left = location[0];
165554ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                final int top = location[1];
165654ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                final int right = left + mNotificationPanel.getWidth();
165754ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                final int bottom = top + getExpandedViewMaxHeight();
165854ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy
165954ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                final Rect childBounds = new Rect();
166054ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy
166154ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                for (int i = 0; i < count; i++) {
166254ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                    final View view = mPile.getChildAt(i);
166354ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                    view.getLocationInWindow(location);
166454ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy
166554ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                    childBounds.set(location[0], location[1],
166654ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                            location[0] + view.getWidth(), location[1] + view.getHeight());
166754ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy
166854ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                    if (childBounds.intersects(left, top, right, bottom)) {
166954ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                        view.setLayerType(layerType, null);
167054ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                    }
167154ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                }
167254ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy
167354ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy                break;
167454ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy        }
167554ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy    }
167654ab347fdde0e4d14d923cca80e5bcc7b879fc52Romain Guy
1677b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    public boolean isClinging() {
1678b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        return mCling != null && mCling.getVisibility() == View.VISIBLE;
1679b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    }
1680b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
1681b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    public void hideCling() {
1682b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        if (isClinging()) {
1683b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            mCling.animate().alpha(0f).setDuration(250).start();
1684b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            mCling.setVisibility(View.GONE);
1685b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            mSuppressStatusBarDrags = false;
1686b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        }
1687b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    }
1688b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
1689b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    public void showCling() {
1690118f484424f3e5649833df42a7e613f41b2b2ecdDaniel Sandler        // lazily inflate this to accommodate orientation change
1691118f484424f3e5649833df42a7e613f41b2b2ecdDaniel Sandler        final ViewStub stub = (ViewStub) mStatusBarWindow.findViewById(R.id.status_bar_cling_stub);
1692118f484424f3e5649833df42a7e613f41b2b2ecdDaniel Sandler        if (stub == null) {
1693118f484424f3e5649833df42a7e613f41b2b2ecdDaniel Sandler            mClingShown = true;
1694118f484424f3e5649833df42a7e613f41b2b2ecdDaniel Sandler            return; // no clings on this device
1695118f484424f3e5649833df42a7e613f41b2b2ecdDaniel Sandler        }
1696118f484424f3e5649833df42a7e613f41b2b2ecdDaniel Sandler
1697b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        mSuppressStatusBarDrags = true;
1698b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
1699b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        mHandler.postDelayed(new Runnable() {
1700b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            @Override
1701b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            public void run() {
1702b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                mCling = (ViewGroup) stub.inflate();
1703118f484424f3e5649833df42a7e613f41b2b2ecdDaniel Sandler
1704b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                mCling.setOnTouchListener(new View.OnTouchListener() {
1705b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                    @Override
1706b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                    public boolean onTouch(View v, MotionEvent event) {
1707b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                        return true; // e eats everything
1708b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                    }});
1709b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                mCling.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() {
1710b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                    @Override
1711b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                    public void onClick(View v) {
1712b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                        hideCling();
1713b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                    }});
1714b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
1715b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                mCling.setAlpha(0f);
1716b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                mCling.setVisibility(View.VISIBLE);
1717b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                mCling.animate().alpha(1f);
1718b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
1719b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                mClingShown = true;
1720b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                SharedPreferences.Editor editor = Prefs.edit(mContext);
1721b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                editor.putBoolean(Prefs.SHOWN_QUICK_SETTINGS_HELP, true);
1722b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                editor.apply();
1723b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
1724b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                makeExpandedVisible(true); // enforce visibility in case the shade is still animating closed
1725b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                animateExpandNotificationsPanel();
1726b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
1727b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler                mSuppressStatusBarDrags = false;
1728b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            }
1729b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        }, 500);
1730b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
1731b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        animateExpandNotificationsPanel();
1732b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    }
1733b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
1734b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler    public boolean interceptTouchEvent(MotionEvent event) {
1735808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (SPEW) {
1736808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            Slog.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled="
1737804df70112204a492730a5632e4524fddf0e4f48John Spurlock                + mDisabled + " mTracking=" + mTracking);
173896e61c3c86b2aff3d298d8757ba51eb568c30543Daniel Sandler        } else if (CHATTY) {
1739fe172cc861448cf1115195cbad5b3300357c02f0Daniel Sandler            if (event.getAction() != MotionEvent.ACTION_MOVE) {
174096e61c3c86b2aff3d298d8757ba51eb568c30543Daniel Sandler                Slog.d(TAG, String.format(
1741fe172cc861448cf1115195cbad5b3300357c02f0Daniel Sandler                            "panel: %s at (%f, %f) mDisabled=0x%08x",
1742fe172cc861448cf1115195cbad5b3300357c02f0Daniel Sandler                            MotionEvent.actionToString(event.getAction()),
174396e61c3c86b2aff3d298d8757ba51eb568c30543Daniel Sandler                            event.getRawX(), event.getRawY(), mDisabled));
174496e61c3c86b2aff3d298d8757ba51eb568c30543Daniel Sandler            }
1745808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1746808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1747151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        if (DEBUG_GESTURES) {
1748151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler            mGestureRec.add(event);
1749151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        }
17503380534a62abf20b4509db6068ac02b1b880712fDaniel Sandler
1751b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        // Cling (first-run help) handling.
1752b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        // The cling is supposed to show the first time you drag, or even tap, the status bar.
1753b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        // It should show the notification panel, then fade in after half a second, giving you
1754b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        // an explanation of what just happened, as well as teach you how to access quick
1755b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        // settings (another drag). The user can dismiss the cling by clicking OK or by
1756b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        // dragging quick settings into view.
1757b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        final int act = event.getActionMasked();
1758b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        if (mSuppressStatusBarDrags) {
1759b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            return true;
1760b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        } else if (act == MotionEvent.ACTION_UP && !mClingShown) {
1761b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            showCling();
1762b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        } else {
1763b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler            hideCling();
1764b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler        }
1765b17a726f2fb1066060b5646d35233d26222e8721Daniel Sandler
1766808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        return false;
1767808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1768808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
176908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public GestureRecorder getGestureRecorder() {
177008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return mGestureRec;
1771911fe30d5841d0622f3925a9fbc66d499965b111Jeff Brown    }
1772911fe30d5841d0622f3925a9fbc66d499965b111Jeff Brown
177360ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler    @Override // CommandQueue
1774328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler    public void setNavigationIconHints(int hints) {
1775328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler        if (hints == mNavigationIconHints) return;
1776328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler
1777328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler        mNavigationIconHints = hints;
1778328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler
1779328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler        if (mNavigationBarView != null) {
1780328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler            mNavigationBarView.setNavigationIconHints(hints);
1781328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler        }
1782328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler    }
1783328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler
1784328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler    @Override // CommandQueue
17853a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    public void setSystemUiVisibility(int vis, int mask) {
17863a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        final int oldVal = mSystemUiVisibility;
17873a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        final int newVal = (oldVal&~mask) | (vis&mask);
17883a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        final int diff = newVal ^ oldVal;
1789e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler
1790e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler        if (diff != 0) {
17913a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mSystemUiVisibility = newVal;
179260ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler
1793e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler            if (0 != (diff & View.SYSTEM_UI_FLAG_LOW_PROFILE)) {
1794e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler                final boolean lightsOut = (0 != (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE));
1795e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler                if (lightsOut) {
179611cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                    animateCollapsePanels();
1797d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                    if (mTicking) {
1798f59a90c24788d6d67a492aa5a9d8efbf350bbd7eDaniel Sandler                        haltTicker();
1799d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                    }
1800e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler                }
1801a073e570789e5b49e8339af44516444b13db4428Jim Miller
180269314e72941c86734c12476d1e61459811159b74Daniel Sandler                if (mNavigationBarView != null) {
180369314e72941c86734c12476d1e61459811159b74Daniel Sandler                    mNavigationBarView.setLowProfile(lightsOut);
180469314e72941c86734c12476d1e61459811159b74Daniel Sandler                }
1805a073e570789e5b49e8339af44516444b13db4428Jim Miller
1806d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler                setStatusBarLowProfile(lightsOut);
180760ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler            }
180860ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler
180960ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler            notifyUiVisibilityChanged();
181060ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler        }
181160ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler    }
181260ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler
1813d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler    private void setStatusBarLowProfile(boolean lightsOut) {
1814d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        if (mLightsOutAnimation == null) {
1815825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            final View notifications = mStatusBarView.findViewById(R.id.notification_icon_area);
1816825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            final View systemIcons = mStatusBarView.findViewById(R.id.statusIcons);
1817825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            final View signal = mStatusBarView.findViewById(R.id.signal_cluster);
1818825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            final View battery = mStatusBarView.findViewById(R.id.battery);
1819825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            final View clock = mStatusBarView.findViewById(R.id.clock);
1820825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler
1821825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            final AnimatorSet lightsOutAnim = new AnimatorSet();
1822825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            lightsOutAnim.playTogether(
1823825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                    ObjectAnimator.ofFloat(notifications, View.ALPHA, 0),
1824825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                    ObjectAnimator.ofFloat(systemIcons, View.ALPHA, 0),
1825825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                    ObjectAnimator.ofFloat(signal, View.ALPHA, 0),
1826825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                    ObjectAnimator.ofFloat(battery, View.ALPHA, 0.5f),
1827825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                    ObjectAnimator.ofFloat(clock, View.ALPHA, 0.5f)
1828825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                );
1829825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            lightsOutAnim.setDuration(750);
1830825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler
1831825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            final AnimatorSet lightsOnAnim = new AnimatorSet();
1832825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            lightsOnAnim.playTogether(
1833825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                    ObjectAnimator.ofFloat(notifications, View.ALPHA, 1),
1834825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                    ObjectAnimator.ofFloat(systemIcons, View.ALPHA, 1),
1835825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                    ObjectAnimator.ofFloat(signal, View.ALPHA, 1),
1836825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                    ObjectAnimator.ofFloat(battery, View.ALPHA, 1),
1837825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                    ObjectAnimator.ofFloat(clock, View.ALPHA, 1)
1838825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler                );
1839825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            lightsOnAnim.setDuration(250);
1840825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler
1841825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            mLightsOutAnimation = lightsOutAnim;
1842825b33073f90dc08ef5f0c1036ae9a1555da8f20Daniel Sandler            mLightsOnAnimation = lightsOnAnim;
1843d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        }
1844a073e570789e5b49e8339af44516444b13db4428Jim Miller
1845d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        mLightsOutAnimation.cancel();
1846d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        mLightsOnAnimation.cancel();
1847d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler
1848d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        final Animator a = lightsOut ? mLightsOutAnimation : mLightsOnAnimation;
1849d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        a.start();
1850d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler
1851d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        setAreThereNotifications();
1852d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler    }
1853d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler
1854d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler    private boolean areLightsOn() {
1855d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        return 0 == (mSystemUiVisibility & View.SYSTEM_UI_FLAG_LOW_PROFILE);
1856d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler    }
1857a073e570789e5b49e8339af44516444b13db4428Jim Miller
18589305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato    public void setLightsOn(boolean on) {
185960ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler        Log.v(TAG, "setLightsOn(" + on + ")");
186060ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler        if (on) {
18613a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            setSystemUiVisibility(0, View.SYSTEM_UI_FLAG_LOW_PROFILE);
186260ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler        } else {
18633a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE, View.SYSTEM_UI_FLAG_LOW_PROFILE);
18649305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato        }
18651d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler    }
18661d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler
186760ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler    private void notifyUiVisibilityChanged() {
18681d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler        try {
186998365d7663cbd82979a5700faf0050220b01084dJeff Brown            mWindowManagerService.statusBarVisibilityChanged(mSystemUiVisibility);
18701d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler        } catch (RemoteException ex) {
18711d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler        }
18729305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato    }
18739305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato
18745c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler    public void topAppWindowChanged(boolean showMenu) {
18755c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler        if (DEBUG) {
18765c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler            Slog.d(TAG, (showMenu?"showing":"hiding") + " the MENU button");
18775c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler        }
18785c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler        if (mNavigationBarView != null) {
1879f1ebcee22442e0bc2aa86582d352b5ee78257db3Daniel Sandler            mNavigationBarView.setMenuVisibility(showMenu);
18805c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler        }
18815c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler
18825c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler        // See above re: lights-out policy for legacy apps.
18835c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler        if (showMenu) setLightsOn(true);
18845c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler    }
18855c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler
1886328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler    @Override
1887328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler    public void setImeWindowStatus(IBinder token, int vis, int backDisposition) {
1888328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler        boolean altBack = (backDisposition == InputMethodService.BACK_DISPOSITION_WILL_DISMISS)
1889328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler            || ((vis & InputMethodService.IME_VISIBLE) != 0);
1890328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler
1891328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler        mCommandQueue.setNavigationIconHints(
1892328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler                altBack ? (mNavigationIconHints | StatusBarManager.NAVIGATION_HINT_BACK_ALT)
1893328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler                        : (mNavigationIconHints & ~StatusBarManager.NAVIGATION_HINT_BACK_ALT));
1894101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        if (mQS != null) mQS.setImeWindowStatus(vis > 0);
1895328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler    }
1896328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler
18972992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    @Override
189843229d707515ce51c52f63e15257960c6d29162cWinson Chung    public void setHardKeyboardStatus(boolean available, boolean enabled) {}
1899e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler
19000c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren    @Override
19010c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren    protected void tick(IBinder key, StatusBarNotification n, boolean firstTime) {
1902d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        // no ticking in lights-out mode
1903d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler        if (!areLightsOn()) return;
1904a073e570789e5b49e8339af44516444b13db4428Jim Miller
190526cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler        // no ticking in Setup
190626cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler        if (!isDeviceProvisioned()) return;
190726cda27d2e6f1341514943b39a4da1e55ba2197eDaniel Sandler
190861e36836b7302c8ccd30c0c07ac14d087f873c8eJohn Spurlock        // not for you
190961e36836b7302c8ccd30c0c07ac14d087f873c8eJohn Spurlock        if (!notificationIsForCurrentUser(n)) return;
191061e36836b7302c8ccd30c0c07ac14d087f873c8eJohn Spurlock
1911808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        // Show the ticker if one is requested. Also don't do this
1912808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        // until status bar window is attached to the window manager,
1913808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        // because...  well, what's the point otherwise?  And trying to
1914808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        // run a ticker without being attached will crash!
1915a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        if (n.notification.tickerText != null && mStatusBarWindow.getWindowToken() != null) {
1916808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS
1917808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                            | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) {
1918808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                mTicker.addEntry(n);
1919808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
1920808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1921808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1922808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1923808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    private class MyTicker extends Ticker {
1924dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        MyTicker(Context context, View sb) {
1925808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            super(context, sb);
1926808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1927808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1928808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        @Override
1929dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        public void tickerStarting() {
1930808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mTicking = true;
1931173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler            mStatusBarContents.setVisibility(View.GONE);
1932808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mTickerView.setVisibility(View.VISIBLE);
1933808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_up_in, null));
1934173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler            mStatusBarContents.startAnimation(loadAnim(com.android.internal.R.anim.push_up_out, null));
1935808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1936808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1937808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        @Override
1938dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        public void tickerDone() {
1939173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler            mStatusBarContents.setVisibility(View.VISIBLE);
1940808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mTickerView.setVisibility(View.GONE);
1941173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler            mStatusBarContents.startAnimation(loadAnim(com.android.internal.R.anim.push_down_in, null));
1942808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_down_out,
1943808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                        mTickingDoneListener));
1944808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1945808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1946dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        public void tickerHalting() {
1947173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler            mStatusBarContents.setVisibility(View.VISIBLE);
1948808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mTickerView.setVisibility(View.GONE);
1949173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler            mStatusBarContents.startAnimation(loadAnim(com.android.internal.R.anim.fade_in, null));
1950f59a90c24788d6d67a492aa5a9d8efbf350bbd7eDaniel Sandler            // we do not animate the ticker away at this point, just get rid of it (b/6992707)
1951808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1952808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1953808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1954808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    Animation.AnimationListener mTickingDoneListener = new Animation.AnimationListener() {;
1955808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        public void onAnimationEnd(Animation animation) {
1956808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mTicking = false;
1957808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1958808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        public void onAnimationRepeat(Animation animation) {
1959808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1960808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        public void onAnimationStart(Animation animation) {
1961808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1962808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    };
1963808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1964808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    private Animation loadAnim(int id, Animation.AnimationListener listener) {
1965f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        Animation anim = AnimationUtils.loadAnimation(mContext, id);
1966808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (listener != null) {
1967808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            anim.setAnimationListener(listener);
1968808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
1969808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        return anim;
1970808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1971808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1972488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler    public static String viewInfo(View v) {
1973488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler        return "[(" + v.getLeft() + "," + v.getTop() + ")(" + v.getRight() + "," + v.getBottom()
1974488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler                + ") " + v.getWidth() + "x" + v.getHeight() + "]";
1975808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
1976808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
1977f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1978808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        synchronized (mQueueLock) {
1979808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            pw.println("Current Status Bar state:");
1980e7237fceb1cd17af006815c4338fe8e4a7971ff7Daniel Sandler            pw.println("  mExpandedVisible=" + mExpandedVisible
1981fdbac77e829b7575e0986b7919ff545bae2144feDaniel Sandler                    + ", mTrackingPosition=" + mTrackingPosition);
1982808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            pw.println("  mTicking=" + mTicking);
1983808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            pw.println("  mTracking=" + mTracking);
1984fdbac77e829b7575e0986b7919ff545bae2144feDaniel Sandler            pw.println("  mNotificationPanel=" +
1985fdbac77e829b7575e0986b7919ff545bae2144feDaniel Sandler                    ((mNotificationPanel == null)
1986fdbac77e829b7575e0986b7919ff545bae2144feDaniel Sandler                            ? "null"
1987fdbac77e829b7575e0986b7919ff545bae2144feDaniel Sandler                            : (mNotificationPanel + " params=" + mNotificationPanel.getLayoutParams().debug(""))));
1988808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            pw.println("  mAnimating=" + mAnimating
1989808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    + ", mAnimY=" + mAnimY + ", mAnimVel=" + mAnimVel
1990808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    + ", mAnimAccel=" + mAnimAccel);
1991ed5f45ab8f26740f7f12c2ac7b46ad908f3e9ee5Jeff Brown            pw.println("  mAnimLastTimeNanos=" + mAnimLastTimeNanos);
19921dacf2772d0099ae74f42f81d162a3d0e180ffb7Dianne Hackborn            pw.println("  mAnimatingReveal=" + mAnimatingReveal
1993808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    + " mViewDelta=" + mViewDelta);
199436412a7e7c4929bdac1221b7ced9e73d0d204691Daniel Sandler            pw.println("  mDisplayMetrics=" + mDisplayMetrics);
19957c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            pw.println("  mPile: " + viewInfo(mPile));
1996808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            pw.println("  mTickerView: " + viewInfo(mTickerView));
1997808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            pw.println("  mScrollView: " + viewInfo(mScrollView)
1998808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                    + " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY());
1999808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
20007579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler
2001488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler        pw.print("  mNavigationBarView=");
2002488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler        if (mNavigationBarView == null) {
2003488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler            pw.println("null");
2004488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler        } else {
2005488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler            mNavigationBarView.dump(fd, pw, args);
2006488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler        }
2007488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler
20087579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler        if (DUMPTRUCK) {
20097579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler            synchronized (mNotificationData) {
20107579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                int N = mNotificationData.size();
20117579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                pw.println("  notification icons: " + N);
20127579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                for (int i=0; i<N; i++) {
20137579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                    NotificationData.Entry e = mNotificationData.get(i);
20147579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                    pw.println("    [" + i + "] key=" + e.key + " icon=" + e.icon);
20157579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                    StatusBarNotification n = e.notification;
20162561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler                    pw.println("         pkg=" + n.pkg + " id=" + n.id + " score=" + n.score);
20177579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                    pw.println("         notification=" + n.notification);
20187579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                    pw.println("         tickerText=\"" + n.notification.tickerText + "\"");
20197579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                }
2020808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
20217579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler
20227579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler            int N = mStatusIcons.getChildCount();
20237579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler            pw.println("  system icons: " + N);
2024808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            for (int i=0; i<N; i++) {
20257579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                StatusBarIconView ic = (StatusBarIconView) mStatusIcons.getChildAt(i);
20267579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler                pw.println("    [" + i + "] icon=" + ic);
2027808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
20285e6af448045f20f7a1b393960d200c25e9d976e8Jim Miller
202989d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler            if (false) {
203089d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler                pw.println("see the logcat for a dump of the views we have created.");
203189d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler                // must happen on ui thread
203289d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler                mHandler.post(new Runnable() {
203389d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler                        public void run() {
203489d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler                            mStatusBarView.getLocationOnScreen(mAbsPos);
203589d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler                            Slog.d(TAG, "mStatusBarView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
203689d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler                                    + ") " + mStatusBarView.getWidth() + "x"
2037a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler                                    + getStatusBarHeight());
203889d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler                            mStatusBarView.debug();
203989d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler                        }
204089d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler                    });
204189d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler            }
2042808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
204389d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler
2044151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        if (DEBUG_GESTURES) {
2045151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler            pw.print("  status bar gestures: ");
2046151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler            mGestureRec.dump(fd, pw, args);
2047151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        }
20483380534a62abf20b4509db6068ac02b1b880712fDaniel Sandler
204989d97131bd7fd7494c3469dfdf6351a84bae62bfDaniel Sandler        mNetworkController.dump(fd, pw, args);
2050808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
2051808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2052c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler    @Override
2053c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler    public void createAndAddWindows() {
2054c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        addStatusBarWindow();
2055c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler    }
2056e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
2057c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler    private void addStatusBarWindow() {
2058c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        // Put up the view
2059c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        final int height = getStatusBarHeight();
20606e8db88b4b31a6e0211561f25ee1a422e4797ba1Daniel Sandler
2061a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        // Now that the status bar window encompasses the sliding panel and its
2062a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        // translucent backdrop, the entire thing is made TRANSLUCENT and is
2063a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        // hardware-accelerated.
2064c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
2065c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler                ViewGroup.LayoutParams.MATCH_PARENT,
2066c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler                height,
2067c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler                WindowManager.LayoutParams.TYPE_STATUS_BAR,
2068c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
2069c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler                    | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
2070c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
2071a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler                PixelFormat.TRANSLUCENT);
2072c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler
20730901fda2fe59715e9522a7a190ed260b435fea24Romain Guy        lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
2074808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2075c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        lp.gravity = getStatusBarGravity();
2076c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        lp.setTitle("StatusBar");
2077c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        lp.packageName = mContext.getPackageName();
2078808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2079a310af88beeae02c7eeec99b93d5168443c59ac4Daniel Sandler        makeStatusBarView();
208098365d7663cbd82979a5700faf0050220b01084dJeff Brown        mWindowManager.addView(mStatusBarWindow, lp);
2081808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
2082808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2083808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    void setNotificationIconVisibility(boolean visible, int anim) {
2084808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        int old = mNotificationIcons.getVisibility();
2085808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        int v = visible ? View.VISIBLE : View.INVISIBLE;
2086808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        if (old != v) {
2087808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mNotificationIcons.setVisibility(v);
2088808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mNotificationIcons.startAnimation(loadAnim(anim, null));
2089808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
2090808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
2091808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
20921dacf2772d0099ae74f42f81d162a3d0e180ffb7Dianne Hackborn    void updateExpandedInvisiblePosition() {
2093c6d29fc0f552db7cfee6491530cf89f59c242bd4Daniel Sandler        mTrackingPosition = -mDisplayMetrics.heightPixels;
20941dacf2772d0099ae74f42f81d162a3d0e180ffb7Dianne Hackborn    }
20951dacf2772d0099ae74f42f81d162a3d0e180ffb7Dianne Hackborn
20961fac1fdd7917d7cb6e1cafc17c71bba12b53fc34Daniel Sandler    static final float saturate(float a) {
20971fac1fdd7917d7cb6e1cafc17c71bba12b53fc34Daniel Sandler        return a < 0f ? 0f : (a > 1f ? 1f : a);
20981fac1fdd7917d7cb6e1cafc17c71bba12b53fc34Daniel Sandler    }
20991fac1fdd7917d7cb6e1cafc17c71bba12b53fc34Daniel Sandler
21008fd12657e353a4a6f6d875a0d86850426fec00e8Chris Wren    @Override
21018fd12657e353a4a6f6d875a0d86850426fec00e8Chris Wren    protected int getExpandedViewMaxHeight() {
210221b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler        return mDisplayMetrics.heightPixels - mNotificationPanelMarginBottomPx;
210321b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler    }
210421b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler
21050c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren    @Override
210608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void updateExpandedViewPos(int thingy) {
210708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (DEBUG) Slog.v(TAG, "updateExpandedViewPos");
2108e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler
2109e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler        // on larger devices, the notification panel is propped open a bit
2110e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler        mNotificationPanel.setMinimumHeight(
2111e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler                (int)(mNotificationPanelMinHeightFrac * mCurrentDisplaySize.y));
2112e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler
211321b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mNotificationPanel.getLayoutParams();
211421b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler        lp.gravity = mNotificationPanelGravity;
21158e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        lp.leftMargin = mNotificationPanelMarginPx;
211621b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler        mNotificationPanel.setLayoutParams(lp);
2117e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler
2118e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler        if (mSettingsPanel != null) {
2119e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            lp = (FrameLayout.LayoutParams) mSettingsPanel.getLayoutParams();
2120e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            lp.gravity = mSettingsPanelGravity;
2121e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            lp.rightMargin = mNotificationPanelMarginPx;
2122e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            mSettingsPanel.setLayoutParams(lp);
2123e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler        }
2124bf526d14f3252b8a5c123291e4cd8b1c51346560Daniel Sandler
2125bf526d14f3252b8a5c123291e4cd8b1c51346560Daniel Sandler        updateCarrierLabelVisibility(false);
2126808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
2127808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2128747a9e986c634bc25be3f44c333d7c6ecd44158eDaniel Sandler    // called by makeStatusbar and also by PhoneStatusBarView
21291dacf2772d0099ae74f42f81d162a3d0e180ffb7Dianne Hackborn    void updateDisplaySize() {
213036412a7e7c4929bdac1221b7ced9e73d0d204691Daniel Sandler        mDisplay.getMetrics(mDisplayMetrics);
2131151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        if (DEBUG_GESTURES) {
2132151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler            mGestureRec.tag("display",
2133151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler                    String.format("%dx%d", mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels));
2134151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        }
21351dacf2772d0099ae74f42f81d162a3d0e180ffb7Dianne Hackborn    }
21361dacf2772d0099ae74f42f81d162a3d0e180ffb7Dianne Hackborn
2137808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    private View.OnClickListener mClearButtonListener = new View.OnClickListener() {
2138808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        public void onClick(View v) {
21398ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler            synchronized (mNotificationData) {
21402f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                // animate-swipe all dismissable notifications, then animate the shade closed
21412f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                int numChildren = mPile.getChildCount();
21428ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler
21432f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                int scrollTop = mScrollView.getScrollY();
21442f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                int scrollBottom = scrollTop + mScrollView.getHeight();
21452f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                final ArrayList<View> snapshot = new ArrayList<View>(numChildren);
21462f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                for (int i=0; i<numChildren; i++) {
21478ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                    final View child = mPile.getChildAt(i);
21482f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                    if (mPile.canChildBeDismissed(child) && child.getBottom() > scrollTop &&
21492f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                            child.getTop() < scrollBottom) {
21502f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        snapshot.add(child);
21512f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                    }
21528ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                }
215393a035cce1a3a3c70cd6f0e0a5f98ac0e4138337Craig Mautner                if (snapshot.isEmpty()) {
215411cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                    animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
215593a035cce1a3a3c70cd6f0e0a5f98ac0e4138337Craig Mautner                    return;
215693a035cce1a3a3c70cd6f0e0a5f98ac0e4138337Craig Mautner                }
21578ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                new Thread(new Runnable() {
21588ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                    @Override
21598ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                    public void run() {
21602f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        // Decrease the delay for every row we animate to give the sense of
21612f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        // accelerating the swipes
21622f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        final int ROW_DELAY_DECREMENT = 10;
21632f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        int currentDelay = 140;
21642f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        int totalDelay = 0;
21652f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
21662f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        // Set the shade-animating state to avoid doing other work during
21672f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        // all of these animations. In particular, avoid layout and
21682f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        // redrawing when collapsing the shade.
21692f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        mPile.setViewRemoval(false);
21702f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
21712f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        mPostCollapseCleanup = new Runnable() {
217293a035cce1a3a3c70cd6f0e0a5f98ac0e4138337Craig Mautner                            @Override
21738ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                            public void run() {
2174e7237fceb1cd17af006815c4338fe8e4a7971ff7Daniel Sandler                                if (DEBUG) {
2175e7237fceb1cd17af006815c4338fe8e4a7971ff7Daniel Sandler                                    Slog.v(TAG, "running post-collapse cleanup");
2176e7237fceb1cd17af006815c4338fe8e4a7971ff7Daniel Sandler                                }
21778ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                                try {
21782f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                                    mPile.setViewRemoval(true);
21798ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                                    mBarService.onClearAllNotifications();
21802f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                                } catch (Exception ex) { }
21818ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                            }
21822f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        };
21838ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler
21842f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        View sampleView = snapshot.get(0);
21852f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        int width = sampleView.getWidth();
218693a035cce1a3a3c70cd6f0e0a5f98ac0e4138337Craig Mautner                        final int velocity = width * 8; // 1000/8 = 125 ms duration
218793a035cce1a3a3c70cd6f0e0a5f98ac0e4138337Craig Mautner                        for (final View _v : snapshot) {
21882f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                            mHandler.postDelayed(new Runnable() {
21898ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                                @Override
21908ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                                public void run() {
21912f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                                    mPile.dismissRowAnimated(_v, velocity);
21928ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                                }
21932f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                            }, totalDelay);
21942f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                            currentDelay = Math.max(50, currentDelay - ROW_DELAY_DECREMENT);
21952f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                            totalDelay += currentDelay;
21968ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                        }
21972f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        // Delay the collapse animation until after all swipe animations have
21982f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        // finished. Provide some buffer because there may be some extra delay
21992f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        // before actually starting each swipe animation. Ideally, we'd
22002f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        // synchronize the end of those animations with the start of the collaps
22012f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        // exactly.
22022f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        mHandler.postDelayed(new Runnable() {
220393a035cce1a3a3c70cd6f0e0a5f98ac0e4138337Craig Mautner                            @Override
22042f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                            public void run() {
220511cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                                animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
22062f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                            }
22072f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                        }, totalDelay + 225);
22088ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                    }
22098ba33c965f940070060585e45e1c833519bb45c9Daniel Sandler                }).start();
2210808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
2211808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
2212808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    };
2213808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
22143679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler    public void startActivityDismissingKeyguard(Intent intent, boolean onlyProvisioned) {
22153679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        if (onlyProvisioned && !isDeviceProvisioned()) return;
22163679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        try {
22173679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler            // Dismiss the lock screen when Settings starts.
22183679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler            ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
22193679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        } catch (RemoteException e) {
22203679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        }
22213679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
22223679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
22233679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        animateCollapsePanels();
22243679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler    }
22253679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler
2226d309056d36759446c91ff5c1e17a217bfa4fdcfbDaniel Sandler    private View.OnClickListener mSettingsButtonListener = new View.OnClickListener() {
2227d309056d36759446c91ff5c1e17a217bfa4fdcfbDaniel Sandler        public void onClick(View v) {
2228e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            if (mHasSettingsPanel) {
2229e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                animateExpandSettingsPanel();
2230e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            } else {
22313679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                startActivityDismissingKeyguard(
22323679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                        new Intent(android.provider.Settings.ACTION_SETTINGS), true);
2233e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            }
2234d309056d36759446c91ff5c1e17a217bfa4fdcfbDaniel Sandler        }
2235d309056d36759446c91ff5c1e17a217bfa4fdcfbDaniel Sandler    };
2236d309056d36759446c91ff5c1e17a217bfa4fdcfbDaniel Sandler
22373679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler    private View.OnClickListener mClockClickListener = new View.OnClickListener() {
22383679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        public void onClick(View v) {
22393679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler            startActivityDismissingKeyguard(
22403679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    new Intent(Intent.ACTION_QUICK_CLOCK), true); // have fun, everyone
22413679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler        }
22423679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler    };
22433679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler
2244101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    private View.OnClickListener mNotificationButtonListener = new View.OnClickListener() {
2245101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        public void onClick(View v) {
2246101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler            animateExpandNotificationsPanel();
2247101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        }
2248101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    };
2249101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
2250808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
2251808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        public void onReceive(Context context, Intent intent) {
22527ff30113de68539ec840c524b8f1561f938f96c5Dianne Hackborn            if (DEBUG) Slog.v(TAG, "onReceive: " + intent);
2253808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            String action = intent.getAction();
2254ed930e5ad537eb63b3b96fd583025bf4269da16fDaniel Sandler            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
22559a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller                int flags = CommandQueue.FLAG_EXCLUDE_NONE;
22563b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
2257edbdd3a024ca35c331036823dde1f484d3333b31Daniel Sandler                    String reason = intent.getStringExtra("reason");
22589a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller                    if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
22599a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller                        flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
22603b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                    }
22613b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                }
226211cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                animateCollapsePanels(flags);
2263808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
2264ed930e5ad537eb63b3b96fd583025bf4269da16fDaniel Sandler            else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
2265ed930e5ad537eb63b3b96fd583025bf4269da16fDaniel Sandler                // no waiting!
226608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                makeExpandedInvisible();
22671bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock                notifyNavigationBarScreenOn(false);
2268ed930e5ad537eb63b3b96fd583025bf4269da16fDaniel Sandler            }
2269808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
22707f3cf9586ef51d6a870d941e56a0f12471cbbad2Daniel Sandler                if (DEBUG) {
22717f3cf9586ef51d6a870d941e56a0f12471cbbad2Daniel Sandler                    Slog.v(TAG, "configuration changed: " + mContext.getResources().getConfiguration());
22727f3cf9586ef51d6a870d941e56a0f12471cbbad2Daniel Sandler                }
2273e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler                mDisplay.getSize(mCurrentDisplaySize);
2274e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler
2275808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato                updateResources();
227621b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler                repositionNavigationBar();
227721b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler                updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
22787f3cf9586ef51d6a870d941e56a0f12471cbbad2Daniel Sandler                updateShowSearchHoldoff();
22797f3cf9586ef51d6a870d941e56a0f12471cbbad2Daniel Sandler            }
22807f3cf9586ef51d6a870d941e56a0f12471cbbad2Daniel Sandler            else if (Intent.ACTION_SCREEN_ON.equals(action)) {
22817f3cf9586ef51d6a870d941e56a0f12471cbbad2Daniel Sandler                // work around problem where mDisplay.getRotation() is not stable while screen is off (bug 7086018)
22827f3cf9586ef51d6a870d941e56a0f12471cbbad2Daniel Sandler                repositionNavigationBar();
22831bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock                notifyNavigationBarScreenOn(true);
2284808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            }
2285808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
2286808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    };
2287808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2288b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler    @Override
2289b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler    public void userSwitched(int newUserId) {
2290b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler        if (MULTIUSER_DEBUG) mNotificationPanelDebugText.setText("USER " + newUserId);
229111cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler        animateCollapsePanels();
2292b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler        updateNotificationIcons();
2293919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock        resetUserSetupObserver();
2294b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler    }
2295919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock
2296919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock    private void resetUserSetupObserver() {
2297919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock        mContext.getContentResolver().unregisterContentObserver(mUserSetupObserver);
2298919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock        mUserSetupObserver.onChange(false);
2299919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock        mContext.getContentResolver().registerContentObserver(
2300919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), true,
2301919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                mUserSetupObserver,
2302919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                mCurrentUserId);
2303919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock    }
2304919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock
2305808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    private void setIntruderAlertVisibility(boolean vis) {
23066b31880838196806dff991551f197684b5809d8bDaniel Sandler        if (!ENABLE_INTRUDERS) return;
2307fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        if (DEBUG) {
2308fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            Slog.v(TAG, (vis ? "showing" : "hiding") + " intruder alert window");
2309fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        }
2310808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mIntruderAlertView.setVisibility(vis ? View.VISIBLE : View.GONE);
2311808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
2312808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2313fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    public void dismissIntruder() {
2314fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        if (mCurrentlyIntrudingNotification == null) return;
2315fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
2316fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        try {
2317fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            mBarService.onNotificationClear(
2318fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                    mCurrentlyIntrudingNotification.pkg,
2319a073e570789e5b49e8339af44516444b13db4428Jim Miller                    mCurrentlyIntrudingNotification.tag,
2320fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler                    mCurrentlyIntrudingNotification.id);
2321fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        } catch (android.os.RemoteException ex) {
2322fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            // oh well
2323fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        }
2324fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    }
2325e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
2326808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    /**
2327808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato     * Reload some of our resources when the configuration changes.
2328808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato     *
2329808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato     * We don't reload everything when the configuration changes -- we probably
2330808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato     * should, but getting that smooth is tough.  Someday we'll fix that.  In the
2331808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato     * meantime, just update the things that we know change.
2332808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato     */
2333808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    void updateResources() {
2334f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        final Context context = mContext;
2335f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        final Resources res = context.getResources();
2336808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
23371347c30824ce3544dff03c93ffad9af7f0327e41Daniel Sandler        if (mClearButton instanceof TextView) {
23381347c30824ce3544dff03c93ffad9af7f0327e41Daniel Sandler            ((TextView)mClearButton).setText(context.getText(R.string.status_bar_clear_all_button));
23391347c30824ce3544dff03c93ffad9af7f0327e41Daniel Sandler        }
2340d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
2341d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        // Update the QuickSettings container
2342101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        if (mQS != null) mQS.updateResources();
2343d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
23447c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        loadDimens();
23457c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler    }
23465e6af448045f20f7a1b393960d200c25e9d976e8Jim Miller
23477c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler    protected void loadDimens() {
23487c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        final Resources res = mContext.getResources();
23497c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
23507c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        mNaturalBarHeight = res.getDimensionPixelSize(
23517c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler                com.android.internal.R.dimen.status_bar_height);
23527c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
23537c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        int newIconSize = res.getDimensionPixelSize(
23547c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            com.android.internal.R.dimen.status_bar_icon_size);
23557c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        int newIconHPadding = res.getDimensionPixelSize(
23567c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            R.dimen.status_bar_icon_padding);
23577c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
23587c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        if (newIconHPadding != mIconHPadding || newIconSize != mIconSize) {
23597c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler//            Slog.d(TAG, "size=" + newIconSize + " padding=" + newIconHPadding);
23607c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            mIconHPadding = newIconHPadding;
23617c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            mIconSize = newIconSize;
23627c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler            //reloadAllNotificationIcons(); // reload the tray
23637c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler        }
23647c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
2365808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore);
2366808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2367dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler        mSelfExpandVelocityPx = res.getDimension(R.dimen.self_expand_velocity);
2368dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler        mSelfCollapseVelocityPx = res.getDimension(R.dimen.self_collapse_velocity);
2369dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler        mFlingExpandMinVelocityPx = res.getDimension(R.dimen.fling_expand_min_velocity);
2370dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler        mFlingCollapseMinVelocityPx = res.getDimension(R.dimen.fling_collapse_min_velocity);
2371dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler
2372dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler        mCollapseMinDisplayFraction = res.getFraction(R.dimen.collapse_min_display_fraction, 1, 1);
2373dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler        mExpandMinDisplayFraction = res.getFraction(R.dimen.expand_min_display_fraction, 1, 1);
2374dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler
2375dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler        mExpandAccelPx = res.getDimension(R.dimen.expand_accel);
2376dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler        mCollapseAccelPx = res.getDimension(R.dimen.collapse_accel);
2377dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler
2378dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler        mFlingGestureMaxXVelocityPx = res.getDimension(R.dimen.fling_gesture_max_x_velocity);
2379a073e570789e5b49e8339af44516444b13db4428Jim Miller
2380e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler        mFlingGestureMaxOutputVelocityPx = res.getDimension(R.dimen.fling_gesture_max_output_velocity);
2381e5011a3ad4186a39f07bd155784a0b3eba404274Daniel Sandler
238221b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler        mNotificationPanelMarginBottomPx
238321b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler            = (int) res.getDimension(R.dimen.notification_panel_margin_bottom);
23848e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        mNotificationPanelMarginPx
238521b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler            = (int) res.getDimension(R.dimen.notification_panel_margin_left);
238621b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler        mNotificationPanelGravity = res.getInteger(R.integer.notification_panel_layout_gravity);
238721b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler        if (mNotificationPanelGravity <= 0) {
23888e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler            mNotificationPanelGravity = Gravity.LEFT | Gravity.TOP;
23898e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        }
23908e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        mSettingsPanelGravity = res.getInteger(R.integer.settings_panel_layout_gravity);
23918e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        if (mSettingsPanelGravity <= 0) {
23928e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler            mSettingsPanelGravity = Gravity.RIGHT | Gravity.TOP;
239321b274e8a05d83e2a6996aaeec619deaca728de4Daniel Sandler        }
23943d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler
23953d32a24adf02cecca86ec16ac8827ce195daeaecDaniel Sandler        mCarrierLabelHeight = res.getDimensionPixelSize(R.dimen.carrier_label_height);
2396bf526d14f3252b8a5c123291e4cd8b1c51346560Daniel Sandler        mNotificationHeaderHeight = res.getDimensionPixelSize(R.dimen.notification_panel_header_height);
2397dc940eaa67db0108f8a8629826dbb3c5c7d779e9Daniel Sandler
2398e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler        mNotificationPanelMinHeightFrac = res.getFraction(R.dimen.notification_panel_min_height_frac, 1, 1);
2399e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler        if (mNotificationPanelMinHeightFrac < 0f || mNotificationPanelMinHeightFrac > 1f) {
2400e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler            mNotificationPanelMinHeightFrac = 0f;
2401804df70112204a492730a5632e4524fddf0e4f48John Spurlock        }
2402e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler
2403e680f5483f845e2c9f75b80358599b5d654a9f8bDaniel Sandler        if (false) Slog.v(TAG, "updateResources");
2404804df70112204a492730a5632e4524fddf0e4f48John Spurlock    }
2405804df70112204a492730a5632e4524fddf0e4f48John Spurlock
2406808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    //
2407808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    // tracing
2408808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    //
2409808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2410808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    void postStartTracing() {
2411808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mHandler.postDelayed(mStartTracing, 3000);
2412808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
2413808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2414808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    void vibrate() {
2415f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        android.os.Vibrator vib = (android.os.Vibrator)mContext.getSystemService(
2416f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato                Context.VIBRATOR_SERVICE);
2417808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        vib.vibrate(250);
2418808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
2419808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2420808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    Runnable mStartTracing = new Runnable() {
2421808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        public void run() {
2422808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            vibrate();
2423808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            SystemClock.sleep(250);
2424808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            Slog.d(TAG, "startTracing");
2425808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            android.os.Debug.startMethodTracing("/data/statusbar-traces/trace");
2426808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            mHandler.postDelayed(mStopTracing, 10000);
2427808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
2428808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    };
2429808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2430808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    Runnable mStopTracing = new Runnable() {
2431808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        public void run() {
2432808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            android.os.Debug.stopMethodTracing();
2433808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            Slog.d(TAG, "stopTracing");
2434808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            vibrate();
2435808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        }
2436808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    };
24370c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren
24380c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren    @Override
24390c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren    protected void haltTicker() {
24400c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren        mTicker.halt();
24410c8275b392344c24bb621b2a8af360f48a6459f9Chris Wren    }
2442670d9dd2d04c2146d00b697f7f0faea258297a81Jim Miller
2443670d9dd2d04c2146d00b697f7f0faea258297a81Jim Miller    @Override
2444b4238e0c59d8e1890f7752934bdf4d52fa89bf1bJim Miller    protected boolean shouldDisableNavbarGestures() {
2445d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler        return !isDeviceProvisioned()
2446d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler                || mExpandedVisible
2447d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler                || (mDisabled & StatusBarManager.DISABLE_SEARCH) != 0;
2448670d9dd2d04c2146d00b697f7f0faea258297a81Jim Miller    }
2449808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
2450648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy    private static class FastColorDrawable extends Drawable {
2451648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        private final int mColor;
2452648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy
2453648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        public FastColorDrawable(int color) {
2454648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy            mColor = 0xff000000 | color;
2455648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        }
2456648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy
2457648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        @Override
2458648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        public void draw(Canvas canvas) {
2459648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy            canvas.drawColor(mColor, PorterDuff.Mode.SRC);
2460648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        }
2461648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy
2462648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        @Override
2463648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        public void setAlpha(int alpha) {
2464648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        }
2465648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy
2466648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        @Override
2467648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        public void setColorFilter(ColorFilter cf) {
2468648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        }
2469648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy
2470648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        @Override
2471648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        public int getOpacity() {
2472648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy            return PixelFormat.OPAQUE;
2473648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        }
2474648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy
2475648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        @Override
2476648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        public void setBounds(int left, int top, int right, int bottom) {
2477648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        }
2478648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy
2479648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        @Override
2480648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        public void setBounds(Rect bounds) {
2481648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy        }
2482648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy    }
2483648342f1f257663fc5b3065b23c80eb015edfbeaRomain Guy}
2484