PhoneStatusBar.java revision f579adc8d5e4173e106757db13095989eaa374ab
16315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr/*
2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * Copyright (C) 2010 The Android Open Source Project
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao *
4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
59ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao * you may not use this file except in compliance with the License.
69ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao * You may obtain a copy of the License at
7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao *
86315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr *      http://www.apache.org/licenses/LICENSE-2.0
96315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr *
106315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr * Unless required by applicable law or agreed to in writing, software
116315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr * distributed under the License is distributed on an "AS IS" BASIS,
126315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr * See the License for the specific language governing permissions and
146315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr * limitations under the License.
159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao */
169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopackage com.android.systemui.statusbar.phone;
189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport static android.app.StatusBarManager.windowStateToString;
239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT;
269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT;
279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport android.animation.Animator;
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.animation.AnimatorListenerAdapter;
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport android.animation.ObjectAnimator;
319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.animation.TimeInterpolator;
329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.app.ActivityManager;
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport android.app.ActivityManagerNative;
349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.app.Notification;
35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport android.app.PendingIntent;
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.app.StatusBarManager;
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.content.BroadcastReceiver;
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.content.Context;
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.content.Intent;
40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport android.content.IntentFilter;
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.content.res.Configuration;
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.content.res.Resources;
43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport android.database.ContentObserver;
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.graphics.Canvas;
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.graphics.ColorFilter;
46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport android.graphics.PixelFormat;
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.graphics.Point;
48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport android.graphics.PorterDuff;
49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport android.graphics.Rect;
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.graphics.drawable.Drawable;
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.inputmethodservice.InputMethodService;
5291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liaoimport android.os.Bundle;
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.os.Handler;
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.os.IBinder;
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.os.Message;
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.os.PowerManager;
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.os.RemoteException;
589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.os.SystemClock;
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.os.UserHandle;
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.provider.Settings;
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.service.notification.StatusBarNotification;
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.util.DisplayMetrics;
6391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liaoimport android.util.EventLog;
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.util.Log;
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.view.Display;
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.view.Gravity;
679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.view.MotionEvent;
689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.view.VelocityTracker;
6992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changimport android.view.View;
7092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changimport android.view.ViewGroup;
7192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changimport android.view.ViewGroup.LayoutParams;
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.view.ViewPropertyAnimator;
7392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changimport android.view.ViewStub;
7492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changimport android.view.WindowManager;
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.view.animation.AccelerateInterpolator;
7692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changimport android.view.animation.Animation;
7792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changimport android.view.animation.AnimationUtils;
7892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changimport android.view.animation.DecelerateInterpolator;
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.widget.FrameLayout;
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.widget.ImageView;
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.widget.LinearLayout;
829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.widget.ScrollView;
839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport android.widget.TextView;
849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.internal.statusbar.StatusBarIcon;
869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.DemoMode;
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.EventLogTags;
889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.R;
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.BaseStatusBar;
909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.CommandQueue;
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.GestureRecorder;
929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.NotificationData;
93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport com.android.systemui.statusbar.NotificationData.Entry;
94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoimport com.android.systemui.statusbar.SignalClusterView;
959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.StatusBarIconView;
969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.policy.BatteryController;
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.policy.BluetoothController;
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.policy.DateView;
999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.policy.HeadsUpNotificationView;
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.policy.LocationController;
1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.policy.NetworkController;
1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.policy.NotificationRowLayout;
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.policy.OnSizeChangedListener;
1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport com.android.systemui.statusbar.policy.RotationLockController;
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoimport java.io.FileDescriptor;
10791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liaoimport java.io.PrintWriter;
10891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liaoimport java.util.ArrayList;
1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaopublic class PhoneStatusBar extends BaseStatusBar implements DemoMode {
1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    static final String TAG = "PhoneStatusBar";
1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public static final boolean DEBUG = BaseStatusBar.DEBUG;
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public static final boolean SPEW = false;
1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public static final boolean DUMPTRUCK = true; // extra dumpsys info
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public static final boolean DEBUG_GESTURES = false;
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public static final boolean DEBUG_WINDOW_STATE = false;
1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public static final boolean SETTINGS_DRAG_SHORTCUT = true;
1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // additional instrumentation for testing purposes; intended to be left on during development
1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public static final boolean CHATTY = DEBUG;
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public static final String ACTION_STATUSBAR_START
1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            = "com.android.internal.policy.statusbar.START";
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private static final int MSG_OPEN_NOTIFICATION_PANEL = 1000;
1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private static final int MSG_CLOSE_PANELS = 1001;
1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private static final int MSG_OPEN_SETTINGS_PANEL = 1002;
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // 1020-1030 reserved for BaseStatusBar
1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private static final boolean CLOSE_PANEL_WHEN_EMPTIED = true;
1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private static final int NOTIFICATION_PRIORITY_MULTIPLIER = 10; // see NotificationManagerService
1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private static final int HIDE_ICONS_BELOW_SCORE = Notification.PRIORITY_LOW * NOTIFICATION_PRIORITY_MULTIPLIER;
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    private static final int STATUS_OR_NAV_TRANSIENT =
1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            View.STATUS_BAR_TRANSIENT | View.NAVIGATION_BAR_TRANSIENT;
1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private static final long AUTOHIDE_TIMEOUT_MS = 3000;
1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    // fling gesture tuning parameters, scaled to display density
1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private float mSelfExpandVelocityPx; // classic value: 2000px/s
143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    private float mSelfCollapseVelocityPx; // classic value: 2000px/s (will be negated to collapse "up")
144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    private float mFlingExpandMinVelocityPx; // classic value: 200px/s
14592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    private float mFlingCollapseMinVelocityPx; // classic value: 200px/s
14692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    private float mCollapseMinDisplayFraction; // classic value: 0.08 (25px/min(320px,480px) on G1)
14792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    private float mExpandMinDisplayFraction; // classic value: 0.5 (drag open halfway to expand)
14892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    private float mFlingGestureMaxXVelocityPx; // classic value: 150px/s
14992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
15092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    private float mExpandAccelPx; // classic value: 2000px/s/s
15192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    private float mCollapseAccelPx; // classic value: 2000px/s/s (will be negated to collapse "up")
15292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
15392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    private float mFlingGestureMaxOutputVelocityPx; // how fast can it really go? (should be a little
15492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                                                    // faster than mSelfCollapseVelocityPx)
15592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
15692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    PhoneStatusBarPolicy mIconPolicy;
15792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
15892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    // These are no longer handled by the policy, because we need custom strategies for them
15992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    BluetoothController mBluetoothController;
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    BatteryController mBatteryController;
1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LocationController mLocationController;
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    NetworkController mNetworkController;
1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    RotationLockController mRotationLockController;
1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mNaturalBarHeight = -1;
1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mIconSize = -1;
167324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    int mIconHPadding = -1;
1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    Display mDisplay;
1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    Point mCurrentDisplaySize = new Point();
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private float mHeadsUpVerticalOffset;
171324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    private int[] mPilePosition = new int[2];
1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
173324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    StatusBarWindowView mStatusBarWindow;
174324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    PhoneStatusBarView mStatusBarView;
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private int mStatusBarWindowState = WINDOW_STATE_SHOWING;
1766315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
17791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    int mPixelFormat;
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    Object mQueueLock = new Object();
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // viewgroup containing the normal contents of the statusbar
1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LinearLayout mStatusBarContents;
1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // right-hand icons
1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LinearLayout mSystemIconArea;
1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // left-hand icons
1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    LinearLayout mStatusIcons;
18891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    // the icons themselves
1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    IconMerger mNotificationIcons;
1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // [+>
1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    View mMoreIcon;
1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // expanded notifications
19491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window
19591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    ScrollView mScrollView;
19691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    View mExpandedContents;
1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mNotificationPanelGravity;
1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mNotificationPanelMarginBottomPx, mNotificationPanelMarginPx;
1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    float mNotificationPanelMinHeightFrac;
2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    boolean mNotificationPanelIsFullScreenWidth;
2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    TextView mNotificationPanelDebugText;
2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // settings
2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    QuickSettings mQS;
2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    boolean mHasSettingsPanel, mHasFlipSettings;
2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    SettingsPanelView mSettingsPanel;
2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    View mFlipSettingsView;
2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    QuickSettingsContainerView mSettingsContainer;
2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mSettingsPanelGravity;
2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // top bar
2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    View mNotificationPanelHeader;
2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    View mDateTimeView;
2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    View mClearButton;
2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    ImageView mSettingsButton, mNotificationButton;
2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    // carrier/wifi label
218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    private TextView mCarrierLabel;
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private boolean mCarrierLabelVisible = false;
2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private int mCarrierLabelHeight;
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private TextView mEmergencyCallLabel;
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private int mNotificationHeaderHeight;
2236315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
2246315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    private boolean mShowCarrierInPanel = false;
2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // position
2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int[] mPositionTmp = new int[2];
2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    boolean mExpandedVisible;
2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // the date view
2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    DateView mDateView;
2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // for heads up notifications
2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private HeadsUpNotificationView mHeadsUpNotificationView;
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private int mHeadsUpNotificationDecay;
236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // on-screen navigation buttons
2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private NavigationBarView mNavigationBarView = null;
2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
24192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    // the tracker view
24292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    int mTrackingPosition; // the position of the top of the tracking view.
24392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
24492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    // ticker
2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private Ticker mTicker;
2466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    private View mTickerView;
2476315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    private boolean mTicking;
2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Tracking finger for opening/closing.
2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mEdgeBorder; // corresponds to R.dimen.status_bar_edge_ignore
2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    boolean mTracking;
2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    VelocityTracker mVelocityTracker;
2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    int[] mAbsPos = new int[2];
2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    Runnable mPostCollapseCleanup = null;
256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    // for disabling the status bar
2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mDisabled = 0;
2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // tracking calls to View.setSystemUiVisibility()
2616315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
2626315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    DisplayMetrics mDisplayMetrics = new DisplayMetrics();
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
26591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    // XXX: gesture research
26691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    private final GestureRecorder mGestureRec = DEBUG_GESTURES
26791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        ? new GestureRecorder("/sdcard/statusbar_gestures.dat")
26891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        : null;
26991a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao
27091a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    private int mNavigationIconHints = 0;
27191a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    private final Animator.AnimatorListener mMakeIconsInvisible = new AnimatorListenerAdapter() {
27291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        @Override
27391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        public void onAnimationEnd(Animator animation) {
27491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            // double-check to avoid races
27591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            if (mStatusBarContents.getAlpha() == 0) {
27691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao                if (DEBUG) Log.d(TAG, "makeIconsInvisible");
2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mStatusBarContents.setVisibility(View.INVISIBLE);
2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    };
2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
28292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    // ensure quick settings is disabled until the current user makes it through the setup wizard
28392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    private boolean mUserSetup = false;
28492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    private ContentObserver mUserSetupObserver = new ContentObserver(new Handler()) {
2859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        @Override
2866315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        public void onChange(boolean selfChange) {
2876315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr            final boolean userSetup = 0 != Settings.Secure.getIntForUser(
2886315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                    mContext.getContentResolver(),
2896315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                    Settings.Secure.USER_SETUP_COMPLETE,
2906315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                    0 /*default */,
2916315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                    mCurrentUserId);
2929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (MULTIUSER_DEBUG) Log.d(TAG, String.format("User setup changed: " +
2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "selfChange=%s userSetup=%s mUserSetup=%s",
2949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    selfChange, userSetup, mUserSetup));
2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mSettingsButton != null && mHasFlipSettings) {
2969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mSettingsButton.setVisibility(userSetup ? View.VISIBLE : View.INVISIBLE);
2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
2989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mSettingsPanel != null) {
2999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mSettingsPanel.setEnabled(userSetup);
3009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
3019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (userSetup != mUserSetup) {
3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mUserSetup = userSetup;
3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                if (!mUserSetup && mStatusBarView != null)
3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    animateCollapseQuickSettings();
3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
3069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
3079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    };
3089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    final private ContentObserver mHeadsUpObserver = new ContentObserver(mHandler) {
3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        @Override
3119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        public void onChange(boolean selfChange) {
3129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            boolean wasUsing = mUseHeadsUp;
31391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            mUseHeadsUp = ENABLE_HEADS_UP && 0 != Settings.Global.getInt(
3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mContext.getContentResolver(), SETTING_HEADS_UP, 0);
31591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            Log.d(TAG, "heads up is " + (mUseHeadsUp ? "enabled" : "disabled"));
3169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (wasUsing != mUseHeadsUp) {
31791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao                if (!mUseHeadsUp) {
318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    Log.d(TAG, "dismissing any existing heads up notification on disable event");
3199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mHandler.sendEmptyMessage(MSG_HIDE_HEADS_UP);
3209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    removeHeadsUpView();
32191a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao                } else {
3229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    addHeadsUpView();
3239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
32491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            }
3259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
32691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    };
32791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao
32891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    private int mInteractingWindows;
3299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private boolean mAutohideSuspended;
3309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private int mStatusBarMode;
33191a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    private int mNavigationBarMode;
3329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private Boolean mScreenOn;
3339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
33492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    private final Runnable mAutohide = new Runnable() {
33592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        @Override
33692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        public void run() {
33792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            int requested = mSystemUiVisibility & ~STATUS_OR_NAV_TRANSIENT;
33892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            if (mSystemUiVisibility != requested) {
33992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                notifyUiVisibilityChanged(requested);
34092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            }
34192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        }};
34292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
34392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    @Override
34492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    public void start() {
34592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
34692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                .getDefaultDisplay();
34792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        updateDisplaySize();
34892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
34992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        super.start(); // calls createAndAddWindows()
35092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
35192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        addNavigationBar();
35292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
3539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Lastly, call to the icon policy to install/update all the icons.
3549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mIconPolicy = new PhoneStatusBarPolicy(mContext);
3556315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
3569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mHeadsUpObserver.onChange(true); // set up
3579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (ENABLE_HEADS_UP) {
358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mContext.getContentResolver().registerContentObserver(
3599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    Settings.Global.getUriFor(SETTING_HEADS_UP), true,
360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    mHeadsUpObserver);
361462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
3629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
3639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // ================================================================================
3659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Constructing the view
3669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // ================================================================================
3679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected PhoneStatusBarView makeStatusBarView() {
3689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final Context context = mContext;
3699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Resources res = context.getResources();
3719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        updateDisplaySize(); // populates mDisplayMetrics
3739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        loadDimens();
3749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size);
3769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mStatusBarWindow = (StatusBarWindowView) View.inflate(context,
378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                R.layout.super_status_bar, null);
3799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mStatusBarWindow.mService = this;
3809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mStatusBarWindow.setOnTouchListener(new View.OnTouchListener() {
38191a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            @Override
3829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            public boolean onTouch(View v, MotionEvent event) {
3839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                checkUserAutohide(v, event);
3849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                if (event.getAction() == MotionEvent.ACTION_DOWN) {
3859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    if (mExpandedVisible) {
3869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        animateCollapsePanels();
3879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }
3889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
3899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                return mStatusBarWindow.onTouchEvent(event);
3909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }});
3919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
39291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        mStatusBarView = (PhoneStatusBarView) mStatusBarWindow.findViewById(R.id.status_bar);
39391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        mStatusBarView.setBar(this);
39491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao
3959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        PanelHolder holder = (PanelHolder) mStatusBarWindow.findViewById(R.id.panel_holder);
39691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        mStatusBarView.setPanelHolder(holder);
3979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
39891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        mNotificationPanel = (NotificationPanelView) mStatusBarWindow.findViewById(R.id.notification_panel);
3999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationPanel.setStatusBar(this);
4009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationPanelIsFullScreenWidth =
40192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            (mNotificationPanel.getLayoutParams().width == ViewGroup.LayoutParams.MATCH_PARENT);
40292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
40392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        // make the header non-responsive to clicks
40492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        mNotificationPanel.findViewById(R.id.header).setOnTouchListener(
4059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                new View.OnTouchListener() {
4069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    @Override
4079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    public boolean onTouch(View v, MotionEvent event) {
4089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        return true; // e eats everything
4099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }
4109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                });
4119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!ActivityManager.isHighEndGfx()) {
4139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mStatusBarWindow.setBackground(null);
4149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNotificationPanel.setBackground(new FastColorDrawable(context.getResources().getColor(
4159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    R.color.notification_panel_solid_background)));
4169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
4179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (ENABLE_HEADS_UP) {
4189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mHeadsUpNotificationView =
4199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    (HeadsUpNotificationView) View.inflate(context, R.layout.heads_up, null);
4209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mHeadsUpNotificationView.setVisibility(View.GONE);
4219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mHeadsUpNotificationView.setBar(this);
4229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
4239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (MULTIUSER_DEBUG) {
4249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNotificationPanelDebugText = (TextView) mNotificationPanel.findViewById(R.id.header_debug_info);
4259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNotificationPanelDebugText.setVisibility(View.VISIBLE);
4269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
4279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        updateShowSearchHoldoff();
4299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        try {
4319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            boolean showNav = mWindowManagerService.hasNavigationBar();
4329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (DEBUG) Log.v(TAG, "hasNavigationBar=" + showNav);
433462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if (showNav) {
434462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                mNavigationBarView =
4359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    (NavigationBarView) View.inflate(context, R.layout.navigation_bar, null);
4369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNavigationBarView.setDisabledFlags(mDisabled);
4389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNavigationBarView.setBar(this);
4399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNavigationBarView.setOnTouchListener(new View.OnTouchListener() {
4409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    @Override
4419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    public boolean onTouch(View v, MotionEvent event) {
4429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        checkUserAutohide(v, event);
4439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        return false;
4449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }});
4456315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr            }
4466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        } catch (RemoteException ex) {
4479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // no window manager? good luck with that
4489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
4499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // figure out which pixel-format to use for the status bar.
4516de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao        mPixelFormat = PixelFormat.OPAQUE;
4529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mSystemIconArea = (LinearLayout) mStatusBarView.findViewById(R.id.system_icon_area);
4548b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        mStatusIcons = (LinearLayout)mStatusBarView.findViewById(R.id.statusIcons);
4558b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        mNotificationIcons = (IconMerger)mStatusBarView.findViewById(R.id.notificationIcons);
4569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mMoreIcon = mStatusBarView.findViewById(R.id.moreIcon);
4579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationIcons.setOverflowIndicator(mMoreIcon);
4589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mStatusBarContents = (LinearLayout)mStatusBarView.findViewById(R.id.status_bar_contents);
4599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mTickerView = mStatusBarView.findViewById(R.id.ticker);
4609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mPile = (NotificationRowLayout)mStatusBarWindow.findViewById(R.id.latestItems);
4629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mPile.setLayoutTransitionsEnabled(false);
4639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mPile.setLongPressListener(getNotificationLongClicker());
4649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mExpandedContents = mPile; // was: expanded.findViewById(R.id.notificationLinearLayout);
4659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationPanelHeader = mStatusBarWindow.findViewById(R.id.header);
4679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mClearButton = mStatusBarWindow.findViewById(R.id.clear_all_button);
4699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mClearButton.setOnClickListener(mClearButtonListener);
4709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mClearButton.setAlpha(0f);
4719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mClearButton.setVisibility(View.INVISIBLE);
4729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mClearButton.setEnabled(false);
4739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mDateView = (DateView)mStatusBarWindow.findViewById(R.id.date);
4749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mHasSettingsPanel = res.getBoolean(R.bool.config_hasSettingsPanel);
4769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mHasFlipSettings = res.getBoolean(R.bool.config_hasFlipSettingsPanel);
4779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mDateTimeView = mNotificationPanelHeader.findViewById(R.id.datetime);
4799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mDateTimeView != null) {
4809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mDateTimeView.setOnClickListener(mClockClickListener);
4819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mDateTimeView.setEnabled(true);
4829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
4839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mSettingsButton = (ImageView) mStatusBarWindow.findViewById(R.id.settings_button);
4859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mSettingsButton != null) {
4869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mSettingsButton.setOnClickListener(mSettingsButtonListener);
4879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mHasSettingsPanel) {
4889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                if (mStatusBarView.hasFullWidthNotifications()) {
4899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    // the settings panel is hiding behind this button
4909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mSettingsButton.setImageResource(R.drawable.ic_notify_quicksettings);
4919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mSettingsButton.setVisibility(View.VISIBLE);
492462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                } else {
4939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    // there is a settings panel, but it's on the other side of the (large) screen
4949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    final View buttonHolder = mStatusBarWindow.findViewById(
4959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            R.id.settings_button_holder);
4969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    if (buttonHolder != null) {
4979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        buttonHolder.setVisibility(View.GONE);
4989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }
4999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
5009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            } else {
5019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                // no settings panel, go straight to settings
5029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mSettingsButton.setVisibility(View.VISIBLE);
5039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mSettingsButton.setImageResource(R.drawable.ic_notify_settings);
5049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
5059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
5069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mHasFlipSettings) {
5079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNotificationButton = (ImageView) mStatusBarWindow.findViewById(R.id.notification_button);
5089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mNotificationButton != null) {
5099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNotificationButton.setOnClickListener(mNotificationButtonListener);
5109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
5119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
5129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mScrollView = (ScrollView)mStatusBarWindow.findViewById(R.id.scroll);
5149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mScrollView.setVerticalScrollBarEnabled(false); // less drawing during pulldowns
5159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!mNotificationPanelIsFullScreenWidth) {
5169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mScrollView.setSystemUiVisibility(
5179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER |
5189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    View.STATUS_BAR_DISABLE_NOTIFICATION_ICONS |
5199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    View.STATUS_BAR_DISABLE_CLOCK);
5209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
5219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mTicker = new MyTicker(context, mStatusBarView);
5239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        TickerView tickerView = (TickerView)mStatusBarView.findViewById(R.id.tickerText);
525462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        tickerView.mTicker = mTicker;
5269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore);
5289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // set the inital view visibility
530462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        setAreThereNotifications();
5319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Other icons
5339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mLocationController = new LocationController(mContext); // will post a notification
534462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mBatteryController = new BatteryController(mContext);
53592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        mNetworkController = new NetworkController(mContext);
53692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        mBluetoothController = new BluetoothController(mContext);
537324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        mRotationLockController = new RotationLockController(mContext);
5389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final SignalClusterView signalCluster =
539462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                (SignalClusterView)mStatusBarView.findViewById(R.id.signal_cluster);
540462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
5419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNetworkController.addSignalCluster(signalCluster);
5439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        signalCluster.setNetworkController(mNetworkController);
5449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
54548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao        final boolean isAPhone = mNetworkController.hasVoiceCallingFeature();
5469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (isAPhone) {
5479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mEmergencyCallLabel =
5489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    (TextView) mStatusBarWindow.findViewById(R.id.emergency_calls_only);
5499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mEmergencyCallLabel != null) {
5509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNetworkController.addEmergencyLabelView(mEmergencyCallLabel);
5519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mEmergencyCallLabel.setOnClickListener(new View.OnClickListener() {
5529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    public void onClick(View v) { }});
5539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mEmergencyCallLabel.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
5549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    @Override
5559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    public void onLayoutChange(View v, int left, int top, int right, int bottom,
5569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            int oldLeft, int oldTop, int oldRight, int oldBottom) {
5579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        updateCarrierLabelVisibility(false);
5589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }});
5599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
5609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
56148bac230fe966771f3074975fc2426ffde519edfShih-wei Liao
5629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mCarrierLabel = (TextView)mStatusBarWindow.findViewById(R.id.carrier_label);
5639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mShowCarrierInPanel = (mCarrierLabel != null);
5649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (DEBUG) Log.v(TAG, "carrierlabel=" + mCarrierLabel + " show=" + mShowCarrierInPanel);
5659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mShowCarrierInPanel) {
5669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mCarrierLabel.setVisibility(mCarrierLabelVisible ? View.VISIBLE : View.INVISIBLE);
5679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
56848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao            // for mobile devices, we always show mobile connection info here (SPN/PLMN)
5699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // for other devices, we show whatever network is connected
5709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mNetworkController.hasMobileDataFeature()) {
5719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNetworkController.addMobileLabelView(mCarrierLabel);
5729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            } else {
5739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNetworkController.addCombinedLabelView(mCarrierLabel);
57448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao            }
5759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
57648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao            // set up the dynamic hide/show of the label
57748bac230fe966771f3074975fc2426ffde519edfShih-wei Liao            mPile.setOnSizeChangedListener(new OnSizeChangedListener() {
5789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                @Override
5799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                public void onSizeChanged(View view, int w, int h, int oldw, int oldh) {
5809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    updateCarrierLabelVisibility(false);
5819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
5829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            });
5839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
5849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Quick Settings (where available, some restrictions apply)
5869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mHasSettingsPanel) {
5879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // first, figure out where quick settings should be inflated
5889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            final View settings_stub;
58991a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            if (mHasFlipSettings) {
5909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                // a version of quick settings that flips around behind the notifications
5919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                settings_stub = mStatusBarWindow.findViewById(R.id.flip_settings_stub);
5929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                if (settings_stub != null) {
5932239ecece40c177e071f56326cd5ef423806394dShih-wei Liao                    mFlipSettingsView = ((ViewStub)settings_stub).inflate();
5949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mFlipSettingsView.setVisibility(View.GONE);
595324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                    mFlipSettingsView.setVerticalScrollBarEnabled(false);
596324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                }
5979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            } else {
5989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                // full quick settings panel
5999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                settings_stub = mStatusBarWindow.findViewById(R.id.quick_settings_stub);
6009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                if (settings_stub != null) {
6019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mSettingsPanel = (SettingsPanelView) ((ViewStub)settings_stub).inflate();
6029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                } else {
603324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                    mSettingsPanel = (SettingsPanelView) mStatusBarWindow.findViewById(R.id.settings_panel);
6049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
6059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
6069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                if (mSettingsPanel != null) {
6079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    if (!ActivityManager.isHighEndGfx()) {
6089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        mSettingsPanel.setBackground(new FastColorDrawable(context.getResources().getColor(
6099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                R.color.notification_panel_solid_background)));
6109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }
6119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
6129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
6139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
6149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // wherever you find it, Quick Settings needs a container to survive
61548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao            mSettingsContainer = (QuickSettingsContainerView)
616324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                    mStatusBarWindow.findViewById(R.id.quick_settings_container);
6179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mSettingsContainer != null) {
6189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mQS = new QuickSettings(mContext, mSettingsContainer);
6199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                if (!mNotificationPanelIsFullScreenWidth) {
6209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mSettingsContainer.setSystemUiVisibility(
6219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER
6229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            | View.STATUS_BAR_DISABLE_SYSTEM_INFO);
6239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
6249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                if (mSettingsPanel != null) {
6259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mSettingsPanel.setQuickSettings(mQS);
6269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
6279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mQS.setService(this);
6289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mQS.setBar(mStatusBarView);
6299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mQS.setup(mNetworkController, mBluetoothController, mBatteryController,
630324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                        mLocationController, mRotationLockController);
631324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            } else {
6329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mQS = null; // fly away, be free
6339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
6349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
6359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
6369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
637324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        mBroadcastReceiver.onReceive(mContext,
6389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                new Intent(pm.isScreenOn() ? Intent.ACTION_SCREEN_ON : Intent.ACTION_SCREEN_OFF));
6399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
640324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        // receive broadcasts
641324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        IntentFilter filter = new IntentFilter();
64292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
64392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        filter.addAction(Intent.ACTION_SCREEN_OFF);
64492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        filter.addAction(Intent.ACTION_SCREEN_ON);
64592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        filter.addAction(ACTION_DEMO);
6469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        context.registerReceiver(mBroadcastReceiver, filter);
6479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
6489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // listen for USER_SETUP_COMPLETE setting (per-user)
6496315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        resetUserSetupObserver();
6506315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
651462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return mStatusBarView;
6529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
6539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
654462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    @Override
6559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected void onShowSearchPanel() {
6569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNavigationBarView != null) {
6579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNavigationBarView.getBarTransitions().setContentVisible(false);
658462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
6599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
6609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
6619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
6629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected void onHideSearchPanel() {
6639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNavigationBarView != null) {
6649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNavigationBarView.getBarTransitions().setContentVisible(true);
665462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
6669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
6679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
668462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    @Override
6699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected View getStatusBarView() {
6709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return mStatusBarView;
6719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
6729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
6739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
6749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected WindowManager.LayoutParams getSearchLayoutParams(LayoutParams layoutParams) {
6759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        boolean opaque = false;
6769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
677462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                LayoutParams.MATCH_PARENT,
678462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                LayoutParams.MATCH_PARENT,
6799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
6809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
6819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
6829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
6839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                (opaque ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT));
684462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if (ActivityManager.isHighEndGfx()) {
685462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
6869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
6879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.gravity = Gravity.BOTTOM | Gravity.START;
688462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        lp.setTitle("SearchPanel");
6899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // TODO: Define custom animation for Search panel
6909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.windowAnimations = com.android.internal.R.style.Animation_RecentApplications;
6919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
692462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
6939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return lp;
6949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
6959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
6969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
6979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected void updateSearchPanel() {
698462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        super.updateSearchPanel();
6999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNavigationBarView != null) {
7009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNavigationBarView.setDelegateView(mSearchPanelView);
7019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
702462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
7039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
7059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void showSearchPanel() {
7069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        super.showSearchPanel();
70792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        mHandler.removeCallbacks(mShowSearchPanel);
70892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
70992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        // we want to freeze the sysui state wherever it is
71092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        mSearchPanelView.setSystemUiVisibility(mSystemUiVisibility);
7119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNavigationBarView != null) {
7139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            WindowManager.LayoutParams lp =
714c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao                (android.view.WindowManager.LayoutParams) mNavigationBarView.getLayoutParams();
7159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
7169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mWindowManager.updateViewLayout(mNavigationBarView, lp);
7179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
7189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
719462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
7209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
721462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    public void hideSearchPanel() {
722462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        super.hideSearchPanel();
7239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNavigationBarView != null) {
7249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            WindowManager.LayoutParams lp =
7259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                (android.view.WindowManager.LayoutParams) mNavigationBarView.getLayoutParams();
7269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            lp.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
7279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mWindowManager.updateViewLayout(mNavigationBarView, lp);
7289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
7299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
7309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected int getStatusBarGravity() {
7329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return Gravity.TOP | Gravity.FILL_HORIZONTAL;
7339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
7349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public int getStatusBarHeight() {
7366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        if (mNaturalBarHeight < 0) {
7379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            final Resources res = mContext.getResources();
7389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNaturalBarHeight =
7399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
7409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
7419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return mNaturalBarHeight;
7429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
7439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private View.OnClickListener mRecentsClickListener = new View.OnClickListener() {
7459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        public void onClick(View v) {
7469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            awakenDreams();
7479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            toggleRecentApps();
7489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
7499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    };
7509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private int mShowSearchHoldoff = 0;
7529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private Runnable mShowSearchPanel = new Runnable() {
7539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        public void run() {
7549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            showSearchPanel();
7559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            awakenDreams();
7569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
7579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    };
7589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    View.OnTouchListener mHomeSearchActionListener = new View.OnTouchListener() {
7609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        public boolean onTouch(View v, MotionEvent event) {
7619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            switch(event.getAction()) {
762462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            case MotionEvent.ACTION_DOWN:
7639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                if (!shouldDisableNavbarGestures()) {
7649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mHandler.removeCallbacks(mShowSearchPanel);
7656315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                    mHandler.postDelayed(mShowSearchPanel, mShowSearchHoldoff);
7666315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                }
7676315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr            break;
7689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            case MotionEvent.ACTION_UP:
7709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            case MotionEvent.ACTION_CANCEL:
7719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mHandler.removeCallbacks(mShowSearchPanel);
7729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                awakenDreams();
7739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            break;
7749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
7759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return false;
7769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
7779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    };
7789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private void awakenDreams() {
7809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mDreamManager != null) {
7819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            try {
7829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mDreamManager.awaken();
7839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            } catch (RemoteException e) {
7849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                // fine, stay asleep then
7859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
7869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
7879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
7889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private void prepareNavigationBarView() {
790462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mNavigationBarView.reorient();
7919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNavigationBarView.getRecentsButton().setOnClickListener(mRecentsClickListener);
793462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mNavigationBarView.getRecentsButton().setOnTouchListener(mRecentsPreloadOnTouchListener);
794462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mNavigationBarView.getHomeButton().setOnTouchListener(mHomeSearchActionListener);
7959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNavigationBarView.getSearchLight().setOnTouchListener(mHomeSearchActionListener);
796462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        updateSearchPanel();
7979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
798462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
7999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // For small-screen devices (read: phones) that lack hardware navigation buttons
800462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    private void addNavigationBar() {
801462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);
8029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNavigationBarView == null) return;
8039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        prepareNavigationBarView();
8059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
807462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
8089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private void repositionNavigationBar() {
810462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if (mNavigationBarView == null || !mNavigationBarView.isAttachedToWindow()) return;
8119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        prepareNavigationBarView();
813462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mWindowManager.updateViewLayout(mNavigationBarView, getNavigationBarLayoutParams());
8159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
8169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
817462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    private void notifyNavigationBarScreenOn(boolean screenOn) {
8189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNavigationBarView == null) return;
8199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNavigationBarView.notifyScreenOn(screenOn);
8209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
8219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private WindowManager.LayoutParams getNavigationBarLayoutParams() {
8239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
8249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
825462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR,
8269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    0
8279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
8289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
829462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
8309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
8319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
8329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                PixelFormat.TRANSLUCENT);
8339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // this will allow the navbar to run in an overlay on devices that support this
8349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (ActivityManager.isHighEndGfx()) {
8359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
8369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
837462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.setTitle("NavigationBar");
839462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        lp.windowAnimations = 0;
8409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return lp;
841462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
8429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
843462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    private void addHeadsUpView() {
844462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
8459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,
8469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, // above the status bar!
8479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
8489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
8499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
8509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
8519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
8529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
8539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                PixelFormat.TRANSLUCENT);
8549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
8559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.gravity = Gravity.TOP;
8569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.y = getStatusBarHeight();
8579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.setTitle("Heads Up");
8589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.packageName = mContext.getPackageName();
8599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.windowAnimations = R.style.Animation_StatusBar_HeadsUp;
8609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mWindowManager.addView(mHeadsUpNotificationView, lp);
8629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
8639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private void removeHeadsUpView() {
8659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mWindowManager.removeView(mHeadsUpNotificationView);
8669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
8679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void refreshAllStatusBarIcons() {
8699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        refreshAllIconsForLayout(mStatusIcons);
8709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        refreshAllIconsForLayout(mNotificationIcons);
8719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
8729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
873462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    private void refreshAllIconsForLayout(LinearLayout ll) {
874462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        final int count = ll.getChildCount();
8759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        for (int n = 0; n < count; n++) {
876462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            View child = ll.getChildAt(n);
8779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (child instanceof StatusBarIconView) {
8789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                ((StatusBarIconView) child).updateDrawable();
879462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
880462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
88192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    }
88292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
88392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) {
88492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        if (SPEW) Log.d(TAG, "addIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
88592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                + " icon=" + icon);
88692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        StatusBarIconView view = new StatusBarIconView(mContext, slot, null);
88792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        view.set(icon);
88892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams(mIconSize, mIconSize));
88992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    }
89092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
89192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    public void updateIcon(String slot, int index, int viewIndex,
89292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            StatusBarIcon old, StatusBarIcon icon) {
89392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        if (SPEW) Log.d(TAG, "updateIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
89492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                + " old=" + old + " icon=" + icon);
89592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        StatusBarIconView view = (StatusBarIconView)mStatusIcons.getChildAt(viewIndex);
89692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        view.set(icon);
89792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    }
89892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
89992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    public void removeIcon(String slot, int index, int viewIndex) {
90092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        if (SPEW) Log.d(TAG, "removeIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex);
90192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        mStatusIcons.removeViewAt(viewIndex);
90292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    }
90392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
90492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    public void addNotification(IBinder key, StatusBarNotification notification) {
90592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        if (DEBUG) Log.d(TAG, "addNotification score=" + notification.getScore());
90692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Entry shadeEntry = createNotificationViews(key, notification);
90792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        if (shadeEntry == null) {
90892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            return;
90992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        }
91092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        if (mUseHeadsUp && shouldInterrupt(notification)) {
91192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            if (DEBUG) Log.d(TAG, "launching notification in heads up mode");
91292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            Entry interruptionCandidate = new Entry(key, notification, null);
91392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            if (inflateViews(interruptionCandidate, mHeadsUpNotificationView.getHolder())) {
91492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                mInterruptingNotificationTime = System.currentTimeMillis();
91592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                mInterruptingNotificationEntry = interruptionCandidate;
9169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                shadeEntry.setInterruption();
9179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                // 1. Populate mHeadsUpNotificationView
9199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mHeadsUpNotificationView.setNotification(mInterruptingNotificationEntry);
9209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                // 2. Animate mHeadsUpNotificationView in
9229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mHandler.sendEmptyMessage(MSG_SHOW_HEADS_UP);
9239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                // 3. Set alarm to age the notification off
9259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                resetHeadsUpDecayTimer();
9269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
9279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        } else if (notification.getNotification().fullScreenIntent != null) {
9289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // Stop screensaver if the notification has a full-screen intent.
9299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // (like an incoming phone call)
9309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            awakenDreams();
9319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // not immersive & a full-screen alert should be shown
9339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (DEBUG) Log.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
9349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            try {
9359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                notification.getNotification().fullScreenIntent.send();
9369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            } catch (PendingIntent.CanceledException e) {
9379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
9389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        } else {
9399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // usual case: status bar visible & not immersive
9409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // show the ticker if there isn't already a heads up
9429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mInterruptingNotificationEntry == null) {
9439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                tick(null, notification, true);
9449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
9451ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao        }
9469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        addNotificationViews(shadeEntry);
9479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Recalculate the position of the sliding windows and the titles.
948462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        setAreThereNotifications();
9499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
9509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
9519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
952462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    @Override
9539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void resetHeadsUpDecayTimer() {
9549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mUseHeadsUp && mHeadsUpNotificationDecay > 0
9559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                && mHeadsUpNotificationView.isClearable()) {
9569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mHandler.removeMessages(MSG_HIDE_HEADS_UP);
9579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mHandler.sendEmptyMessageDelayed(MSG_HIDE_HEADS_UP, mHeadsUpNotificationDecay);
9589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
9599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
9609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
961462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    public void removeNotification(IBinder key) {
9629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        StatusBarNotification old = removeNotificationViews(key);
963462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if (SPEW) Log.d(TAG, "removeNotification key=" + key + " old=" + old);
9649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (old != null) {
9669c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            // Cancel the ticker if it's still running
9679c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            mTicker.removeEntry(old);
9689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // Recalculate the position of the sliding windows and the titles.
9709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
9719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (ENABLE_HEADS_UP && mInterruptingNotificationEntry != null
9739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    && old == mInterruptingNotificationEntry.notification) {
9749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mHandler.sendEmptyMessage(MSG_HIDE_HEADS_UP);
9759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
9769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (CLOSE_PANEL_WHEN_EMPTIED && mNotificationData.size() == 0
9789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    && !mNotificationPanel.isTracking()) {
9799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                animateCollapsePanels();
9809c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            }
9819c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        }
9829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        setAreThereNotifications();
9849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
9859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
9879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected void refreshLayout(int layoutDirection) {
9889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNavigationBarView != null) {
9899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNavigationBarView.setLayoutDirection(layoutDirection);
9909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
9919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mClearButton != null && mClearButton instanceof ImageView) {
9939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // Force asset reloading
9949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            ((ImageView)mClearButton).setImageDrawable(null);
9959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            ((ImageView)mClearButton).setImageResource(R.drawable.ic_notify_clear);
9969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
9979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mSettingsButton != null) {
9999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // Force asset reloading
10009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mSettingsButton.setImageDrawable(null);
10019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mSettingsButton.setImageResource(R.drawable.ic_notify_quicksettings);
10029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
10039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNotificationButton != null) {
10059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // Force asset reloading
10066de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao            mNotificationButton.setImageDrawable(null);
10079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNotificationButton.setImageResource(R.drawable.ic_notifications);
10089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
10099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        refreshAllStatusBarIcons();
10119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
10129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private void updateShowSearchHoldoff() {
10149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mShowSearchHoldoff = mContext.getResources().getInteger(
10159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            R.integer.config_show_search_delay);
10169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
10179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private void loadNotificationShade() {
10199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mPile == null) return;
102092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
102192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        int N = mNotificationData.size();
102292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
102392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        ArrayList<View> toShow = new ArrayList<View>();
102492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
10259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final boolean provisioned = isDeviceProvisioned();
10266315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        // If the device hasn't been through Setup, we only show system notifications
10276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        for (int i=0; i<N; i++) {
10289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            Entry ent = mNotificationData.get(N-i-1);
10299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (!(provisioned || showNotificationEvenIfUnprovisioned(ent.notification))) continue;
10309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (!notificationIsForCurrentUser(ent.notification)) continue;
10319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            toShow.add(ent.row);
10329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
10339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        ArrayList<View> toRemove = new ArrayList<View>();
10359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        for (int i=0; i<mPile.getChildCount(); i++) {
10369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            View child = mPile.getChildAt(i);
10379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (!toShow.contains(child)) {
10389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                toRemove.add(child);
10399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
1040462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
10419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        for (View remove : toRemove) {
10439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mPile.removeView(remove);
10449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
1045462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        for (int i=0; i<toShow.size(); i++) {
10479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            View v = toShow.get(i);
10489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (v.getParent() == null) {
1049462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                mPile.addView(v, i);
10509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
1051462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
10529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mSettingsButton != null) {
10549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mSettingsButton.setEnabled(isDeviceProvisioned());
10559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
10569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1057462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
10599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected void updateNotificationIcons() {
1060462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if (mNotificationIcons == null) return;
10619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        loadNotificationShade();
10639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final LinearLayout.LayoutParams params
10659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            = new LinearLayout.LayoutParams(mIconSize + 2*mIconHPadding, mNaturalBarHeight);
10669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1067f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        int N = mNotificationData.size();
10689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (DEBUG) {
1070462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            Log.d(TAG, "refreshing icons: " + N + " notifications, mNotificationIcons=" + mNotificationIcons);
10719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
1072462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        ArrayList<View> toShow = new ArrayList<View>();
10749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1075462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        final boolean provisioned = isDeviceProvisioned();
10769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // If the device hasn't been through Setup, we only show system notifications
10779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        for (int i=0; i<N; i++) {
107892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            Entry ent = mNotificationData.get(N-i-1);
107992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            if (!((provisioned && ent.notification.getScore() >= HIDE_ICONS_BELOW_SCORE)
10809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    || showNotificationEvenIfUnprovisioned(ent.notification))) continue;
10819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (!notificationIsForCurrentUser(ent.notification)) continue;
10829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            toShow.add(ent.icon);
108392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        }
108492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
10859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        ArrayList<View> toRemove = new ArrayList<View>();
10869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        for (int i=0; i<mNotificationIcons.getChildCount(); i++) {
1087462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            View child = mNotificationIcons.getChildAt(i);
10889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (!toShow.contains(child)) {
10899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                toRemove.add(child);
109092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            }
109192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        }
109292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
109392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        for (View remove : toRemove) {
10949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNotificationIcons.removeView(remove);
1095462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
1096462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        for (int i=0; i<toShow.size(); i++) {
10989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            View v = toShow.get(i);
10999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (v.getParent() == null) {
11009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNotificationIcons.addView(v, i, params);
11019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
11029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
11039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
11049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected void updateCarrierLabelVisibility(boolean force) {
11069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!mShowCarrierInPanel) return;
11079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // The idea here is to only show the carrier label when there is enough room to see it,
11089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // i.e. when there aren't enough notifications to fill the panel.
11099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (SPEW) {
11109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            Log.d(TAG, String.format("pileh=%d scrollh=%d carrierh=%d",
11119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mPile.getHeight(), mScrollView.getHeight(), mCarrierLabelHeight));
11129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
11139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final boolean emergencyCallsShownElsewhere = mEmergencyCallLabel != null;
11159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final boolean makeVisible =
11169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            !(emergencyCallsShownElsewhere && mNetworkController.isEmergencyOnly())
11179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            && mPile.getHeight() < (mNotificationPanel.getHeight() - mCarrierLabelHeight - mNotificationHeaderHeight)
11189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            && mScrollView.getVisibility() == View.VISIBLE;
11199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (force || mCarrierLabelVisible != makeVisible) {
11219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mCarrierLabelVisible = makeVisible;
11229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (DEBUG) {
11239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                Log.d(TAG, "making carrier label " + (makeVisible?"visible":"invisible"));
11249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
11259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mCarrierLabel.animate().cancel();
11269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (makeVisible) {
11279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mCarrierLabel.setVisibility(View.VISIBLE);
11289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
11299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mCarrierLabel.animate()
11309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .alpha(makeVisible ? 1f : 0f)
11319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                //.setStartDelay(makeVisible ? 500 : 0)
11329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                //.setDuration(makeVisible ? 750 : 100)
11339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .setDuration(150)
113466aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang                .setListener(makeVisible ? null : new AnimatorListenerAdapter() {
113566aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang                    @Override
113666aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang                    public void onAnimationEnd(Animator animation) {
11379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        if (!mCarrierLabelVisible) { // race
11389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            mCarrierLabel.setVisibility(View.INVISIBLE);
1139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                            mCarrierLabel.setAlpha(0f);
11409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        }
11419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }
11429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                })
11439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .start();
11449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
11459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
11469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
11489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected void setAreThereNotifications() {
11499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final boolean any = mNotificationData.size() > 0;
11509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final boolean clearable = any && mNotificationData.hasClearableItems();
11529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (SPEW) {
11549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            Log.d(TAG, "setAreThereNotifications: N=" + mNotificationData.size()
11559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    + " any=" + any + " clearable=" + clearable);
11569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
11579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mHasFlipSettings
11599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                && mFlipSettingsView != null
11609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                && mFlipSettingsView.getVisibility() == View.VISIBLE
11619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                && mScrollView.getVisibility() != View.VISIBLE) {
11629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // the flip settings panel is unequivocally showing; we should not be shown
11639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mClearButton.setVisibility(View.INVISIBLE);
11649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        } else if (mClearButton.isShown()) {
11659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (clearable != (mClearButton.getAlpha() == 1.0f)) {
11669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                ObjectAnimator clearAnimation = ObjectAnimator.ofFloat(
11679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        mClearButton, "alpha", clearable ? 1.0f : 0.0f).setDuration(250);
11689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                clearAnimation.addListener(new AnimatorListenerAdapter() {
11696315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                    @Override
117092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    public void onAnimationEnd(Animator animation) {
11719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        if (mClearButton.getAlpha() <= 0.0f) {
11726315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                            mClearButton.setVisibility(View.INVISIBLE);
11739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        }
11749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }
11759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    @Override
11779e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao                    public void onAnimationStart(Animator animation) {
11789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        if (mClearButton.getAlpha() <= 0.0f) {
11799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            mClearButton.setVisibility(View.VISIBLE);
1180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                        }
11819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }
11829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                });
1183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                clearAnimation.start();
11849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
1185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else {
1186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mClearButton.setAlpha(clearable ? 1.0f : 0.0f);
11879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mClearButton.setVisibility(clearable ? View.VISIBLE : View.INVISIBLE);
11889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
11899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mClearButton.setEnabled(clearable);
11909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final View nlo = mStatusBarView.findViewById(R.id.notification_lights_out);
11929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final boolean showDot = (any&&!areLightsOn());
11939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (showDot != (nlo.getAlpha() == 1.0f)) {
11949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (showDot) {
11959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                nlo.setAlpha(0f);
11969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                nlo.setVisibility(View.VISIBLE);
11979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
11989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            nlo.animate()
11999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .alpha(showDot?1:0)
12009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .setDuration(showDot?750:250)
12019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .setInterpolator(new AccelerateInterpolator(2.0f))
12029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .setListener(showDot ? null : new AnimatorListenerAdapter() {
12039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    @Override
12049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    public void onAnimationEnd(Animator _a) {
12059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        nlo.setVisibility(View.GONE);
12069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }
12079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                })
12089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .start();
12099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
12109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        updateCarrierLabelVisibility(false);
12129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
12139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void showClock(boolean show) {
12159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mStatusBarView == null) return;
12169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        View clock = mStatusBarView.findViewById(R.id.clock);
12179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (clock != null) {
12189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            clock.setVisibility(show ? View.VISIBLE : View.GONE);
12199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
12209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
12229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /**
12239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao     * State is one or more of the DISABLE constants from StatusBarManager.
12249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao     */
12259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void disable(int state) {
12269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final int old = mDisabled;
12279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final int diff = state ^ old;
12289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mDisabled = state;
12299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (DEBUG) {
12319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            Log.d(TAG, String.format("disable: 0x%08x -> 0x%08x (diff: 0x%08x)",
12329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                old, state, diff));
12339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
12349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        StringBuilder flagdbg = new StringBuilder();
123692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        flagdbg.append("disable: < ");
123792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        flagdbg.append(((state & StatusBarManager.DISABLE_EXPAND) != 0) ? "EXPAND" : "expand");
12389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((diff  & StatusBarManager.DISABLE_EXPAND) != 0) ? "* " : " ");
12399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) ? "ICONS" : "icons");
12409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((diff  & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) ? "* " : " ");
12419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((state & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) != 0) ? "ALERTS" : "alerts");
12429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((diff  & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) != 0) ? "* " : " ");
12439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) ? "TICKER" : "ticker");
1244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        flagdbg.append(((diff  & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) ? "* " : " ");
12459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((state & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) ? "SYSTEM_INFO" : "system_info");
12466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        flagdbg.append(((diff  & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) ? "* " : " ");
12479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((state & StatusBarManager.DISABLE_BACK) != 0) ? "BACK" : "back");
12489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((diff  & StatusBarManager.DISABLE_BACK) != 0) ? "* " : " ");
12499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((state & StatusBarManager.DISABLE_HOME) != 0) ? "HOME" : "home");
12509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((diff  & StatusBarManager.DISABLE_HOME) != 0) ? "* " : " ");
12519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((state & StatusBarManager.DISABLE_RECENT) != 0) ? "RECENT" : "recent");
12529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((diff  & StatusBarManager.DISABLE_RECENT) != 0) ? "* " : " ");
12539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((state & StatusBarManager.DISABLE_CLOCK) != 0) ? "CLOCK" : "clock");
12549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((diff  & StatusBarManager.DISABLE_CLOCK) != 0) ? "* " : " ");
12559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((state & StatusBarManager.DISABLE_SEARCH) != 0) ? "SEARCH" : "search");
12569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(((diff  & StatusBarManager.DISABLE_SEARCH) != 0) ? "* " : " ");
12579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        flagdbg.append(">");
12589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Log.d(TAG, flagdbg.toString());
12599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if ((diff & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) {
12619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mSystemIconArea.animate().cancel();
12629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if ((state & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) {
12639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mSystemIconArea.animate()
12649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .alpha(0f)
12659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .translationY(mNaturalBarHeight*0.5f)
126692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    .setDuration(175)
12679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .setInterpolator(new DecelerateInterpolator(1.5f))
12689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .setListener(mMakeIconsInvisible)
12699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .start();
12709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            } else {
12719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mSystemIconArea.setVisibility(View.VISIBLE);
12729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mSystemIconArea.animate()
12739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .alpha(1f)
1274462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    .translationY(0)
12759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .setStartDelay(0)
12769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .setInterpolator(new DecelerateInterpolator(1.5f))
12779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .setDuration(175)
12789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .start();
12799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
12809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
12819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if ((diff & StatusBarManager.DISABLE_CLOCK) != 0) {
12839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            boolean show = (state & StatusBarManager.DISABLE_CLOCK) == 0;
12849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            showClock(show);
12859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
12869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) {
12879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if ((state & StatusBarManager.DISABLE_EXPAND) != 0) {
12889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                animateCollapsePanels();
1289462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
1290462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
12919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if ((diff & (StatusBarManager.DISABLE_HOME
12939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        | StatusBarManager.DISABLE_RECENT
12949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        | StatusBarManager.DISABLE_BACK
12959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        | StatusBarManager.DISABLE_SEARCH)) != 0) {
12969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // the nav bar will take care of these
12979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mNavigationBarView != null) mNavigationBarView.setDisabledFlags(state);
12989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if ((state & StatusBarManager.DISABLE_RECENT) != 0) {
13009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                // close recents if it's visible
13019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
13029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
13039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
13049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
13059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
13079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
13089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                if (mTicking) {
13099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    haltTicker();
13109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
13119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNotificationIcons.animate()
13139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .alpha(0f)
13149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .translationY(mNaturalBarHeight*0.5f)
13159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .setDuration(175)
1316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    .setInterpolator(new DecelerateInterpolator(1.5f))
1317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    .setListener(mMakeIconsInvisible)
1318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    .start();
13192dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao            } else {
13209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNotificationIcons.setVisibility(View.VISIBLE);
132192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                mNotificationIcons.animate()
132292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    .alpha(1f)
132392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    .translationY(0)
13249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .setStartDelay(0)
132592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    .setInterpolator(new DecelerateInterpolator(1.5f))
132692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    .setDuration(175)
132792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    .start();
13289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
1329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
13309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mTicking && (state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
13319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                haltTicker();
13329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
133366aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang        }
133466aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang    }
1335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
13369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
13379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    protected BaseStatusBar.H createHandler() {
1338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return new PhoneStatusBar.H();
13399b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao    }
13409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /**
13429c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao     * All changes to the status bar and notifications funnel through here and are batched.
13439c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao     */
13449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private class H extends BaseStatusBar.H {
13459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        public void handleMessage(Message m) {
13469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            super.handleMessage(m);
13479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            switch (m.what) {
13489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                case MSG_OPEN_NOTIFICATION_PANEL:
13499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    animateExpandNotificationsPanel();
13509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    break;
13519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                case MSG_OPEN_SETTINGS_PANEL:
13529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    animateExpandSettingsPanel();
13539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    break;
13549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                case MSG_CLOSE_PANELS:
13559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    animateCollapsePanels();
13569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    break;
13579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                case MSG_SHOW_HEADS_UP:
13586315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                    setHeadsUpVisibility(true);
13596315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                    break;
13609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                case MSG_HIDE_HEADS_UP:
13619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    setHeadsUpVisibility(false);
13629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    break;
13639c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao                case MSG_ESCALATE_HEADS_UP:
13649b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao                    escalateHeadsUp();
13659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    setHeadsUpVisibility(false);
13669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    break;
13679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
1368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
13699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
13709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /**  if the interrupting notification had a fullscreen intent, fire it now.  */
13729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private void escalateHeadsUp() {
13739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mInterruptingNotificationEntry != null) {
1374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            final StatusBarNotification sbn = mInterruptingNotificationEntry.notification;
13759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            final Notification notification = sbn.getNotification();
13769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (notification.fullScreenIntent != null) {
1377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if (DEBUG)
1378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    Log.d(TAG, "converting a heads up to fullScreen");
13799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                try {
1380462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    notification.fullScreenIntent.send();
13819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                } catch (PendingIntent.CanceledException e) {
13826315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                }
13839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
13849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
1385462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
13869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public Handler getHandler() {
1388462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return mHandler;
13899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
13909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1391462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    View.OnFocusChangeListener mFocusChangeListener = new View.OnFocusChangeListener() {
13929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        public void onFocusChange(View v, boolean hasFocus) {
13939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // Because 'v' is a ViewGroup, all its children will be (un)selected
13949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // too, which allows marqueeing to work.
13959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            v.setSelected(hasFocus);
13969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
13979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    };
1398462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
13999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    boolean panelsEnabled() {
1400462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return (mDisabled & StatusBarManager.DISABLE_EXPAND) == 0;
14019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
14029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1403462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void makeExpandedVisible() {
1404462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if (SPEW) Log.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible);
140592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        if (mExpandedVisible || !panelsEnabled()) {
140692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            return;
14079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
140892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
14099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mExpandedVisible = true;
14109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mPile.setLayoutTransitionsEnabled(true);
14119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNavigationBarView != null)
14129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNavigationBarView.setSlippery(true);
14139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        updateCarrierLabelVisibility(true);
14159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
14179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Expand the window to encompass the full screen in anticipation of the drag.
14199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // This is only possible to do atomically because the status bar is at the top of the screen!
14209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams();
14219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
14229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
142392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
14249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mWindowManager.updateViewLayout(mStatusBarWindow, lp);
14259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        visibilityChanged(true);
14279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true);
14299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
14309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private void releaseFocus() {
14329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        WindowManager.LayoutParams lp =
14339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams();
14349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
14359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
14369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mWindowManager.updateViewLayout(mStatusBarWindow, lp);
14379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
14389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
143991a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    public void animateCollapsePanels() {
144091a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
144191a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    }
14429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void animateCollapsePanels(int flags) {
14449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (SPEW) {
14459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            Log.d(TAG, "animateCollapse():"
14469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    + " mExpandedVisible=" + mExpandedVisible
14479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    + " flags=" + flags);
14489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
14499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // release focus immediately to kick off focus change transition
14519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        releaseFocus();
145292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
145392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        if ((flags & CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL) == 0) {
14549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
14559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
14569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
14579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if ((flags & CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL) == 0) {
1459bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            mHandler.removeMessages(MSG_CLOSE_SEARCH_PANEL);
14609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL);
146192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        }
14629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mStatusBarWindow.cancelExpandHelper();
14649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mStatusBarView.collapseAllPanels(true);
14659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
146692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
146792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    public ViewPropertyAnimator setVisibilityWhenDone(
146892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            final ViewPropertyAnimator a, final View v, final int vis) {
146992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        a.setListener(new AnimatorListenerAdapter() {
147092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            @Override
14719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            public void onAnimationEnd(Animator animation) {
14729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                v.setVisibility(vis);
14739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                a.setListener(null); // oneshot
14746315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr            }
14756315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        });
14769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return a;
14779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
14789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public Animator setVisibilityWhenDone(
14809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            final Animator a, final View v, final int vis) {
14819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        a.addListener(new AnimatorListenerAdapter() {
14829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            @Override
14839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            public void onAnimationEnd(Animator animation) {
14849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                v.setVisibility(vis);
14859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
14869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        });
14879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return a;
14889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
14899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public Animator interpolator(TimeInterpolator ti, Animator a) {
14919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        a.setInterpolator(ti);
14929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return a;
14939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
14949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
14959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public Animator startDelay(int d, Animator a) {
14969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        a.setStartDelay(d);
14979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return a;
14989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
14999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public Animator start(Animator a) {
15019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        a.start();
15029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return a;
15039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
15049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    final TimeInterpolator mAccelerateInterpolator = new AccelerateInterpolator();
15069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    final TimeInterpolator mDecelerateInterpolator = new DecelerateInterpolator();
15079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    final int FLIP_DURATION_OUT = 125;
15089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    final int FLIP_DURATION_IN = 225;
15099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    final int FLIP_DURATION = (FLIP_DURATION_IN + FLIP_DURATION_OUT);
15109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    Animator mScrollViewAnim, mFlipSettingsViewAnim, mNotificationButtonAnim,
15129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mSettingsButtonAnim, mClearButtonAnim;
15139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
15159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void animateExpandNotificationsPanel() {
15169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (SPEW) Log.d(TAG, "animateExpand: mExpandedVisible=" + mExpandedVisible);
1517bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        if (!panelsEnabled()) {
15189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            return ;
15199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
15209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationPanel.expand();
15220a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao        if (mHasFlipSettings && mScrollView.getVisibility() != View.VISIBLE) {
15239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            flipToNotifications();
15249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
15259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (false) postStartTracing();
15279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
15289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1529b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao    public void flipToNotifications() {
15309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel();
1531462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if (mScrollViewAnim != null) mScrollViewAnim.cancel();
1532462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel();
15339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel();
15349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mClearButtonAnim != null) mClearButtonAnim.cancel();
15359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        mScrollView.setVisibility(View.VISIBLE);
15379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mScrollViewAnim = start(
15389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            startDelay(FLIP_DURATION_OUT,
15399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                interpolator(mDecelerateInterpolator,
15409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    ObjectAnimator.ofFloat(mScrollView, View.SCALE_X, 0f, 1f)
15419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        .setDuration(FLIP_DURATION_IN)
15429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    )));
15439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mFlipSettingsViewAnim = start(
15449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            setVisibilityWhenDone(
15459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                interpolator(mAccelerateInterpolator,
15469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 1f, 0f)
15479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        )
1548462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    .setDuration(FLIP_DURATION_OUT),
15499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mFlipSettingsView, View.INVISIBLE));
15509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationButtonAnim = start(
1551462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            setVisibilityWhenDone(
1552462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 0f)
1553462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    .setDuration(FLIP_DURATION),
15549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNotificationButton, View.INVISIBLE));
1555462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mSettingsButton.setVisibility(View.VISIBLE);
15569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mSettingsButtonAnim = start(
15579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 1f)
15589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .setDuration(FLIP_DURATION));
15599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mClearButton.setVisibility(View.VISIBLE);
15609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mClearButton.setAlpha(0f);
1561462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        setAreThereNotifications(); // this will show/hide the button as necessary
15629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationPanel.postDelayed(new Runnable() {
15639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            public void run() {
1564462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                updateCarrierLabelVisibility(false);
15659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            }
15669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }, FLIP_DURATION - 150);
1567462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
15689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    @Override
15709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void animateExpandSettingsPanel() {
15719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (SPEW) Log.d(TAG, "animateExpand: mExpandedVisible=" + mExpandedVisible);
15729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!panelsEnabled()) {
15739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            return;
1574462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
15759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Settings are not available in setup
15779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!mUserSetup) return;
15789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mHasFlipSettings) {
1580462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mNotificationPanel.expand();
15819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mFlipSettingsView.getVisibility() != View.VISIBLE) {
15829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                flipToSettings();
1583462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
15849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        } else if (mSettingsPanel != null) {
1585462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mSettingsPanel.expand();
15869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
15879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (false) postStartTracing();
1589d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh    }
15909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void switchToSettings() {
15929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Settings are not available in setup
15939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!mUserSetup) return;
15949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1595462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mFlipSettingsView.setScaleX(1f);
15969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mFlipSettingsView.setVisibility(View.VISIBLE);
15979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mSettingsButton.setVisibility(View.GONE);
15989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mScrollView.setVisibility(View.GONE);
15999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mScrollView.setScaleX(0f);
16009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationButton.setVisibility(View.VISIBLE);
16019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationButton.setAlpha(1f);
16029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mClearButton.setVisibility(View.GONE);
16039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
16049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void flipToSettings() {
16069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Settings are not available in setup
16079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!mUserSetup) return;
16089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel();
16109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mScrollViewAnim != null) mScrollViewAnim.cancel();
16119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel();
1612462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel();
16139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mClearButtonAnim != null) mClearButtonAnim.cancel();
1614462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
16159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mFlipSettingsView.setVisibility(View.VISIBLE);
1616462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mFlipSettingsView.setScaleX(0f);
16179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mFlipSettingsViewAnim = start(
1618462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            startDelay(FLIP_DURATION_OUT,
1619462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                interpolator(mDecelerateInterpolator,
16209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 0f, 1f)
16216315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                        .setDuration(FLIP_DURATION_IN)
1622462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    )));
16239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mScrollViewAnim = start(
16249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            setVisibilityWhenDone(
16259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                interpolator(mAccelerateInterpolator,
16269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        ObjectAnimator.ofFloat(mScrollView, View.SCALE_X, 1f, 0f)
16279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        )
16289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .setDuration(FLIP_DURATION_OUT),
16299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mScrollView, View.INVISIBLE));
16309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mSettingsButtonAnim = start(
16319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            setVisibilityWhenDone(
16329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 0f)
16339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    .setDuration(FLIP_DURATION),
16349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mScrollView, View.INVISIBLE));
16359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationButton.setVisibility(View.VISIBLE);
16369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationButtonAnim = start(
16379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 1f)
16389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .setDuration(FLIP_DURATION));
16399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mClearButtonAnim = start(
16409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            setVisibilityWhenDone(
16419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                ObjectAnimator.ofFloat(mClearButton, View.ALPHA, 0f)
16429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                .setDuration(FLIP_DURATION),
16439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mClearButton, View.INVISIBLE));
16449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mNotificationPanel.postDelayed(new Runnable() {
16459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            public void run() {
16469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                updateCarrierLabelVisibility(false);
1647462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
1648462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }, FLIP_DURATION - 150);
16499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
16509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void flipPanels() {
16529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mHasFlipSettings) {
16539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mFlipSettingsView.getVisibility() != View.VISIBLE) {
16549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                flipToSettings();
16559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            } else {
1656462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                flipToNotifications();
1657462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
16589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
16599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
16609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public void animateCollapseQuickSettings() {
16629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mStatusBarView.collapseAllPanels(true);
16639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
16649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void makeExpandedInvisibleSoon() {
16669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mHandler.postDelayed(new Runnable() { public void run() { makeExpandedInvisible(); }}, 50);
16679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
16689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void makeExpandedInvisible() {
16709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (SPEW) Log.d(TAG, "makeExpandedInvisible: mExpandedVisible=" + mExpandedVisible
16719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                + " mExpandedVisible=" + mExpandedVisible);
16729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!mExpandedVisible) {
16749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            return;
16759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
16769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Ensure the panel is fully collapsed (just in case; bug 6765842, 7260868)
16789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mStatusBarView.collapseAllPanels(/*animate=*/ false);
16799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mHasFlipSettings) {
16819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            // reset things to their proper state
16829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel();
16839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mScrollViewAnim != null) mScrollViewAnim.cancel();
16849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel();
16859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel();
16869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (mClearButtonAnim != null) mClearButtonAnim.cancel();
16879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mScrollView.setScaleX(1f);
16899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mScrollView.setVisibility(View.VISIBLE);
16909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mSettingsButton.setAlpha(1f);
16919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mSettingsButton.setVisibility(View.VISIBLE);
16929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNotificationPanel.setVisibility(View.GONE);
16939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mFlipSettingsView.setVisibility(View.GONE);
16949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            mNotificationButton.setVisibility(View.GONE);
16959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            setAreThereNotifications(); // show the clear button
16969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
16979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
16989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mExpandedVisible = false;
16999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mPile.setLayoutTransitionsEnabled(false);
17009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (mNavigationBarView != null)
1701462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mNavigationBarView.setSlippery(false);
1702462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        visibilityChanged(false);
1703462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
17049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Shrink the window to the size of the status bar only
17059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams();
17069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.height = getStatusBarHeight();
17079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
17089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        lp.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1709462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mWindowManager.updateViewLayout(mStatusBarWindow, lp);
1710462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1711462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if ((mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS) == 0) {
17129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);
17139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
17149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
17159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Close any "App info" popups that might have snuck on-screen
17169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        dismissPopups();
17179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1718462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if (mPostCollapseCleanup != null) {
1719462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mPostCollapseCleanup.run();
1720462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mPostCollapseCleanup = null;
17219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
17229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
17239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false);
1724462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
1725462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
17269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /**
17279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao     * Enables or disables layers on the children of the notifications pile.
17289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao     *
17299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao     * When layers are enabled, this method attempts to enable layers for the minimal
1730462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao     * number of children. Only children visible when the notification area is fully
1731462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao     * expanded will receive a layer. The technique used in this method might cause
1732462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao     * more children than necessary to get a layer (at most one extra child with the
17339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao     * current UI.)
17349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao     *
1735462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao     * @param layerType {@link View#LAYER_TYPE_NONE} or {@link View#LAYER_TYPE_HARDWARE}
1736462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao     */
17379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private void setPileLayers(int layerType) {
17389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        final int count = mPile.getChildCount();
17399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
17409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        switch (layerType) {
17419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            case View.LAYER_TYPE_NONE:
17429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                for (int i = 0; i < count; i++) {
17439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    mPile.getChildAt(i).setLayerType(layerType, null);
17449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
1745462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                break;
17466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr            case View.LAYER_TYPE_HARDWARE:
17479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                final int[] location = new int[2];
17489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mNotificationPanel.getLocationInWindow(location);
1749462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
17506315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                final int left = location[0];
17519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                final int top = location[1];
17529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                final int right = left + mNotificationPanel.getWidth();
1753462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                final int bottom = top + getExpandedViewMaxHeight();
17549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1755462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                final Rect childBounds = new Rect();
17569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1757462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                for (int i = 0; i < count; i++) {
1758462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    final View view = mPile.getChildAt(i);
17592dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                    view.getLocationInWindow(location);
17602dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao
17619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    childBounds.set(location[0], location[1],
17629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            location[0] + view.getWidth(), location[1] + view.getHeight());
17636315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
17649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    if (childBounds.intersects(left, top, right, bottom)) {
17659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        view.setLayerType(layerType, null);
17669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    }
17679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                }
17689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
17699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                break;
17709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
17719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
17729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
17739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    public boolean interceptTouchEvent(MotionEvent event) {
17749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (DEBUG_GESTURES) {
1775462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
17769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                EventLog.writeEvent(EventLogTags.SYSUI_STATUSBAR_TOUCH,
17779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        event.getActionMasked(), (int) event.getX(), (int) event.getY(), mDisabled);
1778462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
17799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
17809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        }
1781462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
17829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (SPEW) {
1783462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            Log.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled="
1784462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                + mDisabled + " mTracking=" + mTracking);
1785462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if (CHATTY) {
17869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            if (event.getAction() != MotionEvent.ACTION_MOVE) {
17879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                Log.d(TAG, String.format(
1788462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                            "panel: %s at (%f, %f) mDisabled=0x%08x",
1789                            MotionEvent.actionToString(event.getAction()),
1790                            event.getRawX(), event.getRawY(), mDisabled));
1791            }
1792        }
1793
1794        if (DEBUG_GESTURES) {
1795            mGestureRec.add(event);
1796        }
1797
1798        if (mStatusBarWindowState == WINDOW_STATE_SHOWING) {
1799            final boolean upOrCancel =
1800                    event.getAction() == MotionEvent.ACTION_UP ||
1801                    event.getAction() == MotionEvent.ACTION_CANCEL;
1802            if (upOrCancel && !mExpandedVisible) {
1803                setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false);
1804            } else {
1805                setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true);
1806            }
1807        }
1808        return false;
1809    }
1810
1811    public GestureRecorder getGestureRecorder() {
1812        return mGestureRec;
1813    }
1814
1815    private void setNavigationIconHints(int hints) {
1816        if (hints == mNavigationIconHints) return;
1817
1818        mNavigationIconHints = hints;
1819
1820        if (mNavigationBarView != null) {
1821            mNavigationBarView.setNavigationIconHints(hints);
1822        }
1823        checkBarModes();
1824    }
1825
1826    @Override // CommandQueue
1827    public void setWindowState(int window, int state) {
1828        boolean showing = state == WINDOW_STATE_SHOWING;
1829        if (mStatusBarWindow != null
1830                && window == StatusBarManager.WINDOW_STATUS_BAR
1831                && mStatusBarWindowState != state) {
1832            mStatusBarWindowState = state;
1833            if (DEBUG_WINDOW_STATE) Log.d(TAG, "Status bar " + windowStateToString(state));
1834            if (!showing) {
1835                mStatusBarView.collapseAllPanels(false);
1836            }
1837        }
1838        if (mNavigationBarView != null
1839                && window == StatusBarManager.WINDOW_NAVIGATION_BAR
1840                && mNavigationBarWindowState != state) {
1841            mNavigationBarWindowState = state;
1842            if (DEBUG_WINDOW_STATE) Log.d(TAG, "Navigation bar " + windowStateToString(state));
1843        }
1844    }
1845
1846    @Override // CommandQueue
1847    public void setSystemUiVisibility(int vis, int mask) {
1848        final int oldVal = mSystemUiVisibility;
1849        final int newVal = (oldVal&~mask) | (vis&mask);
1850        final int diff = newVal ^ oldVal;
1851        if (DEBUG) Log.d(TAG, String.format(
1852                "setSystemUiVisibility vis=%s mask=%s oldVal=%s newVal=%s diff=%s",
1853                Integer.toHexString(vis), Integer.toHexString(mask),
1854                Integer.toHexString(oldVal), Integer.toHexString(newVal),
1855                Integer.toHexString(diff)));
1856        if (diff != 0) {
1857            mSystemUiVisibility = newVal;
1858
1859            // update low profile
1860            if ((diff & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
1861                final boolean lightsOut = (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0;
1862                if (lightsOut) {
1863                    animateCollapsePanels();
1864                    if (mTicking) {
1865                        haltTicker();
1866                    }
1867                }
1868
1869                setAreThereNotifications();
1870            }
1871
1872            // update status bar mode
1873            final int sbMode = computeBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(),
1874                    View.STATUS_BAR_TRANSIENT, View.STATUS_BAR_TRANSLUCENT);
1875
1876            // update navigation bar mode
1877            final int nbMode = mNavigationBarView == null ? -1 : computeBarMode(
1878                    oldVal, newVal, mNavigationBarView.getBarTransitions(),
1879                    View.NAVIGATION_BAR_TRANSIENT, View.NAVIGATION_BAR_TRANSLUCENT);
1880            final boolean sbModeChanged = sbMode != -1;
1881            final boolean nbModeChanged = nbMode != -1;
1882            boolean checkBarModes = false;
1883            if (sbModeChanged && sbMode != mStatusBarMode) {
1884                mStatusBarMode = sbMode;
1885                checkBarModes = true;
1886            }
1887            if (nbModeChanged && nbMode != mNavigationBarMode) {
1888                mNavigationBarMode = nbMode;
1889                checkBarModes = true;
1890            }
1891            if (checkBarModes) {
1892                checkBarModes();
1893            }
1894            if (sbModeChanged || nbModeChanged) {
1895                // update transient bar autohide
1896                if (sbMode == MODE_SEMI_TRANSPARENT || nbMode == MODE_SEMI_TRANSPARENT) {
1897                    scheduleAutohide();
1898                } else {
1899                    cancelAutohide();
1900                }
1901            }
1902
1903            // ready to unhide
1904            if ((vis & View.STATUS_BAR_UNHIDE) != 0) {
1905                mSystemUiVisibility &= ~View.STATUS_BAR_UNHIDE;
1906            }
1907            if ((vis & View.NAVIGATION_BAR_UNHIDE) != 0) {
1908                mSystemUiVisibility &= ~View.NAVIGATION_BAR_UNHIDE;
1909            }
1910
1911            // send updated sysui visibility to window manager
1912            notifyUiVisibilityChanged(mSystemUiVisibility);
1913        }
1914    }
1915
1916    private int computeBarMode(int oldVis, int newVis, BarTransitions transitions,
1917            int transientFlag, int translucentFlag) {
1918        final int oldMode = barMode(oldVis, transientFlag, translucentFlag);
1919        final int newMode = barMode(newVis, transientFlag, translucentFlag);
1920        if (oldMode == newMode) {
1921            return -1; // no mode change
1922        }
1923        return newMode;
1924    }
1925
1926    private int barMode(int vis, int transientFlag, int translucentFlag) {
1927        return (vis & transientFlag) != 0 ? MODE_SEMI_TRANSPARENT
1928                : (vis & translucentFlag) != 0 ? MODE_TRANSLUCENT
1929                : (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0 ? MODE_LIGHTS_OUT
1930                : MODE_OPAQUE;
1931    }
1932
1933    private void checkBarModes() {
1934        if (mDemoMode) return;
1935        int sbMode = mStatusBarMode;
1936        if (panelsEnabled() && (mInteractingWindows & StatusBarManager.WINDOW_STATUS_BAR) != 0) {
1937            // if panels are expandable, force the status bar opaque on any interaction
1938            sbMode = MODE_OPAQUE;
1939        }
1940        checkBarMode(sbMode, mStatusBarWindowState, mStatusBarView.getBarTransitions());
1941        if (mNavigationBarView != null) {
1942            checkBarMode(mNavigationBarMode,
1943                    mNavigationBarWindowState, mNavigationBarView.getBarTransitions());
1944        }
1945    }
1946
1947    private void checkBarMode(int mode, int windowState, BarTransitions transitions) {
1948        final boolean anim = (mScreenOn == null || mScreenOn) && windowState != WINDOW_STATE_HIDDEN;
1949        transitions.transitionTo(mode, anim);
1950    }
1951
1952    private void finishBarAnimations() {
1953        mStatusBarView.getBarTransitions().finishAnimations();
1954        if (mNavigationBarView != null) {
1955            mNavigationBarView.getBarTransitions().finishAnimations();
1956        }
1957    }
1958
1959    private final Runnable mCheckBarModes = new Runnable() {
1960        @Override
1961        public void run() {
1962            checkBarModes();
1963        }};
1964
1965    @Override
1966    public void setInteracting(int barWindow, boolean interacting) {
1967        mInteractingWindows = interacting
1968                ? (mInteractingWindows | barWindow)
1969                : (mInteractingWindows & ~barWindow);
1970        if (mInteractingWindows != 0) {
1971            suspendAutohide();
1972        } else {
1973            resumeSuspendedAutohide();
1974        }
1975        checkBarModes();
1976    }
1977
1978    private void resumeSuspendedAutohide() {
1979        if (mAutohideSuspended) {
1980            scheduleAutohide();
1981            mHandler.postDelayed(mCheckBarModes, 500); // longer than home -> launcher
1982        }
1983    }
1984
1985    private void suspendAutohide() {
1986        mHandler.removeCallbacks(mAutohide);
1987        mHandler.removeCallbacks(mCheckBarModes);
1988        mAutohideSuspended = (mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT) != 0;
1989    }
1990
1991    private void cancelAutohide() {
1992        mAutohideSuspended = false;
1993        mHandler.removeCallbacks(mAutohide);
1994    }
1995
1996    private void scheduleAutohide() {
1997        cancelAutohide();
1998        mHandler.postDelayed(mAutohide, AUTOHIDE_TIMEOUT_MS);
1999    }
2000
2001    private void checkUserAutohide(View v, MotionEvent event) {
2002        if ((mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT) != 0  // a transient bar is revealed
2003                && event.getAction() == MotionEvent.ACTION_OUTSIDE // touch outside the source bar
2004                && event.getX() == 0 && event.getY() == 0  // a touch outside both bars
2005                ) {
2006            userAutohide();
2007        }
2008    }
2009
2010    private void userAutohide() {
2011        cancelAutohide();
2012        mHandler.postDelayed(mAutohide, 350); // longer than app gesture -> flag clear
2013    }
2014
2015    private boolean areLightsOn() {
2016        return 0 == (mSystemUiVisibility & View.SYSTEM_UI_FLAG_LOW_PROFILE);
2017    }
2018
2019    public void setLightsOn(boolean on) {
2020        Log.v(TAG, "setLightsOn(" + on + ")");
2021        if (on) {
2022            setSystemUiVisibility(0, View.SYSTEM_UI_FLAG_LOW_PROFILE);
2023        } else {
2024            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE, View.SYSTEM_UI_FLAG_LOW_PROFILE);
2025        }
2026    }
2027
2028    private void notifyUiVisibilityChanged(int vis) {
2029        try {
2030            mWindowManagerService.statusBarVisibilityChanged(vis);
2031        } catch (RemoteException ex) {
2032        }
2033    }
2034
2035    public void topAppWindowChanged(boolean showMenu) {
2036        if (DEBUG) {
2037            Log.d(TAG, (showMenu?"showing":"hiding") + " the MENU button");
2038        }
2039        if (mNavigationBarView != null) {
2040            mNavigationBarView.setMenuVisibility(showMenu);
2041        }
2042
2043        // See above re: lights-out policy for legacy apps.
2044        if (showMenu) setLightsOn(true);
2045    }
2046
2047    @Override
2048    public void setImeWindowStatus(IBinder token, int vis, int backDisposition) {
2049        boolean altBack = (backDisposition == InputMethodService.BACK_DISPOSITION_WILL_DISMISS)
2050            || ((vis & InputMethodService.IME_VISIBLE) != 0);
2051
2052        setNavigationIconHints(
2053                altBack ? (mNavigationIconHints | NAVIGATION_HINT_BACK_ALT)
2054                        : (mNavigationIconHints & ~NAVIGATION_HINT_BACK_ALT));
2055        if (mQS != null) mQS.setImeWindowStatus(vis > 0);
2056    }
2057
2058    @Override
2059    public void setHardKeyboardStatus(boolean available, boolean enabled) {}
2060
2061    @Override
2062    protected void tick(IBinder key, StatusBarNotification n, boolean firstTime) {
2063        // no ticking in lights-out mode
2064        if (!areLightsOn()) return;
2065
2066        // no ticking in Setup
2067        if (!isDeviceProvisioned()) return;
2068
2069        // not for you
2070        if (!notificationIsForCurrentUser(n)) return;
2071
2072        // Show the ticker if one is requested. Also don't do this
2073        // until status bar window is attached to the window manager,
2074        // because...  well, what's the point otherwise?  And trying to
2075        // run a ticker without being attached will crash!
2076        if (n.getNotification().tickerText != null && mStatusBarWindow.getWindowToken() != null) {
2077            if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS
2078                            | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) {
2079                mTicker.addEntry(n);
2080            }
2081        }
2082    }
2083
2084    private class MyTicker extends Ticker {
2085        MyTicker(Context context, View sb) {
2086            super(context, sb);
2087        }
2088
2089        @Override
2090        public void tickerStarting() {
2091            mTicking = true;
2092            mStatusBarContents.setVisibility(View.GONE);
2093            mTickerView.setVisibility(View.VISIBLE);
2094            mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_up_in, null));
2095            mStatusBarContents.startAnimation(loadAnim(com.android.internal.R.anim.push_up_out, null));
2096        }
2097
2098        @Override
2099        public void tickerDone() {
2100            mStatusBarContents.setVisibility(View.VISIBLE);
2101            mTickerView.setVisibility(View.GONE);
2102            mStatusBarContents.startAnimation(loadAnim(com.android.internal.R.anim.push_down_in, null));
2103            mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_down_out,
2104                        mTickingDoneListener));
2105        }
2106
2107        public void tickerHalting() {
2108            if (mStatusBarContents.getVisibility() != View.VISIBLE) {
2109                mStatusBarContents.setVisibility(View.VISIBLE);
2110                mStatusBarContents
2111                        .startAnimation(loadAnim(com.android.internal.R.anim.fade_in, null));
2112            }
2113            mTickerView.setVisibility(View.GONE);
2114            // we do not animate the ticker away at this point, just get rid of it (b/6992707)
2115        }
2116    }
2117
2118    Animation.AnimationListener mTickingDoneListener = new Animation.AnimationListener() {;
2119        public void onAnimationEnd(Animation animation) {
2120            mTicking = false;
2121        }
2122        public void onAnimationRepeat(Animation animation) {
2123        }
2124        public void onAnimationStart(Animation animation) {
2125        }
2126    };
2127
2128    private Animation loadAnim(int id, Animation.AnimationListener listener) {
2129        Animation anim = AnimationUtils.loadAnimation(mContext, id);
2130        if (listener != null) {
2131            anim.setAnimationListener(listener);
2132        }
2133        return anim;
2134    }
2135
2136    public static String viewInfo(View v) {
2137        return "[(" + v.getLeft() + "," + v.getTop() + ")(" + v.getRight() + "," + v.getBottom()
2138                + ") " + v.getWidth() + "x" + v.getHeight() + "]";
2139    }
2140
2141    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
2142        synchronized (mQueueLock) {
2143            pw.println("Current Status Bar state:");
2144            pw.println("  mExpandedVisible=" + mExpandedVisible
2145                    + ", mTrackingPosition=" + mTrackingPosition);
2146            pw.println("  mTicking=" + mTicking);
2147            pw.println("  mTracking=" + mTracking);
2148            pw.println("  mDisplayMetrics=" + mDisplayMetrics);
2149            pw.println("  mPile: " + viewInfo(mPile));
2150            pw.println("  mTickerView: " + viewInfo(mTickerView));
2151            pw.println("  mScrollView: " + viewInfo(mScrollView)
2152                    + " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY());
2153        }
2154
2155        pw.print("  mInteractingWindows="); pw.println(mInteractingWindows);
2156        pw.print("  mStatusBarWindowState=");
2157        pw.println(windowStateToString(mStatusBarWindowState));
2158        pw.print("  mStatusBarMode=");
2159        pw.println(BarTransitions.modeToString(mStatusBarMode));
2160        dumpBarTransitions(pw, "mStatusBarView", mStatusBarView.getBarTransitions());
2161        if (mNavigationBarView != null) {
2162            pw.print("  mNavigationBarWindowState=");
2163            pw.println(windowStateToString(mNavigationBarWindowState));
2164            pw.print("  mNavigationBarMode=");
2165            pw.println(BarTransitions.modeToString(mNavigationBarMode));
2166            dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions());
2167        }
2168
2169        pw.print("  mNavigationBarView=");
2170        if (mNavigationBarView == null) {
2171            pw.println("null");
2172        } else {
2173            mNavigationBarView.dump(fd, pw, args);
2174        }
2175
2176        pw.println("  Panels: ");
2177        if (mNotificationPanel != null) {
2178            pw.println("    mNotificationPanel=" +
2179                mNotificationPanel + " params=" + mNotificationPanel.getLayoutParams().debug(""));
2180            pw.print  ("      ");
2181            mNotificationPanel.dump(fd, pw, args);
2182        }
2183        if (mSettingsPanel != null) {
2184            pw.println("    mSettingsPanel=" +
2185                mSettingsPanel + " params=" + mSettingsPanel.getLayoutParams().debug(""));
2186            pw.print  ("      ");
2187            mSettingsPanel.dump(fd, pw, args);
2188        }
2189
2190        if (DUMPTRUCK) {
2191            synchronized (mNotificationData) {
2192                int N = mNotificationData.size();
2193                pw.println("  notification icons: " + N);
2194                for (int i=0; i<N; i++) {
2195                    NotificationData.Entry e = mNotificationData.get(i);
2196                    pw.println("    [" + i + "] key=" + e.key + " icon=" + e.icon);
2197                    StatusBarNotification n = e.notification;
2198                    pw.println("         pkg=" + n.getPackageName() + " id=" + n.getId() + " score=" + n.getScore());
2199                    pw.println("         notification=" + n.getNotification());
2200                    pw.println("         tickerText=\"" + n.getNotification().tickerText + "\"");
2201                }
2202            }
2203
2204            int N = mStatusIcons.getChildCount();
2205            pw.println("  system icons: " + N);
2206            for (int i=0; i<N; i++) {
2207                StatusBarIconView ic = (StatusBarIconView) mStatusIcons.getChildAt(i);
2208                pw.println("    [" + i + "] icon=" + ic);
2209            }
2210
2211            if (false) {
2212                pw.println("see the logcat for a dump of the views we have created.");
2213                // must happen on ui thread
2214                mHandler.post(new Runnable() {
2215                        public void run() {
2216                            mStatusBarView.getLocationOnScreen(mAbsPos);
2217                            Log.d(TAG, "mStatusBarView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
2218                                    + ") " + mStatusBarView.getWidth() + "x"
2219                                    + getStatusBarHeight());
2220                            mStatusBarView.debug();
2221                        }
2222                    });
2223            }
2224        }
2225
2226        if (DEBUG_GESTURES) {
2227            pw.print("  status bar gestures: ");
2228            mGestureRec.dump(fd, pw, args);
2229        }
2230
2231        mNetworkController.dump(fd, pw, args);
2232    }
2233
2234    private static void dumpBarTransitions(PrintWriter pw, String var, BarTransitions transitions) {
2235        pw.print("  "); pw.print(var); pw.print(".BarTransitions.mMode=");
2236        pw.println(BarTransitions.modeToString(transitions.getMode()));
2237    }
2238
2239    @Override
2240    public void createAndAddWindows() {
2241        addStatusBarWindow();
2242    }
2243
2244    private void addStatusBarWindow() {
2245        // Put up the view
2246        final int height = getStatusBarHeight();
2247
2248        // Now that the status bar window encompasses the sliding panel and its
2249        // translucent backdrop, the entire thing is made TRANSLUCENT and is
2250        // hardware-accelerated.
2251        final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
2252                ViewGroup.LayoutParams.MATCH_PARENT,
2253                height,
2254                WindowManager.LayoutParams.TYPE_STATUS_BAR,
2255                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
2256                    | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
2257                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
2258                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
2259                PixelFormat.TRANSLUCENT);
2260
2261        lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
2262
2263        lp.gravity = getStatusBarGravity();
2264        lp.setTitle("StatusBar");
2265        lp.packageName = mContext.getPackageName();
2266
2267        makeStatusBarView();
2268        mWindowManager.addView(mStatusBarWindow, lp);
2269    }
2270
2271    void setNotificationIconVisibility(boolean visible, int anim) {
2272        int old = mNotificationIcons.getVisibility();
2273        int v = visible ? View.VISIBLE : View.INVISIBLE;
2274        if (old != v) {
2275            mNotificationIcons.setVisibility(v);
2276            mNotificationIcons.startAnimation(loadAnim(anim, null));
2277        }
2278    }
2279
2280    void updateExpandedInvisiblePosition() {
2281        mTrackingPosition = -mDisplayMetrics.heightPixels;
2282    }
2283
2284    static final float saturate(float a) {
2285        return a < 0f ? 0f : (a > 1f ? 1f : a);
2286    }
2287
2288    @Override
2289    protected int getExpandedViewMaxHeight() {
2290        return mDisplayMetrics.heightPixels - mNotificationPanelMarginBottomPx;
2291    }
2292
2293    @Override
2294    public void updateExpandedViewPos(int thingy) {
2295        if (SPEW) Log.v(TAG, "updateExpandedViewPos");
2296
2297        // on larger devices, the notification panel is propped open a bit
2298        mNotificationPanel.setMinimumHeight(
2299                (int)(mNotificationPanelMinHeightFrac * mCurrentDisplaySize.y));
2300
2301        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mNotificationPanel.getLayoutParams();
2302        lp.gravity = mNotificationPanelGravity;
2303        lp.setMarginStart(mNotificationPanelMarginPx);
2304        mNotificationPanel.setLayoutParams(lp);
2305
2306        if (mSettingsPanel != null) {
2307            lp = (FrameLayout.LayoutParams) mSettingsPanel.getLayoutParams();
2308            lp.gravity = mSettingsPanelGravity;
2309            lp.setMarginEnd(mNotificationPanelMarginPx);
2310            mSettingsPanel.setLayoutParams(lp);
2311        }
2312
2313        if (ENABLE_HEADS_UP && mHeadsUpNotificationView != null) {
2314            mHeadsUpNotificationView.setMargin(mNotificationPanelMarginPx);
2315            mPile.getLocationOnScreen(mPilePosition);
2316            mHeadsUpVerticalOffset = mPilePosition[1] - mNaturalBarHeight;
2317        }
2318
2319        updateCarrierLabelVisibility(false);
2320    }
2321
2322    // called by makeStatusbar and also by PhoneStatusBarView
2323    void updateDisplaySize() {
2324        mDisplay.getMetrics(mDisplayMetrics);
2325        mDisplay.getSize(mCurrentDisplaySize);
2326        if (DEBUG_GESTURES) {
2327            mGestureRec.tag("display",
2328                    String.format("%dx%d", mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels));
2329        }
2330    }
2331
2332    private View.OnClickListener mClearButtonListener = new View.OnClickListener() {
2333        public void onClick(View v) {
2334            synchronized (mNotificationData) {
2335                // animate-swipe all dismissable notifications, then animate the shade closed
2336                int numChildren = mPile.getChildCount();
2337
2338                int scrollTop = mScrollView.getScrollY();
2339                int scrollBottom = scrollTop + mScrollView.getHeight();
2340                final ArrayList<View> snapshot = new ArrayList<View>(numChildren);
2341                for (int i=0; i<numChildren; i++) {
2342                    final View child = mPile.getChildAt(i);
2343                    if (mPile.canChildBeDismissed(child) && child.getBottom() > scrollTop &&
2344                            child.getTop() < scrollBottom) {
2345                        snapshot.add(child);
2346                    }
2347                }
2348                if (snapshot.isEmpty()) {
2349                    animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
2350                    return;
2351                }
2352                new Thread(new Runnable() {
2353                    @Override
2354                    public void run() {
2355                        // Decrease the delay for every row we animate to give the sense of
2356                        // accelerating the swipes
2357                        final int ROW_DELAY_DECREMENT = 10;
2358                        int currentDelay = 140;
2359                        int totalDelay = 0;
2360
2361                        // Set the shade-animating state to avoid doing other work during
2362                        // all of these animations. In particular, avoid layout and
2363                        // redrawing when collapsing the shade.
2364                        mPile.setViewRemoval(false);
2365
2366                        mPostCollapseCleanup = new Runnable() {
2367                            @Override
2368                            public void run() {
2369                                if (DEBUG) {
2370                                    Log.v(TAG, "running post-collapse cleanup");
2371                                }
2372                                try {
2373                                    mPile.setViewRemoval(true);
2374                                    mBarService.onClearAllNotifications();
2375                                } catch (Exception ex) { }
2376                            }
2377                        };
2378
2379                        View sampleView = snapshot.get(0);
2380                        int width = sampleView.getWidth();
2381                        final int dir = sampleView.isLayoutRtl() ? -1 : +1;
2382                        final int velocity = dir * width * 8; // 1000/8 = 125 ms duration
2383                        for (final View _v : snapshot) {
2384                            mHandler.postDelayed(new Runnable() {
2385                                @Override
2386                                public void run() {
2387                                    mPile.dismissRowAnimated(_v, velocity);
2388                                }
2389                            }, totalDelay);
2390                            currentDelay = Math.max(50, currentDelay - ROW_DELAY_DECREMENT);
2391                            totalDelay += currentDelay;
2392                        }
2393                        // Delay the collapse animation until after all swipe animations have
2394                        // finished. Provide some buffer because there may be some extra delay
2395                        // before actually starting each swipe animation. Ideally, we'd
2396                        // synchronize the end of those animations with the start of the collaps
2397                        // exactly.
2398                        mHandler.postDelayed(new Runnable() {
2399                            @Override
2400                            public void run() {
2401                                animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
2402                            }
2403                        }, totalDelay + 225);
2404                    }
2405                }).start();
2406            }
2407        }
2408    };
2409
2410    public void startActivityDismissingKeyguard(Intent intent, boolean onlyProvisioned) {
2411        if (onlyProvisioned && !isDeviceProvisioned()) return;
2412        try {
2413            // Dismiss the lock screen when Settings starts.
2414            ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
2415        } catch (RemoteException e) {
2416        }
2417        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
2418        mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
2419        animateCollapsePanels();
2420    }
2421
2422    private View.OnClickListener mSettingsButtonListener = new View.OnClickListener() {
2423        public void onClick(View v) {
2424            if (mHasSettingsPanel) {
2425                animateExpandSettingsPanel();
2426            } else {
2427                startActivityDismissingKeyguard(
2428                        new Intent(android.provider.Settings.ACTION_SETTINGS), true);
2429            }
2430        }
2431    };
2432
2433    private View.OnClickListener mClockClickListener = new View.OnClickListener() {
2434        public void onClick(View v) {
2435            startActivityDismissingKeyguard(
2436                    new Intent(Intent.ACTION_QUICK_CLOCK), true); // have fun, everyone
2437        }
2438    };
2439
2440    private View.OnClickListener mNotificationButtonListener = new View.OnClickListener() {
2441        public void onClick(View v) {
2442            animateExpandNotificationsPanel();
2443        }
2444    };
2445
2446    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
2447        public void onReceive(Context context, Intent intent) {
2448            if (DEBUG) Log.v(TAG, "onReceive: " + intent);
2449            String action = intent.getAction();
2450            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
2451                int flags = CommandQueue.FLAG_EXCLUDE_NONE;
2452                String reason = intent.getStringExtra("reason");
2453                if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
2454                    flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
2455                }
2456                animateCollapsePanels(flags);
2457            }
2458            else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
2459                mScreenOn = false;
2460                // no waiting!
2461                makeExpandedInvisible();
2462                notifyNavigationBarScreenOn(false);
2463                notifyHeadsUpScreenOn(false);
2464                finishBarAnimations();
2465            }
2466            else if (Intent.ACTION_SCREEN_ON.equals(action)) {
2467                mScreenOn = true;
2468                // work around problem where mDisplay.getRotation() is not stable while screen is off (bug 7086018)
2469                repositionNavigationBar();
2470                notifyNavigationBarScreenOn(true);
2471            }
2472            else if (ACTION_DEMO.equals(action)) {
2473                Bundle bundle = intent.getExtras();
2474                if (bundle != null) {
2475                    String command = bundle.getString("command", "").trim().toLowerCase();
2476                    if (command.length() > 0) {
2477                        try {
2478                            dispatchDemoCommand(command, bundle);
2479                        } catch (Throwable t) {
2480                            Log.w(TAG, "Error running demo command, intent=" + intent, t);
2481                        }
2482                    }
2483                }
2484            }
2485        }
2486    };
2487
2488    // SystemUIService notifies SystemBars of configuration changes, which then calls down here
2489    @Override
2490    protected void onConfigurationChanged(Configuration newConfig) {
2491        super.onConfigurationChanged(newConfig); // calls refreshLayout
2492
2493        if (DEBUG) {
2494            Log.v(TAG, "configuration changed: " + mContext.getResources().getConfiguration());
2495        }
2496        updateDisplaySize(); // populates mDisplayMetrics
2497
2498        updateResources();
2499        repositionNavigationBar();
2500        updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
2501        updateShowSearchHoldoff();
2502    }
2503
2504    @Override
2505    public void userSwitched(int newUserId) {
2506        if (MULTIUSER_DEBUG) mNotificationPanelDebugText.setText("USER " + newUserId);
2507        animateCollapsePanels();
2508        updateNotificationIcons();
2509        resetUserSetupObserver();
2510    }
2511
2512    private void resetUserSetupObserver() {
2513        mContext.getContentResolver().unregisterContentObserver(mUserSetupObserver);
2514        mUserSetupObserver.onChange(false);
2515        mContext.getContentResolver().registerContentObserver(
2516                Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), true,
2517                mUserSetupObserver,
2518                mCurrentUserId);
2519    }
2520
2521    private void setHeadsUpVisibility(boolean vis) {
2522        if (!ENABLE_HEADS_UP) return;
2523        if (DEBUG) Log.v(TAG, (vis ? "showing" : "hiding") + " heads up window");
2524        mHeadsUpNotificationView.setVisibility(vis ? View.VISIBLE : View.GONE);
2525        if (!vis) {
2526            if (DEBUG) Log.d(TAG, "setting heads up entry to null");
2527            mInterruptingNotificationEntry = null;
2528        }
2529    }
2530
2531    public void animateHeadsUp(boolean animateInto, float frac) {
2532        if (!ENABLE_HEADS_UP || mHeadsUpNotificationView == null) return;
2533        frac = frac / 0.4f;
2534        frac = frac < 1.0f ? frac : 1.0f;
2535        float alpha = 1.0f - frac;
2536        float offset = mHeadsUpVerticalOffset * frac;
2537        offset = animateInto ? offset : 0f;
2538        mHeadsUpNotificationView.setAlpha(alpha);
2539        mHeadsUpNotificationView.setY(offset);
2540    }
2541
2542    public void onHeadsUpDismissed() {
2543        if (mInterruptingNotificationEntry == null) return;
2544        mHandler.sendEmptyMessage(MSG_HIDE_HEADS_UP);
2545        if (mHeadsUpNotificationView.isClearable()) {
2546            try {
2547                mBarService.onNotificationClear(
2548                        mInterruptingNotificationEntry.notification.getPackageName(),
2549                        mInterruptingNotificationEntry.notification.getTag(),
2550                        mInterruptingNotificationEntry.notification.getId());
2551            } catch (android.os.RemoteException ex) {
2552                // oh well
2553            }
2554        }
2555    }
2556
2557    /**
2558     * Reload some of our resources when the configuration changes.
2559     *
2560     * We don't reload everything when the configuration changes -- we probably
2561     * should, but getting that smooth is tough.  Someday we'll fix that.  In the
2562     * meantime, just update the things that we know change.
2563     */
2564    void updateResources() {
2565        final Context context = mContext;
2566        final Resources res = context.getResources();
2567
2568        if (mClearButton instanceof TextView) {
2569            ((TextView)mClearButton).setText(context.getText(R.string.status_bar_clear_all_button));
2570        }
2571
2572        // Update the QuickSettings container
2573        if (mQS != null) mQS.updateResources();
2574
2575        loadDimens();
2576    }
2577
2578    protected void loadDimens() {
2579        final Resources res = mContext.getResources();
2580
2581        mNaturalBarHeight = res.getDimensionPixelSize(
2582                com.android.internal.R.dimen.status_bar_height);
2583
2584        int newIconSize = res.getDimensionPixelSize(
2585            com.android.internal.R.dimen.status_bar_icon_size);
2586        int newIconHPadding = res.getDimensionPixelSize(
2587            R.dimen.status_bar_icon_padding);
2588
2589        if (newIconHPadding != mIconHPadding || newIconSize != mIconSize) {
2590//            Log.d(TAG, "size=" + newIconSize + " padding=" + newIconHPadding);
2591            mIconHPadding = newIconHPadding;
2592            mIconSize = newIconSize;
2593            //reloadAllNotificationIcons(); // reload the tray
2594        }
2595
2596        mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore);
2597
2598        mSelfExpandVelocityPx = res.getDimension(R.dimen.self_expand_velocity);
2599        mSelfCollapseVelocityPx = res.getDimension(R.dimen.self_collapse_velocity);
2600        mFlingExpandMinVelocityPx = res.getDimension(R.dimen.fling_expand_min_velocity);
2601        mFlingCollapseMinVelocityPx = res.getDimension(R.dimen.fling_collapse_min_velocity);
2602
2603        mCollapseMinDisplayFraction = res.getFraction(R.dimen.collapse_min_display_fraction, 1, 1);
2604        mExpandMinDisplayFraction = res.getFraction(R.dimen.expand_min_display_fraction, 1, 1);
2605
2606        mExpandAccelPx = res.getDimension(R.dimen.expand_accel);
2607        mCollapseAccelPx = res.getDimension(R.dimen.collapse_accel);
2608
2609        mFlingGestureMaxXVelocityPx = res.getDimension(R.dimen.fling_gesture_max_x_velocity);
2610
2611        mFlingGestureMaxOutputVelocityPx = res.getDimension(R.dimen.fling_gesture_max_output_velocity);
2612
2613        mNotificationPanelMarginBottomPx
2614            = (int) res.getDimension(R.dimen.notification_panel_margin_bottom);
2615        mNotificationPanelMarginPx
2616            = (int) res.getDimension(R.dimen.notification_panel_margin_left);
2617        mNotificationPanelGravity = res.getInteger(R.integer.notification_panel_layout_gravity);
2618        if (mNotificationPanelGravity <= 0) {
2619            mNotificationPanelGravity = Gravity.START | Gravity.TOP;
2620        }
2621        mSettingsPanelGravity = res.getInteger(R.integer.settings_panel_layout_gravity);
2622        Log.d(TAG, "mSettingsPanelGravity = " + mSettingsPanelGravity);
2623        if (mSettingsPanelGravity <= 0) {
2624            mSettingsPanelGravity = Gravity.END | Gravity.TOP;
2625        }
2626
2627        mCarrierLabelHeight = res.getDimensionPixelSize(R.dimen.carrier_label_height);
2628        mNotificationHeaderHeight = res.getDimensionPixelSize(R.dimen.notification_panel_header_height);
2629
2630        mNotificationPanelMinHeightFrac = res.getFraction(R.dimen.notification_panel_min_height_frac, 1, 1);
2631        if (mNotificationPanelMinHeightFrac < 0f || mNotificationPanelMinHeightFrac > 1f) {
2632            mNotificationPanelMinHeightFrac = 0f;
2633        }
2634
2635        mHeadsUpNotificationDecay = res.getInteger(R.integer.heads_up_notification_decay);
2636        mRowHeight =  res.getDimensionPixelSize(R.dimen.notification_row_min_height);
2637
2638        if (false) Log.v(TAG, "updateResources");
2639    }
2640
2641    //
2642    // tracing
2643    //
2644
2645    void postStartTracing() {
2646        mHandler.postDelayed(mStartTracing, 3000);
2647    }
2648
2649    void vibrate() {
2650        android.os.Vibrator vib = (android.os.Vibrator)mContext.getSystemService(
2651                Context.VIBRATOR_SERVICE);
2652        vib.vibrate(250);
2653    }
2654
2655    Runnable mStartTracing = new Runnable() {
2656        public void run() {
2657            vibrate();
2658            SystemClock.sleep(250);
2659            Log.d(TAG, "startTracing");
2660            android.os.Debug.startMethodTracing("/data/statusbar-traces/trace");
2661            mHandler.postDelayed(mStopTracing, 10000);
2662        }
2663    };
2664
2665    Runnable mStopTracing = new Runnable() {
2666        public void run() {
2667            android.os.Debug.stopMethodTracing();
2668            Log.d(TAG, "stopTracing");
2669            vibrate();
2670        }
2671    };
2672
2673    @Override
2674    protected void haltTicker() {
2675        mTicker.halt();
2676    }
2677
2678    @Override
2679    protected boolean shouldDisableNavbarGestures() {
2680        return !isDeviceProvisioned()
2681                || mExpandedVisible
2682                || (mDisabled & StatusBarManager.DISABLE_SEARCH) != 0;
2683    }
2684
2685    private static class FastColorDrawable extends Drawable {
2686        private final int mColor;
2687
2688        public FastColorDrawable(int color) {
2689            mColor = 0xff000000 | color;
2690        }
2691
2692        @Override
2693        public void draw(Canvas canvas) {
2694            canvas.drawColor(mColor, PorterDuff.Mode.SRC);
2695        }
2696
2697        @Override
2698        public void setAlpha(int alpha) {
2699        }
2700
2701        @Override
2702        public void setColorFilter(ColorFilter cf) {
2703        }
2704
2705        @Override
2706        public int getOpacity() {
2707            return PixelFormat.OPAQUE;
2708        }
2709
2710        @Override
2711        public void setBounds(int left, int top, int right, int bottom) {
2712        }
2713
2714        @Override
2715        public void setBounds(Rect bounds) {
2716        }
2717    }
2718
2719    @Override
2720    public void destroy() {
2721        super.destroy();
2722        if (mStatusBarWindow != null) {
2723            mWindowManager.removeViewImmediate(mStatusBarWindow);
2724        }
2725        if (mNavigationBarView != null) {
2726            mWindowManager.removeViewImmediate(mNavigationBarView);
2727        }
2728        mContext.unregisterReceiver(mBroadcastReceiver);
2729    }
2730
2731    private boolean mDemoModeAllowed;
2732    private boolean mDemoMode;
2733    private DemoStatusIcons mDemoStatusIcons;
2734
2735    @Override
2736    public void dispatchDemoCommand(String command, Bundle args) {
2737        if (!mDemoModeAllowed) {
2738            mDemoModeAllowed = Settings.Global.getInt(mContext.getContentResolver(),
2739                    "sysui_demo_allowed", 0) != 0;
2740        }
2741        if (!mDemoModeAllowed) return;
2742        if (command.equals(COMMAND_ENTER)) {
2743            mDemoMode = true;
2744        } else if (command.equals(COMMAND_EXIT)) {
2745            mDemoMode = false;
2746            checkBarModes();
2747        } else if (!mDemoMode) {
2748            // automatically enter demo mode on first demo command
2749            dispatchDemoCommand(COMMAND_ENTER, new Bundle());
2750        }
2751        boolean modeChange = command.equals(COMMAND_ENTER) || command.equals(COMMAND_EXIT);
2752        if (modeChange || command.equals(COMMAND_CLOCK)) {
2753            dispatchDemoCommandToView(command, args, R.id.clock);
2754        }
2755        if (modeChange || command.equals(COMMAND_BATTERY)) {
2756            dispatchDemoCommandToView(command, args, R.id.battery);
2757        }
2758        if (modeChange || command.equals(COMMAND_STATUS)) {
2759            if (mDemoStatusIcons == null) {
2760                mDemoStatusIcons = new DemoStatusIcons(mStatusIcons, mIconSize);
2761            }
2762            mDemoStatusIcons.dispatchDemoCommand(command, args);
2763        }
2764        if (mNetworkController != null && (modeChange || command.equals(COMMAND_NETWORK))) {
2765            mNetworkController.dispatchDemoCommand(command, args);
2766        }
2767        if (command.equals(COMMAND_BARS)) {
2768            String mode = args.getString("mode");
2769            int barMode = "opaque".equals(mode) ? MODE_OPAQUE :
2770                    "translucent".equals(mode) ? MODE_TRANSLUCENT :
2771                    "semi-transparent".equals(mode) ? MODE_SEMI_TRANSPARENT :
2772                    -1;
2773            if (barMode != -1) {
2774                boolean animate = true;
2775                if (mStatusBarView != null) {
2776                    mStatusBarView.getBarTransitions().transitionTo(barMode, animate);
2777                }
2778                if (mNavigationBarView != null) {
2779                    mNavigationBarView.getBarTransitions().transitionTo(barMode, animate);
2780                }
2781            }
2782        }
2783    }
2784
2785    private void dispatchDemoCommandToView(String command, Bundle args, int id) {
2786        if (mStatusBarView == null) return;
2787        View v = mStatusBarView.findViewById(id);
2788        if (v instanceof DemoMode) {
2789            ((DemoMode)v).dispatchDemoCommand(command, args);
2790        }
2791    }
2792}
2793