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