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