TabletStatusBar.java revision 2ed08d2e70250517e5578dd650c96b14aacf9ba5
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 17808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratopackage com.android.systemui.statusbar.tablet; 18808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 19f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport java.io.FileDescriptor; 20f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onoratoimport java.io.PrintWriter; 21b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandlerimport java.util.ArrayList; 22b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandlerimport java.util.Map; 23b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandlerimport java.util.IdentityHashMap; 24f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 25b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandlerimport android.animation.LayoutTransition; 26b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandlerimport android.animation.ObjectAnimator; 27b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandlerimport android.animation.AnimatorSet; 28dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.app.ActivityManagerNative; 29dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.app.PendingIntent; 30ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onoratoimport android.app.Notification; 31dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.app.StatusBarManager; 32808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.content.Context; 33808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.content.Intent; 340ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandlerimport android.content.res.Configuration; 35808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.content.res.Resources; 36857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onoratoimport android.inputmethodservice.InputMethodService; 379120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.graphics.PixelFormat; 38dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.graphics.Rect; 394daaeafd278d22ec9013d1cdaade562044ee907eJoe Onoratoimport android.graphics.drawable.Drawable; 404daaeafd278d22ec9013d1cdaade562044ee907eJoe Onoratoimport android.graphics.drawable.LayerDrawable; 419120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.os.Handler; 42808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.os.IBinder; 433eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandlerimport android.os.Message; 44dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.os.RemoteException; 4510163c689a713a35f69aad420c35372946b8b32aDaniel Sandlerimport android.os.ServiceManager; 46ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onoratoimport android.text.TextUtils; 473eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandlerimport android.util.Slog; 4855d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onoratoimport android.view.animation.Animation; 49ce70d91844d2e4fb987617d2924ae5b73096e5c3Daniel Sandlerimport android.view.animation.AnimationUtils; 50808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.Gravity; 5110163c689a713a35f69aad420c35372946b8b32aDaniel Sandlerimport android.view.IWindowManager; 5210163c689a713a35f69aad420c35372946b8b32aDaniel Sandlerimport android.view.KeyEvent; 533eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandlerimport android.view.LayoutInflater; 54b62ac127824e9723534a197189eca58d30f15d3dJoe Onoratoimport android.view.MotionEvent; 558304da460f95c0883eca0d97fcdc4eb42c10f7c2Daniel Sandlerimport android.view.VelocityTracker; 56808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.View; 57b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandlerimport android.view.ViewConfiguration; 589120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.view.ViewGroup; 599120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.view.WindowManager; 609120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.view.WindowManagerImpl; 61ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onoratoimport android.widget.FrameLayout; 623eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandlerimport android.widget.ImageView; 63808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.widget.LinearLayout; 64dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.widget.RemoteViews; 65dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.widget.ScrollView; 66dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.widget.TextSwitcher; 679120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.widget.TextView; 68808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 69808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport com.android.internal.statusbar.StatusBarIcon; 70808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport com.android.internal.statusbar.StatusBarNotification; 71808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 72fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport com.android.systemui.R; 73808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport com.android.systemui.statusbar.*; 74fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport com.android.systemui.statusbar.policy.BatteryController; 75fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport com.android.systemui.statusbar.policy.NetworkController; 76013cfc1116e3382981aa0da903d97fc4fdb2c791Joe Onoratoimport com.android.systemui.recent.RecentApplicationsActivity; 77808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 78dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onoratopublic class TabletStatusBar extends StatusBar implements 79dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato HeightReceiver.OnBarHeightChangedListener { 80fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler public static final boolean DEBUG = false; 81fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato public static final String TAG = "TabletStatusBar"; 82808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 830ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler public static final int MAX_NOTIFICATION_ICONS = 5; 8482beadfa067b1e286fa604f8d7960d769411c954satok // IME switcher icon is big and occupy width of two icons 855113382e95d5f5f322bc6618bef7d1c7f96e295fsatok public static final int MAX_NOTIFICATION_ICONS_IME_BUTTON_VISIBLE = MAX_NOTIFICATION_ICONS - 1; 860ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 87b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato public static final int MSG_OPEN_NOTIFICATION_PANEL = 1000; 88b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato public static final int MSG_CLOSE_NOTIFICATION_PANEL = 1001; 89b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler public static final int MSG_OPEN_NOTIFICATION_PEEK = 1002; 90b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler public static final int MSG_CLOSE_NOTIFICATION_PEEK = 1003; 9144c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller public static final int MSG_OPEN_RECENTS_PANEL = 1020; 9244c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller public static final int MSG_CLOSE_RECENTS_PANEL = 1021; 930ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler public static final int MSG_SHOW_CHROME = 1030; 940ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler public static final int MSG_HIDE_CHROME = 1031; 9582beadfa067b1e286fa604f8d7960d769411c954satok public static final int MSG_OPEN_INPUT_METHODS_PANEL = 1040; 9682beadfa067b1e286fa604f8d7960d769411c954satok public static final int MSG_CLOSE_INPUT_METHODS_PANEL = 1041; 972ed08d2e70250517e5578dd650c96b14aacf9ba5Daniel Sandler public static final int MSG_STOP_TICKER = 2000; 9844c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller 9910163c689a713a35f69aad420c35372946b8b32aDaniel Sandler // Fitts' Law assistance for LatinIME; TODO: replace with a more general approach 10010163c689a713a35f69aad420c35372946b8b32aDaniel Sandler private static final boolean FAKE_SPACE_BAR = true; 10110163c689a713a35f69aad420c35372946b8b32aDaniel Sandler 102dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato // The height of the bar, as definied by the build. It may be taller if we're plugged 103dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato // into hdmi. 104dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato int mNaturalBarHeight = -1; 1050ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler int mIconSize = -1; 1060ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler int mIconHPadding = -1; 1079120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler 1089120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler H mHandler = new H(); 1099120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler 11010163c689a713a35f69aad420c35372946b8b32aDaniel Sandler IWindowManager mWindowManager; 11110163c689a713a35f69aad420c35372946b8b32aDaniel Sandler 112dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler // tracking all current notifications 113dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler private NotificationData mNotns = new NotificationData(); 11444c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller 115b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato TabletStatusBarView mStatusBarView; 116fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato View mNotificationArea; 117fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato View mNotificationTrigger; 118dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler NotificationIconArea mNotificationIconArea; 119091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato View mNavigationArea; 120b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler 121536c58fbe51a53d0e6e78c360c9f6069ae0fd465Joe Onorato ImageView mBackButton; 122b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler View mHomeButton; 123e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler View mMenuButton; 124f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato View mRecentButton; 125dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 126ec51a82bd6e7a33fe6ed84ba252b82625629eaacJoe Onorato ViewGroup mNotificationAndImeArea; 127cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok InputMethodButton mInputMethodSwitchButton; 12806487a58be22b100daf3f950b9a1d25c3ea42aa2satok 129ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato NotificationPanel mNotificationPanel; 1308a576713e255eb822558cef840d170d4477f47f0Joe Onorato NotificationPeekPanel mNotificationPeekWindow; 131b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ViewGroup mNotificationPeekRow; 132b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler int mNotificationPeekIndex; 133a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler IBinder mNotificationPeekKey; 134b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler LayoutTransition mNotificationPeekScrubLeft, mNotificationPeekScrubRight; 135b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 136b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler int mNotificationPeekTapDuration; 137b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler int mNotificationFlingVelocity; 1383eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 1390f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler ViewGroup mPile; 1403eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 141dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato HeightReceiver mHeightReceiver; 142fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato BatteryController mBatteryController; 143fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato NetworkController mNetworkController; 1441e3ed8fc9537209920eea6adf5e576058f81d587Daniel Sandler 145ce70d91844d2e4fb987617d2924ae5b73096e5c3Daniel Sandler View mBarContents; 146b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler 1470ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler // hide system chrome ("lights out") support 1480ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler View mShadow; 149ce70d91844d2e4fb987617d2924ae5b73096e5c3Daniel Sandler 1500f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler NotificationIconArea.IconLayout mIconLayout; 1510f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 152ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato TabletTicker mTicker; 153dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 15410163c689a713a35f69aad420c35372946b8b32aDaniel Sandler View mFakeSpaceBar; 15510163c689a713a35f69aad420c35372946b8b32aDaniel Sandler KeyEvent mSpaceBarKeyEvent = null; 15610163c689a713a35f69aad420c35372946b8b32aDaniel Sandler 157dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler // for disabling the status bar 158dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler int mDisabled = 0; 159dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 16055d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato boolean mNotificationsOn = true; 16144c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller private RecentAppsPanel mRecentsPanel; 16282beadfa067b1e286fa604f8d7960d769411c954satok private InputMethodsPanel mInputMethodsPanel; 16355d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato 164c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler public Context getContext() { return mContext; } 165c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler 1669120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler protected void addPanelWindows() { 167f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final Context context = mContext; 168f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 16944c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller // Notification Panel 170f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mNotificationPanel = (NotificationPanel)View.inflate(context, 171755cc74e4cebdf67d21a2477512a4ac9b01e8323Joe Onorato R.layout.status_bar_notification_panel, null); 1727c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato mNotificationPanel.show(false, false); 173b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mNotificationPanel.setOnTouchListener( 174ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato new TouchOutsideListener(MSG_CLOSE_NOTIFICATION_PANEL, mNotificationPanel)); 175b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 176fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato // the battery and network icons 177fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mBatteryController.addIconView((ImageView)mNotificationPanel.findViewById(R.id.battery)); 178fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mBatteryController.addLabelView( 179fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato (TextView)mNotificationPanel.findViewById(R.id.battery_text)); 180ddbba42b812ab397a75db78aba6b48fecf0e31f6Joe Onorato mNetworkController.addCombinedSignalIconView( 18142f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato (ImageView)mNotificationPanel.findViewById(R.id.network_signal)); 18242f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato mNetworkController.addDataTypeIconView( 18342f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato (ImageView)mNotificationPanel.findViewById(R.id.network_type)); 184fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mNetworkController.addLabelView( 185fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato (TextView)mNotificationPanel.findViewById(R.id.network_text)); 1863e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler mNetworkController.addLabelView( 1873e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler (TextView)mBarContents.findViewById(R.id.network_text)); 188fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 18955d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato mStatusBarView.setIgnoreChildren(0, mNotificationTrigger, mNotificationPanel); 190d39e388e6d7f19d6e8d620e449af4124efab1d0dDaniel Sandler 1919120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler WindowManager.LayoutParams lp = new WindowManager.LayoutParams( 192add26204231e2e40cf4a44774a3858cf05282539Daniel Sandler 512, // ViewGroup.LayoutParams.MATCH_PARENT, 193cf2b199e98de71dcac042484800c07366363a734Joe Onorato ViewGroup.LayoutParams.MATCH_PARENT, 1949120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, 1959120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 19646e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM 1977c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH 1987c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, 1999120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler PixelFormat.TRANSLUCENT); 200ea70e63c0dcd09ec5790f4dca6ddd76284a6a23dJoe Onorato lp.gravity = Gravity.BOTTOM | Gravity.RIGHT; 2019120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler lp.setTitle("NotificationPanel"); 2027c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED 2037c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; 2047c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato lp.windowAnimations = com.android.internal.R.style.Animation; // == no animation 2057d9ea8ccc8a9c0a9a947fbf303ead738528445f6Daniel Sandler// lp.windowAnimations = com.android.internal.R.style.Animation_ZoomButtons; // simple fade 2069120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler 2079120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler WindowManagerImpl.getDefault().addView(mNotificationPanel, lp); 2089120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler 209b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler // Notification preview window 2108a576713e255eb822558cef840d170d4477f47f0Joe Onorato mNotificationPeekWindow = (NotificationPeekPanel) View.inflate(context, 211755cc74e4cebdf67d21a2477512a4ac9b01e8323Joe Onorato R.layout.status_bar_notification_peek, null); 212b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekRow = (ViewGroup) mNotificationPeekWindow.findViewById(R.id.content); 213b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekWindow.setVisibility(View.GONE); 214b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekWindow.setOnTouchListener( 2155e759460dcb91ba96758c2ac6d354ff8563b78a4Joe Onorato new TouchOutsideListener(MSG_CLOSE_NOTIFICATION_PEEK, mNotificationPeekWindow)); 216b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekScrubRight = new LayoutTransition(); 21785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mNotificationPeekScrubRight.setAnimator(LayoutTransition.APPEARING, 218b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ObjectAnimator.ofInt(null, "left", -512, 0)); 21985babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mNotificationPeekScrubRight.setAnimator(LayoutTransition.DISAPPEARING, 220b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ObjectAnimator.ofInt(null, "left", -512, 0)); 221b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekScrubRight.setDuration(500); 222b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 223b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekScrubLeft = new LayoutTransition(); 22485babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mNotificationPeekScrubLeft.setAnimator(LayoutTransition.APPEARING, 225b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ObjectAnimator.ofInt(null, "left", 512, 0)); 22685babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mNotificationPeekScrubLeft.setAnimator(LayoutTransition.DISAPPEARING, 227b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ObjectAnimator.ofInt(null, "left", 512, 0)); 228b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekScrubLeft.setDuration(500); 229b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 230b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler // XXX: setIgnoreChildren? 231b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler lp = new WindowManager.LayoutParams( 232b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 512, // ViewGroup.LayoutParams.WRAP_CONTENT, 233b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ViewGroup.LayoutParams.WRAP_CONTENT, 234b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, 235b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 23646e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM 23746e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, 238b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler PixelFormat.TRANSLUCENT); 239b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler lp.gravity = Gravity.BOTTOM | Gravity.RIGHT; 240b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler lp.setTitle("NotificationPeekWindow"); 241b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler lp.windowAnimations = com.android.internal.R.style.Animation_Toast; 242b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 243b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler WindowManagerImpl.getDefault().addView(mNotificationPeekWindow, lp); 244b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 24544c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller // Recents Panel 24685babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mRecentsPanel = (RecentAppsPanel) View.inflate(context, 24785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller R.layout.status_bar_recent_panel, null); 24885babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mRecentsPanel.setVisibility(View.GONE); 24985babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mRecentsPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_RECENTS_PANEL, 25085babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mRecentsPanel)); 25185babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mStatusBarView.setIgnoreChildren(2, mRecentButton, mRecentsPanel); 25285babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller 25385babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller lp = new WindowManager.LayoutParams( 25485babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller ViewGroup.LayoutParams.WRAP_CONTENT, 25585babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller ViewGroup.LayoutParams.WRAP_CONTENT, 25685babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, 25785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 25885babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM 25985babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH 26085babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, 26185babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller PixelFormat.TRANSLUCENT); 26285babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller lp.gravity = Gravity.BOTTOM | Gravity.LEFT; 26385babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller lp.setTitle("RecentsPanel"); 26485babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller lp.windowAnimations = R.style.Animation_RecentPanel; 26585babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller 26685babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller WindowManagerImpl.getDefault().addView(mRecentsPanel, lp); 26785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mRecentsPanel.setBar(this); 26882beadfa067b1e286fa604f8d7960d769411c954satok 26982beadfa067b1e286fa604f8d7960d769411c954satok // Input methods Panel 27082beadfa067b1e286fa604f8d7960d769411c954satok mInputMethodsPanel = (InputMethodsPanel) View.inflate(context, 27182beadfa067b1e286fa604f8d7960d769411c954satok R.layout.status_bar_input_methods_panel, null); 27282beadfa067b1e286fa604f8d7960d769411c954satok mInputMethodsPanel.setVisibility(View.GONE); 27382beadfa067b1e286fa604f8d7960d769411c954satok mInputMethodsPanel.setOnTouchListener(new TouchOutsideListener( 27482beadfa067b1e286fa604f8d7960d769411c954satok MSG_CLOSE_INPUT_METHODS_PANEL, mInputMethodsPanel)); 275913f42d26a32621ad7dd52c52b8d150eedf4f8fesatok mInputMethodsPanel.setImeSwitchButton(mInputMethodSwitchButton); 27682beadfa067b1e286fa604f8d7960d769411c954satok mStatusBarView.setIgnoreChildren(3, mInputMethodSwitchButton, mInputMethodsPanel); 27782beadfa067b1e286fa604f8d7960d769411c954satok lp = new WindowManager.LayoutParams( 27882beadfa067b1e286fa604f8d7960d769411c954satok ViewGroup.LayoutParams.WRAP_CONTENT, 27982beadfa067b1e286fa604f8d7960d769411c954satok ViewGroup.LayoutParams.WRAP_CONTENT, 28082beadfa067b1e286fa604f8d7960d769411c954satok WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, 28182beadfa067b1e286fa604f8d7960d769411c954satok WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 28282beadfa067b1e286fa604f8d7960d769411c954satok | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM 28382beadfa067b1e286fa604f8d7960d769411c954satok | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH 28482beadfa067b1e286fa604f8d7960d769411c954satok | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, 28582beadfa067b1e286fa604f8d7960d769411c954satok PixelFormat.TRANSLUCENT); 28682beadfa067b1e286fa604f8d7960d769411c954satok lp.gravity = Gravity.BOTTOM | Gravity.RIGHT; 28782beadfa067b1e286fa604f8d7960d769411c954satok lp.setTitle("InputMethodsPanel"); 28882beadfa067b1e286fa604f8d7960d769411c954satok lp.windowAnimations = R.style.Animation_RecentPanel; 28982beadfa067b1e286fa604f8d7960d769411c954satok 29082beadfa067b1e286fa604f8d7960d769411c954satok WindowManagerImpl.getDefault().addView(mInputMethodsPanel, lp); 2919120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler } 292808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 293808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato @Override 294f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public void start() { 295f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato super.start(); // will add the main bar view 296808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato } 297808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 2980ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler @Override 299dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato protected void onConfigurationChanged(Configuration newConfig) { 3000ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler loadDimens(); 3010ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler } 3020ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 3030ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler protected void loadDimens() { 3040ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler final Resources res = mContext.getResources(); 3050ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 306dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato mNaturalBarHeight = res.getDimensionPixelSize( 307dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato com.android.internal.R.dimen.status_bar_height); 3080ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 3090ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler int newIconSize = res.getDimensionPixelSize( 3100ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler com.android.internal.R.dimen.status_bar_icon_size); 3110ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler int newIconHPadding = res.getDimensionPixelSize( 3120ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler R.dimen.status_bar_icon_padding); 3130ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 3140ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler if (newIconHPadding != mIconHPadding || newIconSize != mIconSize) { 3150ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler// Slog.d(TAG, "size=" + newIconSize + " padding=" + newIconHPadding); 3160ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mIconHPadding = newIconHPadding; 3170ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mIconSize = newIconSize; 3180ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler reloadAllNotificationIcons(); // reload the tray 3190ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler } 3200ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler } 3210ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 322808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato protected View makeStatusBarView() { 323f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final Context context = mContext; 32485babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller 32510163c689a713a35f69aad420c35372946b8b32aDaniel Sandler mWindowManager = IWindowManager.Stub.asInterface( 32610163c689a713a35f69aad420c35372946b8b32aDaniel Sandler ServiceManager.getService(Context.WINDOW_SERVICE)); 327808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 328dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato // This guy will listen for HDMI plugged broadcasts so we can resize the 329dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato // status bar as appropriate. 330dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato mHeightReceiver = new HeightReceiver(mContext); 331dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato mHeightReceiver.registerReceiver(); 3320ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler loadDimens(); 333808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 334b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato final TabletStatusBarView sb = (TabletStatusBarView)View.inflate( 335f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato context, R.layout.status_bar, null); 336808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato mStatusBarView = sb; 337808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 338b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato sb.setHandler(mHandler); 339b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 340ce70d91844d2e4fb987617d2924ae5b73096e5c3Daniel Sandler mBarContents = sb.findViewById(R.id.bar_contents); 341f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 342fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato // the whole right-hand side of the bar 343fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mNotificationArea = sb.findViewById(R.id.notificationArea); 344fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato 34555d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato // the button to open the notification area 346fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mNotificationTrigger = sb.findViewById(R.id.notificationTrigger); 347f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mNotificationTrigger.setOnClickListener(mOnClickListener); 34855d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato 349808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato // the more notifications icon 350808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato mNotificationIconArea = (NotificationIconArea)sb.findViewById(R.id.notificationIcons); 351808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 3523eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // where the icons go 3533eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler mIconLayout = (NotificationIconArea.IconLayout) sb.findViewById(R.id.icons); 354b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mIconLayout.setOnTouchListener(new NotificationIconTouchListener()); 355b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 356b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ViewConfiguration vc = ViewConfiguration.get(context); 357b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekTapDuration = vc.getTapTimeout(); 358b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationFlingVelocity = 300; // px/s 3593eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 360c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler mTicker = new TabletTicker(this); 361dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 362fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato // The icons 363fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mBatteryController = new BatteryController(mContext); 364fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mBatteryController.addIconView((ImageView)sb.findViewById(R.id.battery)); 365fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mNetworkController = new NetworkController(mContext); 36642f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato mNetworkController.addCombinedSignalIconView( 36742f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato (ImageView)sb.findViewById(R.id.network_signal)); 36842f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato mNetworkController.addDataTypeIconView( 36942f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato (ImageView)sb.findViewById(R.id.network_type)); 3701e3ed8fc9537209920eea6adf5e576058f81d587Daniel Sandler 371091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato // The navigation buttons 3726478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato mBackButton = (ImageView)sb.findViewById(R.id.back); 373091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato mNavigationArea = sb.findViewById(R.id.navigationArea); 374b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler mHomeButton = mNavigationArea.findViewById(R.id.home); 375e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler mMenuButton = mNavigationArea.findViewById(R.id.menu); 376b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler mRecentButton = mNavigationArea.findViewById(R.id.recent_apps); 377b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler mRecentButton.setOnClickListener(mOnClickListener); 378091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato 37906487a58be22b100daf3f950b9a1d25c3ea42aa2satok // The bar contents buttons 380ec51a82bd6e7a33fe6ed84ba252b82625629eaacJoe Onorato mNotificationAndImeArea = (ViewGroup)sb.findViewById(R.id.notificationAndImeArea); 381cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok mInputMethodSwitchButton = (InputMethodButton) sb.findViewById(R.id.imeSwitchButton); 38282beadfa067b1e286fa604f8d7960d769411c954satok // Overwrite the lister 38382beadfa067b1e286fa604f8d7960d769411c954satok mInputMethodSwitchButton.setOnClickListener(mOnClickListener); 38406487a58be22b100daf3f950b9a1d25c3ea42aa2satok 38510163c689a713a35f69aad420c35372946b8b32aDaniel Sandler // for redirecting errant bar taps to the IME 38610163c689a713a35f69aad420c35372946b8b32aDaniel Sandler mFakeSpaceBar = sb.findViewById(R.id.fake_space_bar); 38710163c689a713a35f69aad420c35372946b8b32aDaniel Sandler 388b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler // "shadows" of the status bar features, for lights-out mode 3890ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mShadow = sb.findViewById(R.id.bar_shadow); 3900ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mShadow.setOnTouchListener( 3910ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler new View.OnTouchListener() { 3920ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler public boolean onTouch(View v, MotionEvent ev) { 3930ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler if (ev.getAction() == MotionEvent.ACTION_DOWN) { 394d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler // even though setting the systemUI visibility below will turn these views 395d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler // on, we need them to come up faster so that they can catch this motion 396d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler // event 397d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler mShadow.setVisibility(View.GONE); 398d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler mBarContents.setVisibility(View.VISIBLE); 399d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler 40055bf3809b98dad0b8268804e684d63ea59124148Joe Onorato try { 40155bf3809b98dad0b8268804e684d63ea59124148Joe Onorato mBarService.setSystemUiVisibility(View.STATUS_BAR_VISIBLE); 40255bf3809b98dad0b8268804e684d63ea59124148Joe Onorato } catch (RemoteException ex) { 40355bf3809b98dad0b8268804e684d63ea59124148Joe Onorato // system process dead 40455bf3809b98dad0b8268804e684d63ea59124148Joe Onorato } 4050ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler } 4060ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler return false; 4070ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler } 4080ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler }); 4090ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 4100ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler // tuning parameters 4110ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler final int LIGHTS_GOING_OUT_SYSBAR_DURATION = 600; 4120ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler final int LIGHTS_GOING_OUT_SHADOW_DURATION = 1000; 4130ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler final int LIGHTS_GOING_OUT_SHADOW_DELAY = 500; 4140ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 4150ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler final int LIGHTS_COMING_UP_SYSBAR_DURATION = 200; 4160ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler// final int LIGHTS_COMING_UP_SYSBAR_DELAY = 50; 4170ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler final int LIGHTS_COMING_UP_SHADOW_DURATION = 0; 4180ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 4190ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler LayoutTransition xition = new LayoutTransition(); 4200ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setAnimator(LayoutTransition.APPEARING, 4210ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler ObjectAnimator.ofFloat(null, "alpha", 0.5f, 1f)); 4220ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setDuration(LayoutTransition.APPEARING, LIGHTS_COMING_UP_SYSBAR_DURATION); 4230ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setStartDelay(LayoutTransition.APPEARING, 0); 4240ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setAnimator(LayoutTransition.DISAPPEARING, 4250ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler ObjectAnimator.ofFloat(null, "alpha", 1f, 0f)); 4260ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setDuration(LayoutTransition.DISAPPEARING, LIGHTS_GOING_OUT_SYSBAR_DURATION); 4270ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setStartDelay(LayoutTransition.DISAPPEARING, 0); 4280ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler ((ViewGroup)sb.findViewById(R.id.bar_contents_holder)).setLayoutTransition(xition); 4290ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 4300ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition = new LayoutTransition(); 4310ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setAnimator(LayoutTransition.APPEARING, 4320ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler ObjectAnimator.ofFloat(null, "alpha", 0f, 1f)); 4330ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setDuration(LayoutTransition.APPEARING, LIGHTS_GOING_OUT_SHADOW_DURATION); 4340ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setStartDelay(LayoutTransition.APPEARING, LIGHTS_GOING_OUT_SHADOW_DELAY); 4350ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setAnimator(LayoutTransition.DISAPPEARING, 4360ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler ObjectAnimator.ofFloat(null, "alpha", 1f, 0f)); 4370ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setDuration(LayoutTransition.DISAPPEARING, LIGHTS_COMING_UP_SHADOW_DURATION); 4380ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler xition.setStartDelay(LayoutTransition.DISAPPEARING, 0); 4390ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler ((ViewGroup)sb.findViewById(R.id.bar_shadow_holder)).setLayoutTransition(xition); 440b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler 4415dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato // set the initial view visibility 4425dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato setAreThereNotifications(); 4435dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato 444dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler // Add the windows 445dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler addPanelWindows(); 446dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 447dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler mPile = (ViewGroup)mNotificationPanel.findViewById(R.id.content); 448dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler mPile.removeAllViews(); 44944c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller 450dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler ScrollView scroller = (ScrollView)mPile.getParent(); 451dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler scroller.setFillViewport(true); 452dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 453dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato mHeightReceiver.addOnBarHeightChangedListener(this); 454dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato 455808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato return sb; 456808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato } 457808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 458dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato public int getStatusBarHeight() { 459dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato return mHeightReceiver.getHeight(); 460dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato } 461dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato 462808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato protected int getStatusBarGravity() { 463808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato return Gravity.BOTTOM | Gravity.FILL_HORIZONTAL; 464808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato } 465808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 466dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato public void onBarHeightChanged(int height) { 467dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato final WindowManager.LayoutParams lp 468dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato = (WindowManager.LayoutParams)mStatusBarView.getLayoutParams(); 469dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato if (lp == null) { 470dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato // haven't been added yet 471dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato return; 472dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato } 473dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato if (lp.height != height) { 474dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato lp.height = height; 475dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato final WindowManager wm = WindowManagerImpl.getDefault(); 476dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato wm.updateViewLayout(mStatusBarView, lp); 477dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato } 478dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato } 479dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato 4809120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler private class H extends Handler { 4819120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler public void handleMessage(Message m) { 4829120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler switch (m.what) { 483b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler case MSG_OPEN_NOTIFICATION_PEEK: 484b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (DEBUG) Slog.d(TAG, "opening notification peek window; arg=" + m.arg1); 485b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (m.arg1 >= 0) { 486b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler final int N = mNotns.size(); 487a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler if (mNotificationPeekIndex >= 0 && mNotificationPeekIndex < N) { 488b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler NotificationData.Entry entry = mNotns.get(N-1-mNotificationPeekIndex); 489b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler entry.icon.setBackgroundColor(0); 490a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler mNotificationPeekIndex = -1; 491a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler mNotificationPeekKey = null; 492b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 493b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 494b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler final int peekIndex = m.arg1; 495b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (peekIndex < N) { 4960ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler //Slog.d(TAG, "loading peek: " + peekIndex); 497b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler NotificationData.Entry entry = mNotns.get(N-1-peekIndex); 498b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler NotificationData.Entry copy = new NotificationData.Entry( 49985babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller entry.key, 50085babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller entry.notification, 501b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler entry.icon); 502b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler inflateViews(copy, mNotificationPeekRow); 503b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 504b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler entry.icon.setBackgroundColor(0x20FFFFFF); 505b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 506b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler// mNotificationPeekRow.setLayoutTransition( 50785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller// peekIndex < mNotificationPeekIndex 508b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler// ? mNotificationPeekScrubLeft 509b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler// : mNotificationPeekScrubRight); 510b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 511b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekRow.removeAllViews(); 512b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekRow.addView(copy.row); 513b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 514b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekWindow.setVisibility(View.VISIBLE); 5157c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato mNotificationPanel.show(false, true); 516b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 517b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekIndex = peekIndex; 518a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler mNotificationPeekKey = entry.key; 519b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 520b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 521b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler break; 522b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler case MSG_CLOSE_NOTIFICATION_PEEK: 523b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (DEBUG) Slog.d(TAG, "closing notification peek window"); 524b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekWindow.setVisibility(View.GONE); 525b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekRow.removeAllViews(); 526b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler final int N = mNotns.size(); 527a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler if (mNotificationPeekIndex >= 0 && mNotificationPeekIndex < N) { 528b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler NotificationData.Entry entry = mNotns.get(N-1-mNotificationPeekIndex); 529b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler entry.icon.setBackgroundColor(0); 530b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 531a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler 532a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler mNotificationPeekIndex = -1; 533a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler mNotificationPeekKey = null; 534b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler break; 5359120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler case MSG_OPEN_NOTIFICATION_PANEL: 5369120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler if (DEBUG) Slog.d(TAG, "opening notifications panel"); 5377c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato if (!mNotificationPanel.isShowing()) { 538b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mNotificationPeekWindow.setVisibility(View.GONE); 5397c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato mNotificationPanel.show(true, true); 5400ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mNotificationArea.setVisibility(View.GONE); 54150ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato mTicker.halt(); 542091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato } 5439120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler break; 5449120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler case MSG_CLOSE_NOTIFICATION_PANEL: 5459120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler if (DEBUG) Slog.d(TAG, "closing notifications panel"); 5467c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato if (mNotificationPanel.isShowing()) { 5477c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato mNotificationPanel.show(false, true); 5480ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mNotificationArea.setVisibility(View.VISIBLE); 549091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato } 5509120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler break; 55144c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller case MSG_OPEN_RECENTS_PANEL: 55244c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller if (DEBUG) Slog.d(TAG, "opening recents panel"); 55385babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller if (mRecentsPanel != null) { 55485babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mRecentsPanel.setVisibility(View.VISIBLE); 55585babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mRecentsPanel.show(true, true); 55685babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller } 55744c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller break; 55844c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller case MSG_CLOSE_RECENTS_PANEL: 55944c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller if (DEBUG) Slog.d(TAG, "closing recents panel"); 56085babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller if (mRecentsPanel != null && mRecentsPanel.isShowing()) { 56185babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mRecentsPanel.show(false, true); 56285babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller } 5639120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler break; 56482beadfa067b1e286fa604f8d7960d769411c954satok case MSG_OPEN_INPUT_METHODS_PANEL: 56582beadfa067b1e286fa604f8d7960d769411c954satok if (DEBUG) Slog.d(TAG, "opening input methods panel"); 56682beadfa067b1e286fa604f8d7960d769411c954satok if (mInputMethodsPanel != null) mInputMethodsPanel.setVisibility(View.VISIBLE); 56782beadfa067b1e286fa604f8d7960d769411c954satok break; 56882beadfa067b1e286fa604f8d7960d769411c954satok case MSG_CLOSE_INPUT_METHODS_PANEL: 56982beadfa067b1e286fa604f8d7960d769411c954satok if (DEBUG) Slog.d(TAG, "closing input methods panel"); 57082beadfa067b1e286fa604f8d7960d769411c954satok if (mInputMethodsPanel != null) mInputMethodsPanel.setVisibility(View.GONE); 57182beadfa067b1e286fa604f8d7960d769411c954satok break; 5720ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler case MSG_SHOW_CHROME: 573e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler if (DEBUG) Slog.d(TAG, "hiding shadows (lights on)"); 5740ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mBarContents.setVisibility(View.VISIBLE); 5750ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mShadow.setVisibility(View.GONE); 576664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato notifyLightsChanged(true); 57706e6630a462b6a5c04c319d781d64896778d351fDaniel Sandler break; 5780ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler case MSG_HIDE_CHROME: 579e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler if (DEBUG) Slog.d(TAG, "showing shadows (lights out)"); 58006e6630a462b6a5c04c319d781d64896778d351fDaniel Sandler animateCollapse(); 5810ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mBarContents.setVisibility(View.GONE); 5820ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mShadow.setVisibility(View.VISIBLE); 583664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato notifyLightsChanged(false); 584e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler break; 5852ed08d2e70250517e5578dd650c96b14aacf9ba5Daniel Sandler case MSG_STOP_TICKER: 5862ed08d2e70250517e5578dd650c96b14aacf9ba5Daniel Sandler mTicker.halt(); 5872ed08d2e70250517e5578dd650c96b14aacf9ba5Daniel Sandler break; 5889120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler } 5899120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler } 5909120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler } 591271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler 592664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato private void notifyLightsChanged(boolean shown) { 593664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato try { 594664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato Slog.d(TAG, "lights " + (shown?"on":"out")); 595664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato mWindowManager.statusBarVisibilityChanged( 596664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato shown ? View.STATUS_BAR_VISIBLE : View.STATUS_BAR_HIDDEN); 597664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } catch (RemoteException ex) { 598664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 599664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 600664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato 601808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) { 6021e3ed8fc9537209920eea6adf5e576058f81d587Daniel Sandler if (DEBUG) Slog.d(TAG, "addIcon(" + slot + ") -> " + icon); 603808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato } 604808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 605808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato public void updateIcon(String slot, int index, int viewIndex, 606808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato StatusBarIcon old, StatusBarIcon icon) { 6071e3ed8fc9537209920eea6adf5e576058f81d587Daniel Sandler if (DEBUG) Slog.d(TAG, "updateIcon(" + slot + ") -> " + icon); 608808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato } 609808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 610808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato public void removeIcon(String slot, int index, int viewIndex) { 6111e3ed8fc9537209920eea6adf5e576058f81d587Daniel Sandler if (DEBUG) Slog.d(TAG, "removeIcon(" + slot + ")"); 612808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato } 613808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 614808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato public void addNotification(IBinder key, StatusBarNotification notification) { 6153eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (DEBUG) Slog.d(TAG, "addNotification(" + key + " -> " + notification + ")"); 6163eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler addNotificationViews(key, notification); 617fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler 61850ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato final boolean immersive = isImmersive(); 619cf2b199e98de71dcac042484800c07366363a734Joe Onorato if (false && immersive) { 620fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler // TODO: immersive mode popups for tablet 621fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler } else if (notification.notification.fullScreenIntent != null) { 622fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler // not immersive & a full-screen alert should be shown 623f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato Slog.w(TAG, "Notification has fullScreenIntent and activity is not immersive;" 624fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler + " sending fullScreenIntent"); 625fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler try { 626fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler notification.notification.fullScreenIntent.send(); 627fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler } catch (PendingIntent.CanceledException e) { 628fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler } 629fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler } else { 630eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato tick(key, notification, true); 631fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler } 6325dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato 6335dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato setAreThereNotifications(); 634808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato } 635808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 636808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato public void updateNotification(IBinder key, StatusBarNotification notification) { 6373eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (DEBUG) Slog.d(TAG, "updateNotification(" + key + " -> " + notification + ") // TODO"); 63844c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller 6390f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler final NotificationData.Entry oldEntry = mNotns.findByKey(key); 640379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler if (oldEntry == null) { 6413eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler Slog.w(TAG, "updateNotification for unknown key: " + key); 6423eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return; 6433eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 6443eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 6453eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler final StatusBarNotification oldNotification = oldEntry.notification; 6463eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler final RemoteViews oldContentView = oldNotification.notification.contentView; 6473eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 6483eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler final RemoteViews contentView = notification.notification.contentView; 6493eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 650373a9983742b3d2370c36183aca3cde4614e6185Daniel Sandler if (DEBUG) { 6513eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler Slog.d(TAG, "old notification: when=" + oldNotification.notification.when 6523eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler + " ongoing=" + oldNotification.isOngoing() 6533eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler + " expanded=" + oldEntry.expanded 6543eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler + " contentView=" + oldContentView); 6553eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler Slog.d(TAG, "new notification: when=" + notification.notification.when 6563eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler + " ongoing=" + oldNotification.isOngoing() 6573eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler + " contentView=" + contentView); 6583eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 6593eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 6603eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // Can we just reapply the RemoteViews in place? If when didn't change, the order 6613eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // didn't change. 66280a44401a22344f7eabce6976372ab144ef22893Joe Onorato boolean contentsUnchanged = oldEntry.expanded != null 66380a44401a22344f7eabce6976372ab144ef22893Joe Onorato && contentView != null && oldContentView != null 6643eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler && contentView.getPackage() != null 6653eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler && oldContentView.getPackage() != null 6663eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler && oldContentView.getPackage().equals(contentView.getPackage()) 667c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato && oldContentView.getLayoutId() == contentView.getLayoutId(); 668373a9983742b3d2370c36183aca3cde4614e6185Daniel Sandler ViewGroup rowParent = (ViewGroup) oldEntry.row.getParent(); 66980a44401a22344f7eabce6976372ab144ef22893Joe Onorato boolean orderUnchanged = notification.notification.when==oldNotification.notification.when 67080a44401a22344f7eabce6976372ab144ef22893Joe Onorato && notification.isOngoing() == oldNotification.isOngoing(); 671c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato boolean isLastAnyway = rowParent.indexOfChild(oldEntry.row) == rowParent.getChildCount()-1; 672c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato if (contentsUnchanged && (orderUnchanged || isLastAnyway)) { 6733eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (DEBUG) Slog.d(TAG, "reusing notification for key: " + key); 6743eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler oldEntry.notification = notification; 6753eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler try { 6763eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // Reapply the RemoteViews 677f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato contentView.reapply(mContext, oldEntry.content); 6783eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // update the contentIntent 6793eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler final PendingIntent contentIntent = notification.notification.contentIntent; 6803eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (contentIntent != null) { 6813eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler oldEntry.content.setOnClickListener(new NotificationClicker(contentIntent, 6823eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler notification.pkg, notification.tag, notification.id)); 683184498ce5a8d77e1d9c45693363829daaeef9611Joe Onorato } else { 684184498ce5a8d77e1d9c45693363829daaeef9611Joe Onorato oldEntry.content.setOnClickListener(null); 6853eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 6863eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // Update the icon. 6873eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler final StatusBarIcon ic = new StatusBarIcon(notification.pkg, 6883eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler notification.notification.icon, notification.notification.iconLevel, 6893eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler notification.notification.number); 6903eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (!oldEntry.icon.set(ic)) { 6913eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler handleNotificationError(key, notification, "Couldn't update icon: " + ic); 6923eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return; 6933eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 69480a44401a22344f7eabce6976372ab144ef22893Joe Onorato // Update the large icon 69580a44401a22344f7eabce6976372ab144ef22893Joe Onorato if (notification.notification.largeIcon != null) { 69680a44401a22344f7eabce6976372ab144ef22893Joe Onorato oldEntry.largeIcon.setImageBitmap(notification.notification.largeIcon); 69780a44401a22344f7eabce6976372ab144ef22893Joe Onorato } else { 69880a44401a22344f7eabce6976372ab144ef22893Joe Onorato oldEntry.largeIcon.getLayoutParams().width = 0; 69980a44401a22344f7eabce6976372ab144ef22893Joe Onorato oldEntry.largeIcon.setVisibility(View.INVISIBLE); 70080a44401a22344f7eabce6976372ab144ef22893Joe Onorato } 70185babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller 7027ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler if (key == mNotificationPeekKey) { 7037ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler // must update the peek window 7047ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler Message peekMsg = mHandler.obtainMessage(MSG_OPEN_NOTIFICATION_PEEK); 7057ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler peekMsg.arg1 = mNotificationPeekIndex; 7067ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK); 7077ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler mHandler.sendMessage(peekMsg); 7087ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler } 7093eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 7103eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler catch (RuntimeException e) { 7113eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // It failed to add cleanly. Log, and remove the view from the panel. 7123eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler Slog.w(TAG, "Couldn't reapply views for package " + contentView.getPackage(), e); 7133eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler removeNotificationViews(key); 7143eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler addNotificationViews(key, notification); 7153eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 7163eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } else { 7173eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (DEBUG) Slog.d(TAG, "not reusing notification for key: " + key); 7183eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler removeNotificationViews(key); 7193eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler addNotificationViews(key, notification); 7203eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 72150ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato // fullScreenIntent doesn't happen on updates. You need to clear & repost a new 72250ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato // notification. 72350ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato final boolean immersive = isImmersive(); 72450ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato if (false && immersive) { 72550ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato // TODO: immersive mode 72650ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato } else { 727eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato tick(key, notification, false); 72850ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato } 7295dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato 7305dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato setAreThereNotifications(); 731808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato } 732808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 733808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato public void removeNotification(IBinder key) { 7343eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (DEBUG) Slog.d(TAG, "removeNotification(" + key + ") // TODO"); 7353eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler removeNotificationViews(key); 73650ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato mTicker.remove(key); 7375dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato setAreThereNotifications(); 738808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato } 739808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 7403e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler public void showClock(boolean show) { 7413e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler View clock = mBarContents.findViewById(R.id.clock); 7423e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler View network_text = mBarContents.findViewById(R.id.network_text); 7433e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler if (clock != null) { 7443e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler clock.setVisibility(show ? View.VISIBLE : View.GONE); 7453e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler } 7463e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler if (network_text != null) { 7473e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler network_text.setVisibility((!show) ? View.VISIBLE : View.GONE); 7483e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler } 7493e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler } 7503e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler 751808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato public void disable(int state) { 752091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato int old = mDisabled; 753091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato int diff = state ^ old; 754dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler mDisabled = state; 755dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 756091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato // act accordingly 7573e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler if ((diff & StatusBarManager.DISABLE_CLOCK) != 0) { 7583e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler boolean show = (state & StatusBarManager.DISABLE_CLOCK) == 0; 759f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato Slog.i(TAG, "DISABLE_CLOCK: " + (show ? "no" : "yes")); 7603e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler showClock(show); 7613e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler } 7626f6cf3c5e577aa62cfd959fa5ef046531090ce31Daniel Sandler if ((diff & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) { 7636f6cf3c5e577aa62cfd959fa5ef046531090ce31Daniel Sandler boolean show = (state & StatusBarManager.DISABLE_SYSTEM_INFO) == 0; 764f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato Slog.i(TAG, "DISABLE_SYSTEM_INFO: " + (show ? "no" : "yes")); 7656f6cf3c5e577aa62cfd959fa5ef046531090ce31Daniel Sandler mNotificationTrigger.setVisibility(show ? View.VISIBLE : View.GONE); 7666f6cf3c5e577aa62cfd959fa5ef046531090ce31Daniel Sandler } 767dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) { 768dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler if ((state & StatusBarManager.DISABLE_EXPAND) != 0) { 769f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato Slog.i(TAG, "DISABLE_EXPAND: yes"); 770dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler animateCollapse(); 771dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 772dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 773dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { 774dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { 775f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato Slog.i(TAG, "DISABLE_NOTIFICATION_ICONS: yes"); 776b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler // synchronize with current shadow state 7770ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mNotificationIconArea.setVisibility(View.GONE); 778091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato mTicker.halt(); 779dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } else { 780f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato Slog.i(TAG, "DISABLE_NOTIFICATION_ICONS: no"); 781b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler // synchronize with current shadow state 7820ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mNotificationIconArea.setVisibility(View.VISIBLE); 783dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 784dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { 785091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato if ((state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { 786ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato mTicker.halt(); 787dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 788dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 789091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato if ((diff & StatusBarManager.DISABLE_NAVIGATION) != 0) { 790091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato if ((state & StatusBarManager.DISABLE_NAVIGATION) != 0) { 791f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato Slog.i(TAG, "DISABLE_NAVIGATION: yes"); 792fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mNavigationArea.setVisibility(View.GONE); 793b70c82dc45f62a1c257a80e7aa9e0ecfe063c1besatok mInputMethodSwitchButton.setScreenLocked(true); 794dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } else { 795f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato Slog.i(TAG, "DISABLE_NAVIGATION: no"); 796fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mNavigationArea.setVisibility(View.VISIBLE); 797b70c82dc45f62a1c257a80e7aa9e0ecfe063c1besatok mInputMethodSwitchButton.setScreenLocked(false); 798dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 799dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 8006478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato if ((diff & StatusBarManager.DISABLE_BACK) != 0) { 8016478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato if ((state & StatusBarManager.DISABLE_BACK) != 0) { 8026478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato Slog.i(TAG, "DISABLE_BACK: yes"); 8036478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato mBackButton.setVisibility(View.INVISIBLE); 8046478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato mInputMethodSwitchButton.setScreenLocked(true); 8056478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato } else { 8066478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato Slog.i(TAG, "DISABLE_BACK: no"); 8076478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato mBackButton.setVisibility(View.VISIBLE); 8086478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato mInputMethodSwitchButton.setScreenLocked(false); 8096478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato } 8106478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato } 8116478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato 812dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 813dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 814ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato private boolean hasTicker(Notification n) { 81546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato return n.tickerView != null || !TextUtils.isEmpty(n.tickerText); 816ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato } 817ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato 818eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato private void tick(IBinder key, StatusBarNotification n, boolean firstTime) { 81955d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato // Don't show the ticker when the windowshade is open. 8207c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato if (mNotificationPanel.isShowing()) { 82155d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato return; 82255d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato } 823eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato // If they asked for FLAG_ONLY_ALERT_ONCE, then only show this notification 824eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato // if it's a new notification. 825eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato if (!firstTime && (n.notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) { 826eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato return; 827eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato } 828dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler // Show the ticker if one is requested. Also don't do this 829dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler // until status bar window is attached to the window manager, 830dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler // because... well, what's the point otherwise? And trying to 831dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler // run a ticker without being attached will crash! 832ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato if (hasTicker(n.notification) && mStatusBarView.getWindowToken() != null) { 833dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS 834dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) { 83550ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato mTicker.add(key, n); 836ec51a82bd6e7a33fe6ed84ba252b82625629eaacJoe Onorato mNotificationAndImeArea.setVisibility(View.GONE); 837dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 838dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 839dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 840dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 841b8027d87d87fbf24a6091ef183e519157876df41Daniel Sandler // called by TabletTicker when it's done with all queued ticks 842b8027d87d87fbf24a6091ef183e519157876df41Daniel Sandler public void doneTicking() { 843ec51a82bd6e7a33fe6ed84ba252b82625629eaacJoe Onorato mNotificationAndImeArea.setVisibility(View.VISIBLE); 844b8027d87d87fbf24a6091ef183e519157876df41Daniel Sandler } 845b8027d87d87fbf24a6091ef183e519157876df41Daniel Sandler 846808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato public void animateExpand() { 847b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PANEL); 848b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mHandler.sendEmptyMessage(MSG_OPEN_NOTIFICATION_PANEL); 849808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato } 850808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato 851808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato public void animateCollapse() { 852b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PANEL); 853b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PANEL); 85444c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL); 85544c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL); 85682beadfa067b1e286fa604f8d7960d769411c954satok mHandler.removeMessages(MSG_CLOSE_INPUT_METHODS_PANEL); 85782beadfa067b1e286fa604f8d7960d769411c954satok mHandler.sendEmptyMessage(MSG_CLOSE_INPUT_METHODS_PANEL); 8589120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler } 8599120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler 860fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato // called by StatusBar 86106e6630a462b6a5c04c319d781d64896778d351fDaniel Sandler @Override 8629305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato public void setLightsOn(boolean on) { 86359485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler // Policy note: if the frontmost activity needs the menu key, we assume it is a legacy app 86459485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler // that can't handle lights-out mode. 8650ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler if (mMenuButton.getVisibility() == View.VISIBLE) { 86659485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler on = true; 86759485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler } 8680ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mHandler.removeMessages(MSG_HIDE_CHROME); 8690ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mHandler.removeMessages(MSG_SHOW_CHROME); 8700ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mHandler.sendEmptyMessage(on ? MSG_SHOW_CHROME : MSG_HIDE_CHROME); 8719305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 8729305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato 873e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler public void setMenuKeyVisible(boolean visible) { 874e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler if (DEBUG) { 875e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler Slog.d(TAG, (visible?"showing":"hiding") + " the MENU button"); 876e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 877b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler mMenuButton.setVisibility(visible ? View.VISIBLE : View.GONE); 87859485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler 87959485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler // See above re: lights-out policy for legacy apps. 88059485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler if (visible) setLightsOn(true); 881e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 882e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler 883857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { 884857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mInputMethodSwitchButton.setImeWindowStatus(token, 885857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato (vis & InputMethodService.IME_ACTIVE) != 0); 8865113382e95d5f5f322bc6618bef7d1c7f96e295fsatok updateNotificationIcons(); 887913f42d26a32621ad7dd52c52b8d150eedf4f8fesatok mInputMethodsPanel.setImeToken(token); 888857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato int res; 889857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato switch (backDisposition) { 890857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato case InputMethodService.BACK_DISPOSITION_WILL_NOT_DISMISS: 891857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato res = R.drawable.ic_sysbar_back; 892857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato break; 893857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato case InputMethodService.BACK_DISPOSITION_WILL_DISMISS: 894857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato res = R.drawable.ic_sysbar_back_ime; 895857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato break; 896857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato case InputMethodService.BACK_DISPOSITION_DEFAULT: 897857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato default: 898857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato if ((vis & InputMethodService.IME_VISIBLE) != 0) { 899857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato res = R.drawable.ic_sysbar_back_ime; 900857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato } else { 901857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato res = R.drawable.ic_sysbar_back; 902857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato } 903857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato break; 904857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato } 905857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mBackButton.setImageResource(res); 90610163c689a713a35f69aad420c35372946b8b32aDaniel Sandler if (FAKE_SPACE_BAR) { 907857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mFakeSpaceBar.setVisibility(((vis & InputMethodService.IME_VISIBLE) != 0) 908857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato ? View.VISIBLE : View.GONE); 90910163c689a713a35f69aad420c35372946b8b32aDaniel Sandler } 91006487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 91106487a58be22b100daf3f950b9a1d25c3ea42aa2satok 91250ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato private boolean isImmersive() { 91350ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato try { 91450ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato return ActivityManagerNative.getDefault().isTopActivityImmersive(); 91550ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato //Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive")); 91650ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato } catch (RemoteException ex) { 91750ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato // the end is nigh 91850ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato return false; 91950ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato } 92050ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato } 92185babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller 9225dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato private void setAreThereNotifications() { 9235dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato final boolean hasClearable = mNotns.hasClearableItems(); 9245dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato } 9255dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato 926f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato /** 927f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato * Cancel this notification and tell the status bar service about the failure. Hold no locks. 928f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato */ 929f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato void handleNotificationError(IBinder key, StatusBarNotification n, String message) { 930f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato removeNotification(key); 931f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato try { 932f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mBarService.onNotificationError(n.pkg, n.tag, n.id, n.uid, n.initialPid, message); 933f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } catch (RemoteException ex) { 934f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato // The end is nigh. 935f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 936f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 937f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 93810163c689a713a35f69aad420c35372946b8b32aDaniel Sandler private void sendKey(KeyEvent key) { 93910163c689a713a35f69aad420c35372946b8b32aDaniel Sandler try { 94010163c689a713a35f69aad420c35372946b8b32aDaniel Sandler if (DEBUG) Slog.d(TAG, "injecting key event: " + key); 94110163c689a713a35f69aad420c35372946b8b32aDaniel Sandler mWindowManager.injectInputEventNoWait(key); 94210163c689a713a35f69aad420c35372946b8b32aDaniel Sandler } catch (RemoteException ex) { 94310163c689a713a35f69aad420c35372946b8b32aDaniel Sandler } 94410163c689a713a35f69aad420c35372946b8b32aDaniel Sandler } 94510163c689a713a35f69aad420c35372946b8b32aDaniel Sandler 946f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato private View.OnClickListener mOnClickListener = new View.OnClickListener() { 947f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public void onClick(View v) { 948fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato if (v == mNotificationTrigger) { 949f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato onClickNotificationTrigger(); 950f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } else if (v == mRecentButton) { 951f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato onClickRecentButton(); 95282beadfa067b1e286fa604f8d7960d769411c954satok } else if (v == mInputMethodSwitchButton) { 95382beadfa067b1e286fa604f8d7960d769411c954satok onClickInputMethodSwitchButton(); 954f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 955f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 956f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato }; 957f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato 958f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public void onClickNotificationTrigger() { 959b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (DEBUG) Slog.d(TAG, "clicked notification icons; disabled=" + mDisabled); 960091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { 961271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler if (!mNotificationsOn) { 962271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler mNotificationsOn = true; 963cf3c7cf3c986526398e2bc79a39227d751202822Daniel Sandler mIconLayout.setVisibility(View.VISIBLE); // TODO: animation 964271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler } else { 9657c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato int msg = !mNotificationPanel.isShowing() 966271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler ? MSG_OPEN_NOTIFICATION_PANEL 967271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler : MSG_CLOSE_NOTIFICATION_PANEL; 968271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler mHandler.removeMessages(msg); 969271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler mHandler.sendEmptyMessage(msg); 970271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler } 971091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato } 9729120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler } 9739120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler 974f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public void onClickRecentButton() { 975b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (DEBUG) Slog.d(TAG, "clicked recent apps; disabled=" + mDisabled); 97644c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller if (mRecentsPanel == null) { 97744c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller Intent intent = new Intent(); 97844c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller intent.setClass(mContext, RecentApplicationsActivity.class); 97944c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 98044c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 98144c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller mContext.startActivity(intent); 98244c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller } else { 98344c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { 98444c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller int msg = (mRecentsPanel.getVisibility() == View.GONE) 98544c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller ? MSG_OPEN_RECENTS_PANEL 98644c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller : MSG_CLOSE_RECENTS_PANEL; 98744c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller mHandler.removeMessages(msg); 98844c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller mHandler.sendEmptyMessage(msg); 98944c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller } 99044c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller } 9913eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 9923eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 99382beadfa067b1e286fa604f8d7960d769411c954satok public void onClickInputMethodSwitchButton() { 99482beadfa067b1e286fa604f8d7960d769411c954satok if (DEBUG) Slog.d(TAG, "clicked input methods panel; disabled=" + mDisabled); 99582beadfa067b1e286fa604f8d7960d769411c954satok int msg = (mInputMethodsPanel.getVisibility() == View.GONE) ? 99682beadfa067b1e286fa604f8d7960d769411c954satok MSG_OPEN_INPUT_METHODS_PANEL : MSG_CLOSE_INPUT_METHODS_PANEL; 99782beadfa067b1e286fa604f8d7960d769411c954satok mHandler.removeMessages(msg); 99882beadfa067b1e286fa604f8d7960d769411c954satok mHandler.sendEmptyMessage(msg); 99982beadfa067b1e286fa604f8d7960d769411c954satok } 100082beadfa067b1e286fa604f8d7960d769411c954satok 1001c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler public NotificationClicker makeClicker(PendingIntent intent, String pkg, String tag, int id) { 1002c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler return new NotificationClicker(intent, pkg, tag, id); 1003c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler } 1004c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler 10053eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler private class NotificationClicker implements View.OnClickListener { 10063eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler private PendingIntent mIntent; 10073eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler private String mPkg; 10083eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler private String mTag; 10093eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler private int mId; 10103eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 10113eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler NotificationClicker(PendingIntent intent, String pkg, String tag, int id) { 10123eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler mIntent = intent; 10133eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler mPkg = pkg; 10143eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler mTag = tag; 10153eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler mId = id; 10163eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 10173eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 10183eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler public void onClick(View v) { 10193eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler try { 10203eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // The intent we are sending is for the application, which 10213eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // won't have permission to immediately start an activity after 10223eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // the user switches to home. We know it is safe to do at this 10233eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // point, so make sure new activity switches are now allowed. 10243eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler ActivityManagerNative.getDefault().resumeAppSwitches(); 10253eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } catch (RemoteException e) { 10263eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 10273eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 10283eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (mIntent != null) { 10293eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler int[] pos = new int[2]; 10303eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler v.getLocationOnScreen(pos); 10313eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler Intent overlay = new Intent(); 10323eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler overlay.setSourceBounds( 10333eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight())); 10343eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler try { 1035f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato mIntent.send(mContext, 0, overlay); 10363eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } catch (PendingIntent.CanceledException e) { 10373eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // the stack trace isn't very helpful here. Just log the exception message. 10383eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler Slog.w(TAG, "Sending contentIntent failed: " + e); 10393eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 10403eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 10413eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 10423eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler try { 10433eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler mBarService.onNotificationClick(mPkg, mTag, mId); 10443eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } catch (RemoteException ex) { 10453eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // system process is dead if we're here. 10463eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 10473eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 10483eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // close the shade if it was open 10493eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler animateCollapse(); 10503eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 10513eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // If this click was on the intruder alert, hide that instead 10523eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler// mHandler.sendEmptyMessage(MSG_HIDE_INTRUDER); 10533eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 10543eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 10553eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 10563eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler StatusBarNotification removeNotificationViews(IBinder key) { 10570f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler NotificationData.Entry entry = mNotns.remove(key); 10583eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (entry == null) { 10593eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler Slog.w(TAG, "removeNotification for unknown key: " + key); 10603eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return null; 10613eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 10623eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // Remove the expanded view. 10633eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler ViewGroup rowParent = (ViewGroup)entry.row.getParent(); 10643eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (rowParent != null) rowParent.removeView(entry.row); 1065a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler 1066a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler if (key == mNotificationPeekKey) { 1067a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler // must close the peek as well, since it's gone 1068a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK); 1069a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler } 10703eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // Remove the icon. 10710f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler// ViewGroup iconParent = (ViewGroup)entry.icon.getParent(); 10720f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler// if (iconParent != null) iconParent.removeView(entry.icon); 10730ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler updateNotificationIcons(); 10743eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 10753eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return entry.notification; 10763eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 10773eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 1078b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler private class NotificationIconTouchListener implements View.OnTouchListener { 1079b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler VelocityTracker mVT; 1080b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1081b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler public NotificationIconTouchListener() { 1082b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1083b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1084b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler public boolean onTouch(View v, MotionEvent event) { 1085b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler boolean peeking = mNotificationPeekWindow.getVisibility() != View.GONE; 10867c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato boolean panelShowing = mNotificationPanel.isShowing(); 1087b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (panelShowing) return false; 1088b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1089b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler switch (event.getAction()) { 1090b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler case MotionEvent.ACTION_DOWN: 1091b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mVT = VelocityTracker.obtain(); 1092b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1093b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler // fall through 1094b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler case MotionEvent.ACTION_OUTSIDE: 1095b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler case MotionEvent.ACTION_MOVE: 1096b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler // peek and switch icons if necessary 1097b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler int numIcons = mIconLayout.getChildCount(); 10985e759460dcb91ba96758c2ac6d354ff8563b78a4Joe Onorato int peekIndex = (int)((float)event.getX() * numIcons / mIconLayout.getWidth()); 1099b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (peekIndex > numIcons - 1) peekIndex = numIcons - 1; 1100b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler else if (peekIndex < 0) peekIndex = 0; 1101b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1102b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (!peeking || mNotificationPeekIndex != peekIndex) { 1103b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (DEBUG) Slog.d(TAG, "will peek at notification #" + peekIndex); 1104b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler Message peekMsg = mHandler.obtainMessage(MSG_OPEN_NOTIFICATION_PEEK); 1105b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler peekMsg.arg1 = peekIndex; 1106b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1107b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK); 1108b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1109b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler // no delay if we're scrubbing left-right 11105e759460dcb91ba96758c2ac6d354ff8563b78a4Joe Onorato mHandler.sendMessage(peekMsg); 1111b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1112b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1113b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler // check for fling 1114b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (mVT != null) { 1115b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mVT.addMovement(event); 1116b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mVT.computeCurrentVelocity(1000); 1117b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler // require a little more oomph once we're already in peekaboo mode 1118b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (!panelShowing && ( 1119b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler (peeking && mVT.getYVelocity() < -mNotificationFlingVelocity*3) 1120b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler || (mVT.getYVelocity() < -mNotificationFlingVelocity))) { 1121b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK); 1122b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PANEL); 1123b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK); 1124b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mHandler.sendEmptyMessage(MSG_OPEN_NOTIFICATION_PANEL); 1125b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1126b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1127b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler return true; 1128b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler case MotionEvent.ACTION_UP: 1129b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler case MotionEvent.ACTION_CANCEL: 1130b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK); 1131b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (peeking) { 11325e759460dcb91ba96758c2ac6d354ff8563b78a4Joe Onorato mHandler.sendEmptyMessageDelayed(MSG_CLOSE_NOTIFICATION_PEEK, 5000); 1133b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1134b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mVT.recycle(); 1135b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mVT = null; 1136b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler return true; 1137b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1138b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler return false; 1139b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1140b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1141b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 11423eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler StatusBarIconView addNotificationViews(IBinder key, StatusBarNotification notification) { 1143dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler if (DEBUG) { 1144dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler Slog.d(TAG, "addNotificationViews(key=" + key + ", notification=" + notification); 1145dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 11463eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // Construct the icon. 1147f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato final StatusBarIconView iconView = new StatusBarIconView(mContext, 11483eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler notification.pkg + "/0x" + Integer.toHexString(notification.id)); 11493eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 11503eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 11513eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler final StatusBarIcon ic = new StatusBarIcon(notification.pkg, 11523eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler notification.notification.icon, 11533eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler notification.notification.iconLevel, 11543eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler notification.notification.number); 11553eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (!iconView.set(ic)) { 11563eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler handleNotificationError(key, notification, "Couldn't attach StatusBarIcon: " + ic); 11573eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return null; 11583eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 11593eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // Construct the expanded view. 11603eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler NotificationData.Entry entry = new NotificationData.Entry(key, notification, iconView); 1161dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler if (!inflateViews(entry, mPile)) { 11623eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler handleNotificationError(key, notification, "Couldn't expand RemoteViews for: " 11633eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler + notification); 11643eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return null; 11653eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 1166b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 11673eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // Add the icon. 1168dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler mNotns.add(entry); 11690ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler updateNotificationIcons(); 11700f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 11713eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return iconView; 11723eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 11733eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 11740ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler private void reloadAllNotificationIcons() { 11750ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler if (mIconLayout == null) return; 11760ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mIconLayout.removeAllViews(); 11770ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler updateNotificationIcons(); 11780ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler } 11790ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 11800ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler private void updateNotificationIcons() { 11810f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler // XXX: need to implement a new limited linear layout class 11820f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler // to avoid removing & readding everything 1183dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 11840ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler if (mIconLayout == null) return; 11850ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler 1186b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler final LinearLayout.LayoutParams params 1187dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato = new LinearLayout.LayoutParams(mIconSize + 2*mIconHPadding, mNaturalBarHeight); 1188b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 11890f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler int N = mNotns.size(); 1190dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 1191dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler if (DEBUG) { 1192b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler Slog.d(TAG, "refreshing icons: " + N + " notifications, mIconLayout=" + mIconLayout); 1193dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 1194dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 1195b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ArrayList<View> toShow = new ArrayList<View>(); 1196b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 119782beadfa067b1e286fa604f8d7960d769411c954satok // When IME button is visible, the number of notification icons should be decremented 119882beadfa067b1e286fa604f8d7960d769411c954satok // to fit the upper limit. 119982beadfa067b1e286fa604f8d7960d769411c954satok final int maxNotificationIconsCount = 120082beadfa067b1e286fa604f8d7960d769411c954satok (mInputMethodSwitchButton.getVisibility() != View.GONE) ? 120182beadfa067b1e286fa604f8d7960d769411c954satok MAX_NOTIFICATION_ICONS_IME_BUTTON_VISIBLE : MAX_NOTIFICATION_ICONS; 120282beadfa067b1e286fa604f8d7960d769411c954satok for (int i=0; i< maxNotificationIconsCount; i++) { 12030f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler if (i>=N) break; 1204b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler toShow.add(mNotns.get(N-i-1).icon); 12050f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler } 1206dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler 1207b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ArrayList<View> toRemove = new ArrayList<View>(); 1208b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler for (int i=0; i<mIconLayout.getChildCount(); i++) { 1209b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler View child = mIconLayout.getChildAt(i); 1210b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (!toShow.contains(child)) { 1211b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler toRemove.add(child); 1212b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1213b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1214b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1215b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler for (View remove : toRemove) { 1216b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mIconLayout.removeView(remove); 1217dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler } 1218271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler 1219b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler for (int i=0; i<toShow.size(); i++) { 1220b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler View v = toShow.get(i); 12210ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler v.setPadding(mIconHPadding, 0, mIconHPadding, 0); 1222b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (v.getParent() == null) { 12230ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler mIconLayout.addView(v, i, params); 1224b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1225b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1226b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1227b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler loadNotificationPanel(); 12280f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler } 12290f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 1230b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler private void loadNotificationPanel() { 1231b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler int N = mNotns.size(); 1232b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1233b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ArrayList<View> toShow = new ArrayList<View>(); 1234b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1235b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler for (int i=0; i<N; i++) { 1236b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler View row = mNotns.get(N-i-1).row; 1237b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler toShow.add(row); 1238b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1239b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1240b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler ArrayList<View> toRemove = new ArrayList<View>(); 1241b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler for (int i=0; i<mPile.getChildCount(); i++) { 1242b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler View child = mPile.getChildAt(i); 1243b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (!toShow.contains(child)) { 1244b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler toRemove.add(child); 1245b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1246b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1247b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1248b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler for (View remove : toRemove) { 1249b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mPile.removeView(remove); 1250b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1251b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 1252b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler for (int i=0; i<toShow.size(); i++) { 1253b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler View v = toShow.get(i); 1254b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler if (v.getParent() == null) { 1255b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler mPile.addView(toShow.get(i)); 1256b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1257b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 125840c1545d7231c856a1144a317e044ffa921448d8Daniel Sandler 125940c1545d7231c856a1144a317e044ffa921448d8Daniel Sandler mNotificationPanel.setNotificationCount(N); 1260b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler } 1261b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler 12624daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato void workAroundBadLayerDrawableOpacity(View v) { 12634daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato LayerDrawable d = (LayerDrawable)v.getBackground(); 1264f844dc4fa8ae53d485f10ebc7f91899159d7551eDaniel Sandler if (d == null) return; 12654daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato v.setBackgroundDrawable(null); 12664daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato d.setOpacity(PixelFormat.TRANSLUCENT); 12674daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato v.setBackgroundDrawable(d); 12684daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato } 12694daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato 12703eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler private boolean inflateViews(NotificationData.Entry entry, ViewGroup parent) { 12713eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler StatusBarNotification sbn = entry.notification; 12723eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler RemoteViews remoteViews = sbn.notification.contentView; 12733eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (remoteViews == null) { 12743eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return false; 12753eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 12763eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 12773eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // create the row view 1278f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato LayoutInflater inflater = (LayoutInflater)mContext.getSystemService( 1279f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato Context.LAYOUT_INFLATER_SERVICE); 1280755cc74e4cebdf67d21a2477512a4ac9b01e8323Joe Onorato View row = inflater.inflate(R.layout.status_bar_notification_row, parent, false); 12814daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato workAroundBadLayerDrawableOpacity(row); 12820f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler View vetoButton = row.findViewById(R.id.veto); 1283a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato if (entry.notification.isClearable()) { 1284a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato final String _pkg = sbn.pkg; 1285a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato final String _tag = sbn.tag; 1286a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato final int _id = sbn.id; 128744c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller vetoButton.setOnClickListener(new View.OnClickListener() { 1288a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato public void onClick(View v) { 1289a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato try { 1290a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato mBarService.onNotificationClear(_pkg, _tag, _id); 1291a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato } catch (RemoteException ex) { 1292a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato // system process is dead if we're here. 1293a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato } 12940f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler } 1295a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato }); 1296a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato } else { 1297100748e32898f0ce7398faa3b0218718fb9142e4Joe Onorato if ((sbn.notification.flags & Notification.FLAG_ONGOING_EVENT) == 0) { 1298100748e32898f0ce7398faa3b0218718fb9142e4Joe Onorato vetoButton.setVisibility(View.INVISIBLE); 1299100748e32898f0ce7398faa3b0218718fb9142e4Joe Onorato } else { 1300100748e32898f0ce7398faa3b0218718fb9142e4Joe Onorato vetoButton.setVisibility(View.GONE); 1301100748e32898f0ce7398faa3b0218718fb9142e4Joe Onorato } 1302a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato } 13033eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 1304561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato // the large icon 1305561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato ImageView largeIcon = (ImageView)row.findViewById(R.id.large_icon); 1306561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato if (sbn.notification.largeIcon != null) { 1307561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato largeIcon.setImageBitmap(sbn.notification.largeIcon); 1308561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato } else { 1309561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato largeIcon.getLayoutParams().width = 0; 1310561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato largeIcon.setVisibility(View.INVISIBLE); 1311561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato } 1312561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato 13133eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // bind the click event to the content area 13143eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler ViewGroup content = (ViewGroup)row.findViewById(R.id.content); 13153eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler // XXX: update to allow controls within notification views 13163eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler content.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 13173eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler// content.setOnFocusChangeListener(mFocusChangeListener); 13183eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler PendingIntent contentIntent = sbn.notification.contentIntent; 13193eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (contentIntent != null) { 13203eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler content.setOnClickListener(new NotificationClicker(contentIntent, 13213eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler sbn.pkg, sbn.tag, sbn.id)); 1322184498ce5a8d77e1d9c45693363829daaeef9611Joe Onorato } else { 1323184498ce5a8d77e1d9c45693363829daaeef9611Joe Onorato content.setOnClickListener(null); 13243eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 13253eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 13263eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler View expanded = null; 13273eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler Exception exception = null; 13283eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler try { 1329f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato expanded = remoteViews.apply(mContext, content); 13303eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 13313eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler catch (RuntimeException e) { 13323eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler exception = e; 13333eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 13343eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler if (expanded == null) { 133546439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato final String ident = sbn.pkg + "/0x" + Integer.toHexString(sbn.id); 13363eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler Slog.e(TAG, "couldn't inflate view for notification " + ident, exception); 13373eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return false; 13383eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } else { 13393eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler content.addView(expanded); 13403eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler row.setDrawingCacheEnabled(true); 13413eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 13423eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 13433eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler entry.row = row; 13443eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler entry.content = content; 13453eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler entry.expanded = expanded; 134680a44401a22344f7eabce6976372ab144ef22893Joe Onorato entry.largeIcon = largeIcon; 13473eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 13483eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return true; 13493eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 1350ce70d91844d2e4fb987617d2924ae5b73096e5c3Daniel Sandler 13510ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler/* 1352b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler public class ShadowController { 1353b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler boolean mShowShadows; 1354b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler Map<View, View> mShadowsForElements = new IdentityHashMap<View, View>(7); 1355b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler Map<View, View> mElementsForShadows = new IdentityHashMap<View, View>(7); 1356b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler LayoutTransition mElementTransition, mShadowTransition; 1357b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler 1358b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler View mTouchTarget; 1359f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 1360b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler ShadowController(boolean showShadows) { 1361b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler mShowShadows = showShadows; 1362b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler mTouchTarget = null; 1363b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler 1364b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mElementTransition = new LayoutTransition(); 1365b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler// AnimatorSet s = new AnimatorSet(); 1366b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler// s.play(ObjectAnimator.ofInt(null, "top", 48, 0)) 1367b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler// .with(ObjectAnimator.ofFloat(null, "scaleY", 0.5f, 1f)) 1368b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler// .with(ObjectAnimator.ofFloat(null, "alpha", 0.5f, 1f)) 1369b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler// ; 1370b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mElementTransition.setAnimator(LayoutTransition.APPEARING, //s); 1371b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler ObjectAnimator.ofInt(null, "top", 48, 0)); 1372b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mElementTransition.setDuration(LayoutTransition.APPEARING, 100); 1373b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mElementTransition.setStartDelay(LayoutTransition.APPEARING, 0); 1374b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler 1375b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler// s = new AnimatorSet(); 1376b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler// s.play(ObjectAnimator.ofInt(null, "top", 0, 48)) 1377b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler// .with(ObjectAnimator.ofFloat(null, "scaleY", 1f, 0.5f)) 1378b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler// .with(ObjectAnimator.ofFloat(null, "alpha", 1f, 0.5f)) 1379b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler// ; 1380b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mElementTransition.setAnimator(LayoutTransition.DISAPPEARING, //s); 1381b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler ObjectAnimator.ofInt(null, "top", 0, 48)); 1382b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mElementTransition.setDuration(LayoutTransition.DISAPPEARING, 400); 1383b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler 1384b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mShadowTransition = new LayoutTransition(); 138585babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mShadowTransition.setAnimator(LayoutTransition.APPEARING, 1386b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler ObjectAnimator.ofFloat(null, "alpha", 0f, 1f)); 1387b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mShadowTransition.setDuration(LayoutTransition.APPEARING, 200); 1388b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mShadowTransition.setStartDelay(LayoutTransition.APPEARING, 100); 138985babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mShadowTransition.setAnimator(LayoutTransition.DISAPPEARING, 1390b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler ObjectAnimator.ofFloat(null, "alpha", 1f, 0f)); 1391b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mShadowTransition.setDuration(LayoutTransition.DISAPPEARING, 100); 1392b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler 1393b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler ViewGroup bar = (ViewGroup) TabletStatusBar.this.mBarContents; 1394b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler bar.setLayoutTransition(mElementTransition); 1395b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler ViewGroup nav = (ViewGroup) TabletStatusBar.this.mNavigationArea; 1396b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler nav.setLayoutTransition(mElementTransition); 1397b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler ViewGroup shadowGroup = (ViewGroup) bar.findViewById(R.id.shadows); 1398b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler shadowGroup.setLayoutTransition(mShadowTransition); 1399b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler } 1400b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler 1401b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler public void add(View element, View shadow) { 1402b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler shadow.setOnTouchListener(makeTouchListener()); 1403b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mShadowsForElements.put(element, shadow); 1404b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mElementsForShadows.put(shadow, element); 1405f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 1406f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 1407b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler public boolean getShadowState() { 1408b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler return mShowShadows; 1409f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 1410f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 1411b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler public View.OnTouchListener makeTouchListener() { 1412b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler return new View.OnTouchListener() { 1413b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler public boolean onTouch(View v, MotionEvent ev) { 1414b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler final int action = ev.getAction(); 1415b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler 1416b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (DEBUG) Slog.d(TAG, "ShadowController: v=" + v + ", ev=" + ev); 1417b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler 1418b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler // currently redirecting events? 1419b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (mTouchTarget == null) { 1420b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler mTouchTarget = mElementsForShadows.get(v); 1421b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 1422b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler 1423b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (mTouchTarget != null && mTouchTarget.getVisibility() != View.GONE) { 1424b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler boolean last = false; 1425b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler switch (action) { 1426b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler case MotionEvent.ACTION_CANCEL: 1427b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler case MotionEvent.ACTION_UP: 1428e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler mHandler.removeMessages(MSG_RESTORE_SHADOWS); 1429b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (mShowShadows) { 143085babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller mHandler.sendEmptyMessageDelayed(MSG_RESTORE_SHADOWS, 1431b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler v == mNotificationShadow ? 5000 : 500); 1432b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 1433b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler last = true; 1434b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler break; 1435b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler case MotionEvent.ACTION_DOWN: 1436e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler mHandler.removeMessages(MSG_RESTORE_SHADOWS); 1437b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler setElementShadow(mTouchTarget, false); 1438b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler break; 1439b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 1440b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler mTouchTarget.dispatchTouchEvent(ev); 1441b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (last) mTouchTarget = null; 1442b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler return true; 1443b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 1444b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler 1445b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler return false; 1446b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 1447b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler }; 1448b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 1449b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler 1450e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler public void refresh() { 1451b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler for (View element : mShadowsForElements.keySet()) { 1452b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler setElementShadow(element, mShowShadows); 1453b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler } 1454e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler } 1455e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler 1456b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler public void showAllShadows() { 1457b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler mShowShadows = true; 1458e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler refresh(); 1459ce70d91844d2e4fb987617d2924ae5b73096e5c3Daniel Sandler } 1460ce70d91844d2e4fb987617d2924ae5b73096e5c3Daniel Sandler 1461b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler public void hideAllShadows() { 1462b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler mShowShadows = false; 1463e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler refresh(); 1464b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 1465b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler 1466b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler // Use View.INVISIBLE for things hidden due to shadowing, and View.GONE for things that are 1467b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler // disabled (and should not be shadowed or re-shown) 1468b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler public void setElementShadow(View button, boolean shade) { 1469b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler View shadow = mShadowsForElements.get(button); 1470b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (shadow != null) { 1471b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (button.getVisibility() != View.GONE) { 1472b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler shadow.setVisibility(shade ? View.VISIBLE : View.INVISIBLE); 1473b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler button.setVisibility(shade ? View.INVISIBLE : View.VISIBLE); 1474b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 1475b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 1476b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 1477b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler 1478b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler // Hide both element and shadow, using default layout animations. 1479b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler public void hideElement(View button) { 1480b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler Slog.d(TAG, "hiding: " + button); 1481b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler View shadow = mShadowsForElements.get(button); 1482b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler if (shadow != null) { 1483b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler shadow.setVisibility(View.GONE); 1484b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler } 1485b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler button.setVisibility(View.GONE); 1486b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler } 1487b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler 1488b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler // Honoring the current shadow state. 1489b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler public void showElement(View button) { 1490b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler Slog.d(TAG, "showing: " + button); 1491b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler View shadow = mShadowsForElements.get(button); 1492b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler if (shadow != null) { 1493b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler shadow.setVisibility(mShowShadows ? View.VISIBLE : View.INVISIBLE); 1494b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler } 1495b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler button.setVisibility(mShowShadows ? View.INVISIBLE : View.VISIBLE); 1496b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler } 1497ce70d91844d2e4fb987617d2924ae5b73096e5c3Daniel Sandler } 14980ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler */ 1499b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 1500b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato public class TouchOutsideListener implements View.OnTouchListener { 1501b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato private int mMsg; 1502ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato private StatusBarPanel mPanel; 1503b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 1504ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato public TouchOutsideListener(int msg, StatusBarPanel panel) { 1505b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mMsg = msg; 1506ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato mPanel = panel; 1507b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 1508b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 1509b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato public boolean onTouch(View v, MotionEvent ev) { 1510ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato final int action = ev.getAction(); 1511ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato if (action == MotionEvent.ACTION_OUTSIDE 1512ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato || (action == MotionEvent.ACTION_DOWN 1513ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato && !mPanel.isInContentArea((int)ev.getX(), (int)ev.getY()))) { 1514b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mHandler.removeMessages(mMsg); 1515b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mHandler.sendEmptyMessage(mMsg); 1516b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato return true; 1517b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 1518b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato return false; 1519b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 1520b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 1521091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato 1522f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 1523f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato pw.print("mDisabled=0x"); 1524f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato pw.println(Integer.toHexString(mDisabled)); 1525933464dd02e9aeaff7944a2c8e3e44942971e1e8Joe Onorato pw.println("mNetworkController:"); 1526933464dd02e9aeaff7944a2c8e3e44942971e1e8Joe Onorato mNetworkController.dump(fd, pw, args); 1527f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato } 1528808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato} 1529d39e388e6d7f19d6e8d620e449af4124efab1d0dDaniel Sandler 1530d39e388e6d7f19d6e8d620e449af4124efab1d0dDaniel Sandler 1531