TabletStatusBar.java revision bc68a59c024bdb745dac8e2ec7408a9f30595f1a
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;
22f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato
23b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandlerimport android.animation.LayoutTransition;
24b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandlerimport android.animation.ObjectAnimator;
25dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.app.ActivityManagerNative;
26552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandlerimport android.app.Dialog;
27dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.app.PendingIntent;
28ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onoratoimport android.app.Notification;
29dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.app.StatusBarManager;
30808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.content.Context;
31808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.content.Intent;
32ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandlerimport android.content.SharedPreferences;
330ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandlerimport android.content.res.Configuration;
34808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.content.res.Resources;
35857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onoratoimport android.inputmethodservice.InputMethodService;
369120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.graphics.PixelFormat;
37bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brownimport android.graphics.Point;
38dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.graphics.Rect;
394daaeafd278d22ec9013d1cdaade562044ee907eJoe Onoratoimport android.graphics.drawable.LayerDrawable;
40552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandlerimport android.provider.Settings;
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;
48aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandlerimport android.view.accessibility.AccessibilityEvent;
4907949e908295d0857183830d48c84cb75ac4ff8bJoe Onoratoimport android.view.Display;
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;
55aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandlerimport android.view.SoundEffectConstants;
568304da460f95c0883eca0d97fcdc4eb42c10f7c2Daniel Sandlerimport android.view.VelocityTracker;
57808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.view.View;
58b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandlerimport android.view.ViewConfiguration;
599120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.view.ViewGroup;
609120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.view.WindowManager;
619120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.view.WindowManagerImpl;
623eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandlerimport android.widget.ImageView;
63808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport android.widget.LinearLayout;
64dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.widget.RemoteViews;
65dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandlerimport android.widget.ScrollView;
669120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandlerimport android.widget.TextView;
67808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
68808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport com.android.internal.statusbar.StatusBarIcon;
69808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport com.android.internal.statusbar.StatusBarNotification;
70808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
71fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport com.android.systemui.R;
72808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratoimport com.android.systemui.statusbar.*;
73fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport com.android.systemui.statusbar.policy.BatteryController;
74fce2bf3735177828ccf823b49d3396dfaccc8fd4Joe Onoratoimport com.android.systemui.statusbar.policy.BluetoothController;
7545c0401a0647a5fdc5f37168463c14ad57c5644bDaniel Sandlerimport com.android.systemui.statusbar.policy.CompatModeButton;
76e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandlerimport com.android.systemui.statusbar.policy.LocationController;
77fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport com.android.systemui.statusbar.policy.NetworkController;
78ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandlerimport com.android.systemui.statusbar.policy.Prefs;
799f0f0e0e3100caec459a5b5ef836317844c83b3fJim Millerimport com.android.systemui.recent.RecentsPanelView;
80808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
81dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onoratopublic class TabletStatusBar extends StatusBar implements
822992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        HeightReceiver.OnBarHeightChangedListener,
832992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        InputMethodsPanel.OnHardKeyboardEnabledChangeListener {
84fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler    public static final boolean DEBUG = false;
85e25f8336a062a08f87c9280975d8827d75186481Daniel Sandler    public static final boolean DEBUG_COMPAT_HELP = false;
86fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    public static final String TAG = "TabletStatusBar";
87808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
880ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
89b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato    public static final int MSG_OPEN_NOTIFICATION_PANEL = 1000;
90b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato    public static final int MSG_CLOSE_NOTIFICATION_PANEL = 1001;
91b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler    public static final int MSG_OPEN_NOTIFICATION_PEEK = 1002;
92b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler    public static final int MSG_CLOSE_NOTIFICATION_PEEK = 1003;
9344c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller    public static final int MSG_OPEN_RECENTS_PANEL = 1020;
9444c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller    public static final int MSG_CLOSE_RECENTS_PANEL = 1021;
950ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    public static final int MSG_SHOW_CHROME = 1030;
960ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    public static final int MSG_HIDE_CHROME = 1031;
9782beadfa067b1e286fa604f8d7960d769411c954satok    public static final int MSG_OPEN_INPUT_METHODS_PANEL = 1040;
9882beadfa067b1e286fa604f8d7960d769411c954satok    public static final int MSG_CLOSE_INPUT_METHODS_PANEL = 1041;
993b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler    public static final int MSG_OPEN_COMPAT_MODE_PANEL = 1050;
1003b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler    public static final int MSG_CLOSE_COMPAT_MODE_PANEL = 1051;
1012ed08d2e70250517e5578dd650c96b14aacf9ba5Daniel Sandler    public static final int MSG_STOP_TICKER = 2000;
10244c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller
1033a2fdedf693cca9146af8fd463e20cca5a2d1e20Daniel Sandler    // Fitts' Law assistance for LatinIME; see policy.EventHole
10410163c689a713a35f69aad420c35372946b8b32aDaniel Sandler    private static final boolean FAKE_SPACE_BAR = true;
10510163c689a713a35f69aad420c35372946b8b32aDaniel Sandler
106dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    // The height of the bar, as definied by the build.  It may be taller if we're plugged
107dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    // into hdmi.
108dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    int mNaturalBarHeight = -1;
1090ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    int mIconSize = -1;
1100ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    int mIconHPadding = -1;
1115485ff6141ccebad2c171a9a51ffdbcb72703bd7satok    private int mMaxNotificationIcons = 5;
1129120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler
1139120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler    H mHandler = new H();
1149120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler
11510163c689a713a35f69aad420c35372946b8b32aDaniel Sandler    IWindowManager mWindowManager;
11610163c689a713a35f69aad420c35372946b8b32aDaniel Sandler
117dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler    // tracking all current notifications
118ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler    private NotificationData mNotificationData = new NotificationData();
11944c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller
120b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato    TabletStatusBarView mStatusBarView;
121fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    View mNotificationArea;
122fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    View mNotificationTrigger;
123dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler    NotificationIconArea mNotificationIconArea;
12421eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler    ViewGroup mNavigationArea;
125b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler
126ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler    boolean mNotificationDNDMode;
127ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler    NotificationData.Entry mNotificationDNDDummyEntry;
128ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler
129536c58fbe51a53d0e6e78c360c9f6069ae0fd465Joe Onorato    ImageView mBackButton;
130b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler    View mHomeButton;
131e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler    View mMenuButton;
132f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    View mRecentButton;
133dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
1343b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler    ViewGroup mFeedbackIconArea; // notification icons, IME icon, compat icon
135cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok    InputMethodButton mInputMethodSwitchButton;
1363b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler    CompatModeButton mCompatModeButton;
13706487a58be22b100daf3f950b9a1d25c3ea42aa2satok
138ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato    NotificationPanel mNotificationPanel;
13907949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato    WindowManager.LayoutParams mNotificationPanelParams;
1408a576713e255eb822558cef840d170d4477f47f0Joe Onorato    NotificationPeekPanel mNotificationPeekWindow;
141b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler    ViewGroup mNotificationPeekRow;
142b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler    int mNotificationPeekIndex;
143a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler    IBinder mNotificationPeekKey;
144b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler    LayoutTransition mNotificationPeekScrubLeft, mNotificationPeekScrubRight;
145b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
146b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler    int mNotificationPeekTapDuration;
147b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler    int mNotificationFlingVelocity;
1483eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
1490f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler    ViewGroup mPile;
1503eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
151dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    HeightReceiver mHeightReceiver;
152fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    BatteryController mBatteryController;
153fce2bf3735177828ccf823b49d3396dfaccc8fd4Joe Onorato    BluetoothController mBluetoothController;
154e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler    LocationController mLocationController;
155fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    NetworkController mNetworkController;
1561e3ed8fc9537209920eea6adf5e576058f81d587Daniel Sandler
15721eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler    ViewGroup mBarContents;
15821eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler    LayoutTransition mBarContentsLayoutTransition;
159b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler
1600ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    // hide system chrome ("lights out") support
1610ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    View mShadow;
162ce70d91844d2e4fb987617d2924ae5b73096e5c3Daniel Sandler
1630f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler    NotificationIconArea.IconLayout mIconLayout;
1640f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler
165ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato    TabletTicker mTicker;
166dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
16710163c689a713a35f69aad420c35372946b8b32aDaniel Sandler    View mFakeSpaceBar;
16810163c689a713a35f69aad420c35372946b8b32aDaniel Sandler    KeyEvent mSpaceBarKeyEvent = null;
16910163c689a713a35f69aad420c35372946b8b32aDaniel Sandler
170ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn    View mCompatibilityHelpDialog = null;
171ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn
172dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler    // for disabling the status bar
173dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler    int mDisabled = 0;
174dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
1759f0f0e0e3100caec459a5b5ef836317844c83b3fJim Miller    private RecentsPanelView mRecentsPanel;
17682beadfa067b1e286fa604f8d7960d769411c954satok    private InputMethodsPanel mInputMethodsPanel;
1773b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler    private CompatModePanel mCompatModePanel;
17855d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato
179c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler    public Context getContext() { return mContext; }
180c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler
1819120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler    protected void addPanelWindows() {
182f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        final Context context = mContext;
18307949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato        final Resources res = mContext.getResources();
184f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato
18544c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller        // Notification Panel
186f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        mNotificationPanel = (NotificationPanel)View.inflate(context,
187755cc74e4cebdf67d21a2477512a4ac9b01e8323Joe Onorato                R.layout.status_bar_notification_panel, null);
1887c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato        mNotificationPanel.show(false, false);
189b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        mNotificationPanel.setOnTouchListener(
190ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato                new TouchOutsideListener(MSG_CLOSE_NOTIFICATION_PANEL, mNotificationPanel));
191b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato
192fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        // the battery and network icons
193fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mBatteryController.addIconView((ImageView)mNotificationPanel.findViewById(R.id.battery));
194fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mBatteryController.addLabelView(
195fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato                (TextView)mNotificationPanel.findViewById(R.id.battery_text));
196fce2bf3735177828ccf823b49d3396dfaccc8fd4Joe Onorato        mBluetoothController.addIconView(
197fce2bf3735177828ccf823b49d3396dfaccc8fd4Joe Onorato                (ImageView)mNotificationPanel.findViewById(R.id.bluetooth));
198ddbba42b812ab397a75db78aba6b48fecf0e31f6Joe Onorato        mNetworkController.addCombinedSignalIconView(
19942f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato                (ImageView)mNotificationPanel.findViewById(R.id.network_signal));
20042f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato        mNetworkController.addDataTypeIconView(
20142f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato                (ImageView)mNotificationPanel.findViewById(R.id.network_type));
202fce2bf3735177828ccf823b49d3396dfaccc8fd4Joe Onorato        mNetworkController.addDataDirectionOverlayIconView(
203fce2bf3735177828ccf823b49d3396dfaccc8fd4Joe Onorato                (ImageView)mNotificationPanel.findViewById(R.id.network_direction));
204fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mNetworkController.addLabelView(
205fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato                (TextView)mNotificationPanel.findViewById(R.id.network_text));
2063e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler        mNetworkController.addLabelView(
2073e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler                (TextView)mBarContents.findViewById(R.id.network_text));
208fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato
20955d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato        mStatusBarView.setIgnoreChildren(0, mNotificationTrigger, mNotificationPanel);
210d39e388e6d7f19d6e8d620e449af4124efab1d0dDaniel Sandler
21107949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato        WindowManager.LayoutParams lp = mNotificationPanelParams = new WindowManager.LayoutParams(
21207949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato                res.getDimensionPixelSize(R.dimen.notification_panel_width),
21307949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato                getNotificationPanelHeight(),
2149120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler                WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
2159120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
21607949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
21746e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown                    | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
2187c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
2197c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
2209120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler                PixelFormat.TRANSLUCENT);
221ea70e63c0dcd09ec5790f4dca6ddd76284a6a23dJoe Onorato        lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
2229120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler        lp.setTitle("NotificationPanel");
2237c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato        lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
2247c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato                | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
2257c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato        lp.windowAnimations = com.android.internal.R.style.Animation; // == no animation
2267d9ea8ccc8a9c0a9a947fbf303ead738528445f6Daniel Sandler//        lp.windowAnimations = com.android.internal.R.style.Animation_ZoomButtons; // simple fade
2279120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler
2289120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler        WindowManagerImpl.getDefault().addView(mNotificationPanel, lp);
2299120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler
230b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        // Notification preview window
2318a576713e255eb822558cef840d170d4477f47f0Joe Onorato        mNotificationPeekWindow = (NotificationPeekPanel) View.inflate(context,
232755cc74e4cebdf67d21a2477512a4ac9b01e8323Joe Onorato                R.layout.status_bar_notification_peek, null);
233663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler        mNotificationPeekWindow.setBar(this);
234663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler
235b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        mNotificationPeekRow = (ViewGroup) mNotificationPeekWindow.findViewById(R.id.content);
236b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        mNotificationPeekWindow.setVisibility(View.GONE);
237b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        mNotificationPeekWindow.setOnTouchListener(
2385e759460dcb91ba96758c2ac6d354ff8563b78a4Joe Onorato                new TouchOutsideListener(MSG_CLOSE_NOTIFICATION_PEEK, mNotificationPeekWindow));
239b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        mNotificationPeekScrubRight = new LayoutTransition();
24085babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        mNotificationPeekScrubRight.setAnimator(LayoutTransition.APPEARING,
241b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                ObjectAnimator.ofInt(null, "left", -512, 0));
24285babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        mNotificationPeekScrubRight.setAnimator(LayoutTransition.DISAPPEARING,
243b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                ObjectAnimator.ofInt(null, "left", -512, 0));
244b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        mNotificationPeekScrubRight.setDuration(500);
245b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
246b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        mNotificationPeekScrubLeft = new LayoutTransition();
24785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        mNotificationPeekScrubLeft.setAnimator(LayoutTransition.APPEARING,
248b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                ObjectAnimator.ofInt(null, "left", 512, 0));
24985babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        mNotificationPeekScrubLeft.setAnimator(LayoutTransition.DISAPPEARING,
250b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                ObjectAnimator.ofInt(null, "left", 512, 0));
251b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        mNotificationPeekScrubLeft.setDuration(500);
252b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
253b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        // XXX: setIgnoreChildren?
254b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        lp = new WindowManager.LayoutParams(
255b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                512, // ViewGroup.LayoutParams.WRAP_CONTENT,
256b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                ViewGroup.LayoutParams.WRAP_CONTENT,
257b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
2587d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
25946e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown                    | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
26046e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
261b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                PixelFormat.TRANSLUCENT);
262b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
2637d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn        lp.y = res.getDimensionPixelOffset(R.dimen.peek_window_y_offset);
264b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        lp.setTitle("NotificationPeekWindow");
265b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        lp.windowAnimations = com.android.internal.R.style.Animation_Toast;
266b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
267b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        WindowManagerImpl.getDefault().addView(mNotificationPeekWindow, lp);
268b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
26944c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller        // Recents Panel
2709f0f0e0e3100caec459a5b5ef836317844c83b3fJim Miller        mRecentsPanel = (RecentsPanelView) View.inflate(context,
27185babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                R.layout.status_bar_recent_panel, null);
27285babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        mRecentsPanel.setVisibility(View.GONE);
27385babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        mRecentsPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_RECENTS_PANEL,
27485babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                mRecentsPanel));
27585babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        mStatusBarView.setIgnoreChildren(2, mRecentButton, mRecentsPanel);
27685babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller
27785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        lp = new WindowManager.LayoutParams(
27885babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                ViewGroup.LayoutParams.WRAP_CONTENT,
27985babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                ViewGroup.LayoutParams.WRAP_CONTENT,
28085babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
28185babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
28285babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                    | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
28385babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
28485babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
28585babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                PixelFormat.TRANSLUCENT);
28685babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        lp.gravity = Gravity.BOTTOM | Gravity.LEFT;
28785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        lp.setTitle("RecentsPanel");
28885babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        lp.windowAnimations = R.style.Animation_RecentPanel;
2895fda69cf1e7cad4d40f80203e5f790595f66e840Jim Miller        lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
2905fda69cf1e7cad4d40f80203e5f790595f66e840Jim Miller                | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
29185babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller
29285babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        WindowManagerImpl.getDefault().addView(mRecentsPanel, lp);
29385babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller        mRecentsPanel.setBar(this);
29482beadfa067b1e286fa604f8d7960d769411c954satok
29582beadfa067b1e286fa604f8d7960d769411c954satok        // Input methods Panel
29682beadfa067b1e286fa604f8d7960d769411c954satok        mInputMethodsPanel = (InputMethodsPanel) View.inflate(context,
29782beadfa067b1e286fa604f8d7960d769411c954satok                R.layout.status_bar_input_methods_panel, null);
2982992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        mInputMethodsPanel.setHardKeyboardEnabledChangeListener(this);
29982beadfa067b1e286fa604f8d7960d769411c954satok        mInputMethodsPanel.setOnTouchListener(new TouchOutsideListener(
30082beadfa067b1e286fa604f8d7960d769411c954satok                MSG_CLOSE_INPUT_METHODS_PANEL, mInputMethodsPanel));
301913f42d26a32621ad7dd52c52b8d150eedf4f8fesatok        mInputMethodsPanel.setImeSwitchButton(mInputMethodSwitchButton);
30282beadfa067b1e286fa604f8d7960d769411c954satok        mStatusBarView.setIgnoreChildren(3, mInputMethodSwitchButton, mInputMethodsPanel);
30382beadfa067b1e286fa604f8d7960d769411c954satok        lp = new WindowManager.LayoutParams(
30482beadfa067b1e286fa604f8d7960d769411c954satok                ViewGroup.LayoutParams.WRAP_CONTENT,
30582beadfa067b1e286fa604f8d7960d769411c954satok                ViewGroup.LayoutParams.WRAP_CONTENT,
30682beadfa067b1e286fa604f8d7960d769411c954satok                WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
30782beadfa067b1e286fa604f8d7960d769411c954satok                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
30882beadfa067b1e286fa604f8d7960d769411c954satok                    | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
30982beadfa067b1e286fa604f8d7960d769411c954satok                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
31082beadfa067b1e286fa604f8d7960d769411c954satok                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
31182beadfa067b1e286fa604f8d7960d769411c954satok                PixelFormat.TRANSLUCENT);
31282beadfa067b1e286fa604f8d7960d769411c954satok        lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
31382beadfa067b1e286fa604f8d7960d769411c954satok        lp.setTitle("InputMethodsPanel");
31482beadfa067b1e286fa604f8d7960d769411c954satok        lp.windowAnimations = R.style.Animation_RecentPanel;
31582beadfa067b1e286fa604f8d7960d769411c954satok
31682beadfa067b1e286fa604f8d7960d769411c954satok        WindowManagerImpl.getDefault().addView(mInputMethodsPanel, lp);
3173b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler
3183b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        // Compatibility mode selector panel
3193b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mCompatModePanel = (CompatModePanel) View.inflate(context,
3203b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                R.layout.status_bar_compat_mode_panel, null);
3213b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mCompatModePanel.setOnTouchListener(new TouchOutsideListener(
3223b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                MSG_CLOSE_COMPAT_MODE_PANEL, mCompatModePanel));
3233b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mCompatModePanel.setTrigger(mCompatModeButton);
3243b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mCompatModePanel.setVisibility(View.GONE);
3253b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mStatusBarView.setIgnoreChildren(4, mCompatModeButton, mCompatModePanel);
3263b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        lp = new WindowManager.LayoutParams(
3273b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                250,
3283b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                ViewGroup.LayoutParams.WRAP_CONTENT,
3293b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
3303b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
3313b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                    | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
3323b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                    | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
3333b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
3343b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                PixelFormat.TRANSLUCENT);
3353b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
3363b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        lp.setTitle("CompatModePanel");
3373b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        lp.windowAnimations = android.R.style.Animation_Dialog;
3383b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler
3393b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        WindowManagerImpl.getDefault().addView(mCompatModePanel, lp);
3409120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler    }
341808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
34207949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato    private int getNotificationPanelHeight() {
34307949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato        final Resources res = mContext.getResources();
34407949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato        final Display d = WindowManagerImpl.getDefault().getDefaultDisplay();
345bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        final Point size = new Point();
346bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        d.getRealSize(size);
347bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        return Math.max(res.getDimensionPixelSize(R.dimen.notification_panel_min_height), size.y);
34807949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato    }
34907949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato
350808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    @Override
351f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    public void start() {
352f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        super.start(); // will add the main bar view
353808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
354808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
3550ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    @Override
356dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    protected void onConfigurationChanged(Configuration newConfig) {
357bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        mHeightReceiver.updateHeight(); // display size may have changed
3580ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        loadDimens();
35907949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato        mNotificationPanelParams.height = getNotificationPanelHeight();
36007949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato        WindowManagerImpl.getDefault().updateViewLayout(mNotificationPanel,
36107949e908295d0857183830d48c84cb75ac4ff8bJoe Onorato                mNotificationPanelParams);
3620ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    }
3630ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
3640ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    protected void loadDimens() {
3650ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        final Resources res = mContext.getResources();
3660ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
367dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        mNaturalBarHeight = res.getDimensionPixelSize(
36881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                com.android.internal.R.dimen.system_bar_height);
3690ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
3700ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        int newIconSize = res.getDimensionPixelSize(
37181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            com.android.internal.R.dimen.system_bar_icon_size);
3720ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        int newIconHPadding = res.getDimensionPixelSize(
3730ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler            R.dimen.status_bar_icon_padding);
3740ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
3750ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        if (newIconHPadding != mIconHPadding || newIconSize != mIconSize) {
3760ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler//            Slog.d(TAG, "size=" + newIconSize + " padding=" + newIconHPadding);
3770ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler            mIconHPadding = newIconHPadding;
3780ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler            mIconSize = newIconSize;
3790ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler            reloadAllNotificationIcons(); // reload the tray
3800ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        }
3815485ff6141ccebad2c171a9a51ffdbcb72703bd7satok
3825485ff6141ccebad2c171a9a51ffdbcb72703bd7satok        final int numIcons = res.getInteger(R.integer.config_maxNotificationIcons);
3835485ff6141ccebad2c171a9a51ffdbcb72703bd7satok        if (numIcons != mMaxNotificationIcons) {
3845485ff6141ccebad2c171a9a51ffdbcb72703bd7satok            mMaxNotificationIcons = numIcons;
3855485ff6141ccebad2c171a9a51ffdbcb72703bd7satok            if (DEBUG) Slog.d(TAG, "max notification icons: " + mMaxNotificationIcons);
3865485ff6141ccebad2c171a9a51ffdbcb72703bd7satok            reloadAllNotificationIcons();
3875485ff6141ccebad2c171a9a51ffdbcb72703bd7satok        }
3880ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    }
3890ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
390808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    protected View makeStatusBarView() {
391f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        final Context context = mContext;
39285babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller
39310163c689a713a35f69aad420c35372946b8b32aDaniel Sandler        mWindowManager = IWindowManager.Stub.asInterface(
39410163c689a713a35f69aad420c35372946b8b32aDaniel Sandler                ServiceManager.getService(Context.WINDOW_SERVICE));
395808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
396dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        // This guy will listen for HDMI plugged broadcasts so we can resize the
397dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        // status bar as appropriate.
398dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        mHeightReceiver = new HeightReceiver(mContext);
399dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        mHeightReceiver.registerReceiver();
4000ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        loadDimens();
401808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
402b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        final TabletStatusBarView sb = (TabletStatusBarView)View.inflate(
403f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato                context, R.layout.status_bar, null);
404808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mStatusBarView = sb;
405808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
406b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        sb.setHandler(mHandler);
407b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato
40821eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        mBarContents = (ViewGroup) sb.findViewById(R.id.bar_contents);
40921eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        // layout transitions for the status bar's contents
41021eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        mBarContentsLayoutTransition = new LayoutTransition();
41121eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        // add/removal will fade as normal
41221eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        mBarContentsLayoutTransition.setAnimator(LayoutTransition.APPEARING,
41321eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler                ObjectAnimator.ofFloat(null, "alpha", 0f, 1f));
41421eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        mBarContentsLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING,
41521eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler                ObjectAnimator.ofFloat(null, "alpha", 1f, 0f));
41621eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        // no animations for siblings on change: just jump into place please
41721eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        mBarContentsLayoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, null);
41821eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        mBarContentsLayoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, null);
41921eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        // quick like bunny
42021eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        mBarContentsLayoutTransition.setDuration(250 * (DEBUG?10:1));
42121eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        mBarContents.setLayoutTransition(mBarContentsLayoutTransition);
422f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato
423fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        // the whole right-hand side of the bar
424fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mNotificationArea = sb.findViewById(R.id.notificationArea);
425fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato
42655d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato        // the button to open the notification area
427fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mNotificationTrigger = sb.findViewById(R.id.notificationTrigger);
42856a6d880125906df588e7a973085501d588b18ebDaniel Sandler        mNotificationTrigger.setOnTouchListener(new NotificationTriggerTouchListener());
42955d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato
430808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        // the more notifications icon
431808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        mNotificationIconArea = (NotificationIconArea)sb.findViewById(R.id.notificationIcons);
432808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
4333eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // where the icons go
4343eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        mIconLayout = (NotificationIconArea.IconLayout) sb.findViewById(R.id.icons);
435b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        mIconLayout.setOnTouchListener(new NotificationIconTouchListener());
436b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
437b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        ViewConfiguration vc = ViewConfiguration.get(context);
438b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        mNotificationPeekTapDuration = vc.getTapTimeout();
439b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        mNotificationFlingVelocity = 300; // px/s
4403eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
441c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler        mTicker = new TabletTicker(this);
442dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
443fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        // The icons
444e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler        mLocationController = new LocationController(mContext); // will post a notification
445e40451a89dc91dfd636af7cb32a23b4a4cc93fdcDaniel Sandler
446fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mBatteryController = new BatteryController(mContext);
447fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mBatteryController.addIconView((ImageView)sb.findViewById(R.id.battery));
448fce2bf3735177828ccf823b49d3396dfaccc8fd4Joe Onorato        mBluetoothController = new BluetoothController(mContext);
449fce2bf3735177828ccf823b49d3396dfaccc8fd4Joe Onorato        mBluetoothController.addIconView((ImageView)sb.findViewById(R.id.bluetooth));
450fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato        mNetworkController = new NetworkController(mContext);
45142f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato        mNetworkController.addCombinedSignalIconView(
45242f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato                (ImageView)sb.findViewById(R.id.network_signal));
45342f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato        mNetworkController.addDataTypeIconView(
45442f8e130244cf216701bd03a34935c0fa1c3efc5Joe Onorato                (ImageView)sb.findViewById(R.id.network_type));
455fce2bf3735177828ccf823b49d3396dfaccc8fd4Joe Onorato        mNetworkController.addDataDirectionOverlayIconView(
456fce2bf3735177828ccf823b49d3396dfaccc8fd4Joe Onorato                (ImageView)sb.findViewById(R.id.network_direction));
4571e3ed8fc9537209920eea6adf5e576058f81d587Daniel Sandler
458091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato        // The navigation buttons
4596478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato        mBackButton = (ImageView)sb.findViewById(R.id.back);
46021eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        mNavigationArea = (ViewGroup) sb.findViewById(R.id.navigationArea);
461b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler        mHomeButton = mNavigationArea.findViewById(R.id.home);
462e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler        mMenuButton = mNavigationArea.findViewById(R.id.menu);
463b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler        mRecentButton = mNavigationArea.findViewById(R.id.recent_apps);
464b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler        mRecentButton.setOnClickListener(mOnClickListener);
46521eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler        mNavigationArea.setLayoutTransition(mBarContentsLayoutTransition);
466091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato
46706487a58be22b100daf3f950b9a1d25c3ea42aa2satok        // The bar contents buttons
4683b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mFeedbackIconArea = (ViewGroup)sb.findViewById(R.id.feedbackIconArea);
469cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok        mInputMethodSwitchButton = (InputMethodButton) sb.findViewById(R.id.imeSwitchButton);
47082beadfa067b1e286fa604f8d7960d769411c954satok        // Overwrite the lister
47182beadfa067b1e286fa604f8d7960d769411c954satok        mInputMethodSwitchButton.setOnClickListener(mOnClickListener);
47206487a58be22b100daf3f950b9a1d25c3ea42aa2satok
4733b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mCompatModeButton = (CompatModeButton) sb.findViewById(R.id.compatModeButton);
4743b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mCompatModeButton.setOnClickListener(mOnClickListener);
4753b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler
47610163c689a713a35f69aad420c35372946b8b32aDaniel Sandler        // for redirecting errant bar taps to the IME
47710163c689a713a35f69aad420c35372946b8b32aDaniel Sandler        mFakeSpaceBar = sb.findViewById(R.id.fake_space_bar);
47810163c689a713a35f69aad420c35372946b8b32aDaniel Sandler
479b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler        // "shadows" of the status bar features, for lights-out mode
4800ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        mShadow = sb.findViewById(R.id.bar_shadow);
4810ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        mShadow.setOnTouchListener(
4820ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler            new View.OnTouchListener() {
4830ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                public boolean onTouch(View v, MotionEvent ev) {
4840ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
485d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler                        // even though setting the systemUI visibility below will turn these views
486d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler                        // on, we need them to come up faster so that they can catch this motion
487d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler                        // event
488d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler                        mShadow.setVisibility(View.GONE);
489d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler                        mBarContents.setVisibility(View.VISIBLE);
490d72015505eace31b5b35ecc78b42f0d8c083399cDaniel Sandler
49155bf3809b98dad0b8268804e684d63ea59124148Joe Onorato                        try {
49255bf3809b98dad0b8268804e684d63ea59124148Joe Onorato                            mBarService.setSystemUiVisibility(View.STATUS_BAR_VISIBLE);
49355bf3809b98dad0b8268804e684d63ea59124148Joe Onorato                        } catch (RemoteException ex) {
49455bf3809b98dad0b8268804e684d63ea59124148Joe Onorato                            // system process dead
49555bf3809b98dad0b8268804e684d63ea59124148Joe Onorato                        }
4960ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                    }
4970ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                    return false;
4980ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                }
4990ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler            });
5000ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
5010ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        // tuning parameters
5020ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        final int LIGHTS_GOING_OUT_SYSBAR_DURATION = 600;
5030ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        final int LIGHTS_GOING_OUT_SHADOW_DURATION = 1000;
5040ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        final int LIGHTS_GOING_OUT_SHADOW_DELAY    = 500;
5050ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
5060ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        final int LIGHTS_COMING_UP_SYSBAR_DURATION = 200;
5070ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler//        final int LIGHTS_COMING_UP_SYSBAR_DELAY    = 50;
5080ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        final int LIGHTS_COMING_UP_SHADOW_DURATION = 0;
5090ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
5100ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        LayoutTransition xition = new LayoutTransition();
5110ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setAnimator(LayoutTransition.APPEARING,
5120ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler               ObjectAnimator.ofFloat(null, "alpha", 0.5f, 1f));
5130ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setDuration(LayoutTransition.APPEARING, LIGHTS_COMING_UP_SYSBAR_DURATION);
5140ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setStartDelay(LayoutTransition.APPEARING, 0);
5150ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setAnimator(LayoutTransition.DISAPPEARING,
5160ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler               ObjectAnimator.ofFloat(null, "alpha", 1f, 0f));
5170ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setDuration(LayoutTransition.DISAPPEARING, LIGHTS_GOING_OUT_SYSBAR_DURATION);
5180ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setStartDelay(LayoutTransition.DISAPPEARING, 0);
5190ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        ((ViewGroup)sb.findViewById(R.id.bar_contents_holder)).setLayoutTransition(xition);
5200ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
5210ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition = new LayoutTransition();
5220ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setAnimator(LayoutTransition.APPEARING,
5230ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler               ObjectAnimator.ofFloat(null, "alpha", 0f, 1f));
5240ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setDuration(LayoutTransition.APPEARING, LIGHTS_GOING_OUT_SHADOW_DURATION);
5250ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setStartDelay(LayoutTransition.APPEARING, LIGHTS_GOING_OUT_SHADOW_DELAY);
5260ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setAnimator(LayoutTransition.DISAPPEARING,
5270ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler               ObjectAnimator.ofFloat(null, "alpha", 1f, 0f));
5280ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setDuration(LayoutTransition.DISAPPEARING, LIGHTS_COMING_UP_SHADOW_DURATION);
5290ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        xition.setStartDelay(LayoutTransition.DISAPPEARING, 0);
5300ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        ((ViewGroup)sb.findViewById(R.id.bar_shadow_holder)).setLayoutTransition(xition);
531b96069936c4e6d10c119efa9943fba818b09373eDaniel Sandler
5325dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato        // set the initial view visibility
5335dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato        setAreThereNotifications();
5345dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato
535dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        // Add the windows
536dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        addPanelWindows();
537dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
538dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        mPile = (ViewGroup)mNotificationPanel.findViewById(R.id.content);
539dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        mPile.removeAllViews();
54044c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller
541dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        ScrollView scroller = (ScrollView)mPile.getParent();
542dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        scroller.setFillViewport(true);
543dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
544dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        mHeightReceiver.addOnBarHeightChangedListener(this);
545dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato
546808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        return sb;
547808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
548808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
549dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    public int getStatusBarHeight() {
550dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        return mHeightReceiver.getHeight();
551dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    }
552dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato
553808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    protected int getStatusBarGravity() {
554808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato        return Gravity.BOTTOM | Gravity.FILL_HORIZONTAL;
555808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
556808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
557dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    public void onBarHeightChanged(int height) {
558dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        final WindowManager.LayoutParams lp
559dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato                = (WindowManager.LayoutParams)mStatusBarView.getLayoutParams();
560dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        if (lp == null) {
561dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato            // haven't been added yet
562dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato            return;
563dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        }
564dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        if (lp.height != height) {
565dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato            lp.height = height;
566dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato            final WindowManager wm = WindowManagerImpl.getDefault();
567dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato            wm.updateViewLayout(mStatusBarView, lp);
568dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato        }
569dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato    }
570dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato
5719120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler    private class H extends Handler {
5729120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler        public void handleMessage(Message m) {
5739120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler            switch (m.what) {
574b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                case MSG_OPEN_NOTIFICATION_PEEK:
575b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    if (DEBUG) Slog.d(TAG, "opening notification peek window; arg=" + m.arg1);
576ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler
577b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    if (m.arg1 >= 0) {
578ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                        final int N = mNotificationData.size();
579ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler
580ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                        if (!mNotificationDNDMode) {
581ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                            if (mNotificationPeekIndex >= 0 && mNotificationPeekIndex < N) {
582ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                NotificationData.Entry entry = mNotificationData.get(N-1-mNotificationPeekIndex);
583ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                entry.icon.setBackgroundColor(0);
584ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                mNotificationPeekIndex = -1;
585ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                mNotificationPeekKey = null;
586ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                            }
587b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        }
588b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
589b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        final int peekIndex = m.arg1;
590b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        if (peekIndex < N) {
5910ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                            //Slog.d(TAG, "loading peek: " + peekIndex);
5925fda69cf1e7cad4d40f80203e5f790595f66e840Jim Miller                            NotificationData.Entry entry =
593ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                mNotificationDNDMode
594ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                    ? mNotificationDNDDummyEntry
595ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                    : mNotificationData.get(N-1-peekIndex);
596b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            NotificationData.Entry copy = new NotificationData.Entry(
59785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                                    entry.key,
59885babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                                    entry.notification,
599b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                                    entry.icon);
600b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            inflateViews(copy, mNotificationPeekRow);
601b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
602ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                            if (mNotificationDNDMode) {
603ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                copy.content.setOnClickListener(new View.OnClickListener() {
604ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                    public void onClick(View v) {
605ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                        SharedPreferences.Editor editor = Prefs.edit(mContext);
606ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                        editor.putBoolean(Prefs.DO_NOT_DISTURB_PREF, false);
607ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                        editor.apply();
608ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                        animateCollapse();
609ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                    }
610ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                });
611ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                            }
612ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler
613b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            entry.icon.setBackgroundColor(0x20FFFFFF);
614b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
615b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler//                          mNotificationPeekRow.setLayoutTransition(
61685babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller//                              peekIndex < mNotificationPeekIndex
617b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler//                                  ? mNotificationPeekScrubLeft
618b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler//                                  : mNotificationPeekScrubRight);
619b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
620b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            mNotificationPeekRow.removeAllViews();
621b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            mNotificationPeekRow.addView(copy.row);
622b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
623b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            mNotificationPeekWindow.setVisibility(View.VISIBLE);
6247c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato                            mNotificationPanel.show(false, true);
625b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
626b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            mNotificationPeekIndex = peekIndex;
627a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler                            mNotificationPeekKey = entry.key;
628b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        }
629b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    }
630b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    break;
631b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                case MSG_CLOSE_NOTIFICATION_PEEK:
632b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    if (DEBUG) Slog.d(TAG, "closing notification peek window");
633b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    mNotificationPeekWindow.setVisibility(View.GONE);
634b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    mNotificationPeekRow.removeAllViews();
635ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler
636ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                    final int N = mNotificationData.size();
637a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler                    if (mNotificationPeekIndex >= 0 && mNotificationPeekIndex < N) {
6385fda69cf1e7cad4d40f80203e5f790595f66e840Jim Miller                        NotificationData.Entry entry =
639ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                            mNotificationDNDMode
640ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                ? mNotificationDNDDummyEntry
641ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler                                : mNotificationData.get(N-1-mNotificationPeekIndex);
642b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        entry.icon.setBackgroundColor(0);
643b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    }
644a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler
645a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler                    mNotificationPeekIndex = -1;
646a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler                    mNotificationPeekKey = null;
647b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    break;
6489120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler                case MSG_OPEN_NOTIFICATION_PANEL:
6499120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler                    if (DEBUG) Slog.d(TAG, "opening notifications panel");
6507c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato                    if (!mNotificationPanel.isShowing()) {
651b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        mNotificationPeekWindow.setVisibility(View.GONE);
6527c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato                        mNotificationPanel.show(true, true);
65321eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler                        mNotificationArea.setVisibility(View.INVISIBLE);
65450ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato                        mTicker.halt();
655091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato                    }
6569120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler                    break;
6579120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler                case MSG_CLOSE_NOTIFICATION_PANEL:
6589120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler                    if (DEBUG) Slog.d(TAG, "closing notifications panel");
6597c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato                    if (mNotificationPanel.isShowing()) {
6607c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato                        mNotificationPanel.show(false, true);
6610ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                        mNotificationArea.setVisibility(View.VISIBLE);
662091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato                    }
6639120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler                    break;
66444c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller                case MSG_OPEN_RECENTS_PANEL:
66544c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller                    if (DEBUG) Slog.d(TAG, "opening recents panel");
66685babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                    if (mRecentsPanel != null) {
667b5a2b29a6495d0326ebea58f98af7edf49b4ae24Jim Miller                        disable(StatusBarManager.DISABLE_BACK);
66885babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                        mRecentsPanel.setVisibility(View.VISIBLE);
66985babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                        mRecentsPanel.show(true, true);
67085babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                    }
67144c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller                    break;
67244c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller                case MSG_CLOSE_RECENTS_PANEL:
67344c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller                    if (DEBUG) Slog.d(TAG, "closing recents panel");
67485babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                    if (mRecentsPanel != null && mRecentsPanel.isShowing()) {
6755fda69cf1e7cad4d40f80203e5f790595f66e840Jim Miller                        disable(StatusBarManager.DISABLE_NONE);
67685babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                        mRecentsPanel.show(false, true);
67785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller                    }
6789120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler                    break;
67982beadfa067b1e286fa604f8d7960d769411c954satok                case MSG_OPEN_INPUT_METHODS_PANEL:
68082beadfa067b1e286fa604f8d7960d769411c954satok                    if (DEBUG) Slog.d(TAG, "opening input methods panel");
681e385f0c771e5338200486bdca82088ad6f3a9c97Tadashi G. Takaoka                    if (mInputMethodsPanel != null) mInputMethodsPanel.openPanel();
68282beadfa067b1e286fa604f8d7960d769411c954satok                    break;
68382beadfa067b1e286fa604f8d7960d769411c954satok                case MSG_CLOSE_INPUT_METHODS_PANEL:
68482beadfa067b1e286fa604f8d7960d769411c954satok                    if (DEBUG) Slog.d(TAG, "closing input methods panel");
685e385f0c771e5338200486bdca82088ad6f3a9c97Tadashi G. Takaoka                    if (mInputMethodsPanel != null) mInputMethodsPanel.closePanel(false);
68682beadfa067b1e286fa604f8d7960d769411c954satok                    break;
6873b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                case MSG_OPEN_COMPAT_MODE_PANEL:
6883b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                    if (DEBUG) Slog.d(TAG, "opening compat panel");
6893b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                    if (mCompatModePanel != null) mCompatModePanel.openPanel();
6903b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                    break;
6913b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                case MSG_CLOSE_COMPAT_MODE_PANEL:
6923b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                    if (DEBUG) Slog.d(TAG, "closing compat panel");
6933b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                    if (mCompatModePanel != null) mCompatModePanel.closePanel();
6943b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                    break;
6950ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                case MSG_SHOW_CHROME:
696e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler                    if (DEBUG) Slog.d(TAG, "hiding shadows (lights on)");
6970ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                    mBarContents.setVisibility(View.VISIBLE);
6980ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                    mShadow.setVisibility(View.GONE);
699664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    notifyLightsChanged(true);
70006e6630a462b6a5c04c319d781d64896778d351fDaniel Sandler                    break;
7010ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                case MSG_HIDE_CHROME:
702e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler                    if (DEBUG) Slog.d(TAG, "showing shadows (lights out)");
70306e6630a462b6a5c04c319d781d64896778d351fDaniel Sandler                    animateCollapse();
7040ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                    mBarContents.setVisibility(View.GONE);
7050ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                    mShadow.setVisibility(View.VISIBLE);
706664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    notifyLightsChanged(false);
707e03d1bcfc42188e574a8e401154c77d5714eea41Daniel Sandler                    break;
7082ed08d2e70250517e5578dd650c96b14aacf9ba5Daniel Sandler                case MSG_STOP_TICKER:
7092ed08d2e70250517e5578dd650c96b14aacf9ba5Daniel Sandler                    mTicker.halt();
7102ed08d2e70250517e5578dd650c96b14aacf9ba5Daniel Sandler                    break;
7119120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler            }
7129120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler        }
7139120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler    }
714271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler
715664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    private void notifyLightsChanged(boolean shown) {
716664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        try {
717664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            Slog.d(TAG, "lights " + (shown?"on":"out"));
718664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            mWindowManager.statusBarVisibilityChanged(
719664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    shown ? View.STATUS_BAR_VISIBLE : View.STATUS_BAR_HIDDEN);
720664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        } catch (RemoteException ex) {
721664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        }
722664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
723664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
724808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) {
7251e3ed8fc9537209920eea6adf5e576058f81d587Daniel Sandler        if (DEBUG) Slog.d(TAG, "addIcon(" + slot + ") -> " + icon);
726808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
727808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
728808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void updateIcon(String slot, int index, int viewIndex,
729808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato            StatusBarIcon old, StatusBarIcon icon) {
7301e3ed8fc9537209920eea6adf5e576058f81d587Daniel Sandler        if (DEBUG) Slog.d(TAG, "updateIcon(" + slot + ") -> " + icon);
731808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
732808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
733808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void removeIcon(String slot, int index, int viewIndex) {
7341e3ed8fc9537209920eea6adf5e576058f81d587Daniel Sandler        if (DEBUG) Slog.d(TAG, "removeIcon(" + slot + ")");
735808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
736808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
737808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void addNotification(IBinder key, StatusBarNotification notification) {
7383eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        if (DEBUG) Slog.d(TAG, "addNotification(" + key + " -> " + notification + ")");
7393eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        addNotificationViews(key, notification);
740fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler
74150ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        final boolean immersive = isImmersive();
742cf2b199e98de71dcac042484800c07366363a734Joe Onorato        if (false && immersive) {
743fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler            // TODO: immersive mode popups for tablet
744fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler        } else if (notification.notification.fullScreenIntent != null) {
745fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler            // not immersive & a full-screen alert should be shown
746f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato            Slog.w(TAG, "Notification has fullScreenIntent and activity is not immersive;"
747fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler                    + " sending fullScreenIntent");
748fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler            try {
749fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler                notification.notification.fullScreenIntent.send();
750fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler            } catch (PendingIntent.CanceledException e) {
751fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler            }
752fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler        } else {
753eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato            tick(key, notification, true);
754fb970e920413e7f3a6159056fa698bb9c6b04056Daniel Sandler        }
7555dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato
7565dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato        setAreThereNotifications();
757808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
758808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
759808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void updateNotification(IBinder key, StatusBarNotification notification) {
760282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler        if (DEBUG) Slog.d(TAG, "updateNotification(" + key + " -> " + notification + ")");
76144c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller
762ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler        final NotificationData.Entry oldEntry = mNotificationData.findByKey(key);
763379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler        if (oldEntry == null) {
7643eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            Slog.w(TAG, "updateNotification for unknown key: " + key);
7653eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            return;
7663eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
7673eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
7683eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        final StatusBarNotification oldNotification = oldEntry.notification;
7693eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        final RemoteViews oldContentView = oldNotification.notification.contentView;
7703eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
7713eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        final RemoteViews contentView = notification.notification.contentView;
7723eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
773373a9983742b3d2370c36183aca3cde4614e6185Daniel Sandler        if (DEBUG) {
7743eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            Slog.d(TAG, "old notification: when=" + oldNotification.notification.when
7753eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    + " ongoing=" + oldNotification.isOngoing()
7763eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    + " expanded=" + oldEntry.expanded
777282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                    + " contentView=" + oldContentView
778282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                    + " rowParent=" + oldEntry.row.getParent());
7793eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            Slog.d(TAG, "new notification: when=" + notification.notification.when
7803eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    + " ongoing=" + oldNotification.isOngoing()
7813eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    + " contentView=" + contentView);
7823eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
7833eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
7843eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // Can we just reapply the RemoteViews in place?  If when didn't change, the order
7853eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // didn't change.
78680a44401a22344f7eabce6976372ab144ef22893Joe Onorato        boolean contentsUnchanged = oldEntry.expanded != null
78780a44401a22344f7eabce6976372ab144ef22893Joe Onorato                && contentView != null && oldContentView != null
7883eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                && contentView.getPackage() != null
7893eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                && oldContentView.getPackage() != null
7903eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                && oldContentView.getPackage().equals(contentView.getPackage())
791c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato                && oldContentView.getLayoutId() == contentView.getLayoutId();
792373a9983742b3d2370c36183aca3cde4614e6185Daniel Sandler        ViewGroup rowParent = (ViewGroup) oldEntry.row.getParent();
79380a44401a22344f7eabce6976372ab144ef22893Joe Onorato        boolean orderUnchanged = notification.notification.when==oldNotification.notification.when
7945fda69cf1e7cad4d40f80203e5f790595f66e840Jim Miller                && notification.priority == oldNotification.priority;
795a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler                // priority now encompasses isOngoing()
796c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato        boolean isLastAnyway = rowParent.indexOfChild(oldEntry.row) == rowParent.getChildCount()-1;
797c9596d6d8e9154b5f87c8e887bfabf7546b68af5Joe Onorato        if (contentsUnchanged && (orderUnchanged || isLastAnyway)) {
7983eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            if (DEBUG) Slog.d(TAG, "reusing notification for key: " + key);
7993eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            oldEntry.notification = notification;
8003eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            try {
8013eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                // Reapply the RemoteViews
802f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato                contentView.reapply(mContext, oldEntry.content);
8033eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                // update the contentIntent
8043eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                final PendingIntent contentIntent = notification.notification.contentIntent;
8053eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                if (contentIntent != null) {
8063eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    oldEntry.content.setOnClickListener(new NotificationClicker(contentIntent,
8073eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                                notification.pkg, notification.tag, notification.id));
808184498ce5a8d77e1d9c45693363829daaeef9611Joe Onorato                } else {
809184498ce5a8d77e1d9c45693363829daaeef9611Joe Onorato                    oldEntry.content.setOnClickListener(null);
8103eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                }
8113eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                // Update the icon.
8123eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
8133eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                        notification.notification.icon, notification.notification.iconLevel,
8146179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                        notification.notification.number,
8156179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                        notification.notification.tickerText);
8163eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                if (!oldEntry.icon.set(ic)) {
8173eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    handleNotificationError(key, notification, "Couldn't update icon: " + ic);
8183eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    return;
8193eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                }
82080a44401a22344f7eabce6976372ab144ef22893Joe Onorato                // Update the large icon
82180a44401a22344f7eabce6976372ab144ef22893Joe Onorato                if (notification.notification.largeIcon != null) {
82280a44401a22344f7eabce6976372ab144ef22893Joe Onorato                    oldEntry.largeIcon.setImageBitmap(notification.notification.largeIcon);
82380a44401a22344f7eabce6976372ab144ef22893Joe Onorato                } else {
82480a44401a22344f7eabce6976372ab144ef22893Joe Onorato                    oldEntry.largeIcon.getLayoutParams().width = 0;
82580a44401a22344f7eabce6976372ab144ef22893Joe Onorato                    oldEntry.largeIcon.setVisibility(View.INVISIBLE);
82680a44401a22344f7eabce6976372ab144ef22893Joe Onorato                }
82785babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller
8287ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler                if (key == mNotificationPeekKey) {
8297ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler                    // must update the peek window
8307ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler                    Message peekMsg = mHandler.obtainMessage(MSG_OPEN_NOTIFICATION_PEEK);
8317ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler                    peekMsg.arg1 = mNotificationPeekIndex;
8327ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler                    mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
8337ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler                    mHandler.sendMessage(peekMsg);
8347ef29b5a066e87ac890cf198c58e2ffe8549bea1Daniel Sandler                }
8353eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            }
8363eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            catch (RuntimeException e) {
8373eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                // It failed to add cleanly.  Log, and remove the view from the panel.
8383eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                Slog.w(TAG, "Couldn't reapply views for package " + contentView.getPackage(), e);
8393eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                removeNotificationViews(key);
8403eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                addNotificationViews(key, notification);
8413eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            }
8423eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        } else {
8433eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            if (DEBUG) Slog.d(TAG, "not reusing notification for key: " + key);
8443eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            removeNotificationViews(key);
8453eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            addNotificationViews(key, notification);
8463eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
84750ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        // fullScreenIntent doesn't happen on updates.  You need to clear & repost a new
84850ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        // notification.
84950ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        final boolean immersive = isImmersive();
85050ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        if (false && immersive) {
85150ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato            // TODO: immersive mode
85250ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        } else {
853eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato            tick(key, notification, false);
85450ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        }
8555dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato
8565dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato        setAreThereNotifications();
857808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
858808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
859808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void removeNotification(IBinder key) {
8603a2fdedf693cca9146af8fd463e20cca5a2d1e20Daniel Sandler        if (DEBUG) Slog.d(TAG, "removeNotification(" + key + ")");
8613eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        removeNotificationViews(key);
86250ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        mTicker.remove(key);
8635dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato        setAreThereNotifications();
864808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
865808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
8663e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler    public void showClock(boolean show) {
8673e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler        View clock = mBarContents.findViewById(R.id.clock);
8683e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler        View network_text = mBarContents.findViewById(R.id.network_text);
8693e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler        if (clock != null) {
8703e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler            clock.setVisibility(show ? View.VISIBLE : View.GONE);
8713e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler        }
8723e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler        if (network_text != null) {
8733e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler            network_text.setVisibility((!show) ? View.VISIBLE : View.GONE);
8743e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler        }
8753e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler    }
8763e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler
877808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void disable(int state) {
878091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato        int old = mDisabled;
879091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato        int diff = state ^ old;
880dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        mDisabled = state;
881dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
882091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato        // act accordingly
8833e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler        if ((diff & StatusBarManager.DISABLE_CLOCK) != 0) {
8843e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler            boolean show = (state & StatusBarManager.DISABLE_CLOCK) == 0;
885f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato            Slog.i(TAG, "DISABLE_CLOCK: " + (show ? "no" : "yes"));
8863e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler            showClock(show);
8873e8f5a2c1beb4b918856063880e05125946e4347Daniel Sandler        }
8886f6cf3c5e577aa62cfd959fa5ef046531090ce31Daniel Sandler        if ((diff & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) {
8896f6cf3c5e577aa62cfd959fa5ef046531090ce31Daniel Sandler            boolean show = (state & StatusBarManager.DISABLE_SYSTEM_INFO) == 0;
890f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato            Slog.i(TAG, "DISABLE_SYSTEM_INFO: " + (show ? "no" : "yes"));
8916f6cf3c5e577aa62cfd959fa5ef046531090ce31Daniel Sandler            mNotificationTrigger.setVisibility(show ? View.VISIBLE : View.GONE);
8926f6cf3c5e577aa62cfd959fa5ef046531090ce31Daniel Sandler        }
893dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) {
894dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            if ((state & StatusBarManager.DISABLE_EXPAND) != 0) {
895f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato                Slog.i(TAG, "DISABLE_EXPAND: yes");
896dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler                animateCollapse();
897dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            }
898dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        }
899dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
900282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler            mNotificationDNDMode = Prefs.read(mContext)
901282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                        .getBoolean(Prefs.DO_NOT_DISTURB_PREF, Prefs.DO_NOT_DISTURB_DEFAULT);
902282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler
903dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
904282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                Slog.i(TAG, "DISABLE_NOTIFICATION_ICONS: yes" + (mNotificationDNDMode?" (DND)":""));
905091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato                mTicker.halt();
906dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            } else {
907282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                Slog.i(TAG, "DISABLE_NOTIFICATION_ICONS: no" + (mNotificationDNDMode?" (DND)":""));
908dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            }
909282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler
910ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler            // refresh icons to show either notifications or the DND message
911ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler            reloadAllNotificationIcons();
912dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
913091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato            if ((state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
914ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato                mTicker.halt();
915dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            }
916dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        }
917091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato        if ((diff & StatusBarManager.DISABLE_NAVIGATION) != 0) {
918091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato            if ((state & StatusBarManager.DISABLE_NAVIGATION) != 0) {
919f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato                Slog.i(TAG, "DISABLE_NAVIGATION: yes");
92021eb86a5c464205155a9ea14486113055c2dffc9Daniel Sandler                mNavigationArea.setVisibility(View.INVISIBLE);
921b70c82dc45f62a1c257a80e7aa9e0ecfe063c1besatok                mInputMethodSwitchButton.setScreenLocked(true);
922dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            } else {
923f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato                Slog.i(TAG, "DISABLE_NAVIGATION: no");
924fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato                mNavigationArea.setVisibility(View.VISIBLE);
925b70c82dc45f62a1c257a80e7aa9e0ecfe063c1besatok                mInputMethodSwitchButton.setScreenLocked(false);
926dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            }
927dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        }
9286478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato        if ((diff & StatusBarManager.DISABLE_BACK) != 0) {
9296478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato            if ((state & StatusBarManager.DISABLE_BACK) != 0) {
9306478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato                Slog.i(TAG, "DISABLE_BACK: yes");
9316478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato                mBackButton.setVisibility(View.INVISIBLE);
9326478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato                mInputMethodSwitchButton.setScreenLocked(true);
9336478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato            } else {
9346478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato                Slog.i(TAG, "DISABLE_BACK: no");
9356478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato                mBackButton.setVisibility(View.VISIBLE);
9366478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato                mInputMethodSwitchButton.setScreenLocked(false);
9376478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato            }
9386478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato        }
9396478adc6b4c35f8c56176582bcde029998e7436fJoe Onorato
940dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler    }
941dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
942ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato    private boolean hasTicker(Notification n) {
94346439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato        return n.tickerView != null || !TextUtils.isEmpty(n.tickerText);
944ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato    }
945ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato
946eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato    private void tick(IBinder key, StatusBarNotification n, boolean firstTime) {
94755d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato        // Don't show the ticker when the windowshade is open.
9487c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato        if (mNotificationPanel.isShowing()) {
94955d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato            return;
95055d2d7646bf13bb5406bf01fd1bb96e58588570cJoe Onorato        }
951eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato        // If they asked for FLAG_ONLY_ALERT_ONCE, then only show this notification
952eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato        // if it's a new notification.
953eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato        if (!firstTime && (n.notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) {
954eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato            return;
955eeed9949835ae4d516a751f3254967e9ad7398a5Joe Onorato        }
956dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        // Show the ticker if one is requested. Also don't do this
957dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        // until status bar window is attached to the window manager,
958dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        // because...  well, what's the point otherwise?  And trying to
959dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        // run a ticker without being attached will crash!
960ef1e7763c2dc5b9bac69cc747efe05c81d9fd9fcJoe Onorato        if (hasTicker(n.notification) && mStatusBarView.getWindowToken() != null) {
961dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS
962dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler                            | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) {
96350ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato                mTicker.add(key, n);
9643b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                mFeedbackIconArea.setVisibility(View.GONE);
965dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            }
966dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        }
967dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler    }
968dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
969b8027d87d87fbf24a6091ef183e519157876df41Daniel Sandler    // called by TabletTicker when it's done with all queued ticks
970b8027d87d87fbf24a6091ef183e519157876df41Daniel Sandler    public void doneTicking() {
9713b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mFeedbackIconArea.setVisibility(View.VISIBLE);
972b8027d87d87fbf24a6091ef183e519157876df41Daniel Sandler    }
973b8027d87d87fbf24a6091ef183e519157876df41Daniel Sandler
974808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void animateExpand() {
97556a6d880125906df588e7a973085501d588b18ebDaniel Sandler        mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PEEK);
97656a6d880125906df588e7a973085501d588b18ebDaniel Sandler        mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
97756a6d880125906df588e7a973085501d588b18ebDaniel Sandler        mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK);
978b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PANEL);
979b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        mHandler.sendEmptyMessage(MSG_OPEN_NOTIFICATION_PANEL);
980808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    }
981808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato
982808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato    public void animateCollapse() {
983b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PANEL);
984b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PANEL);
98544c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller        mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
98644c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller        mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
98782beadfa067b1e286fa604f8d7960d769411c954satok        mHandler.removeMessages(MSG_CLOSE_INPUT_METHODS_PANEL);
98882beadfa067b1e286fa604f8d7960d769411c954satok        mHandler.sendEmptyMessage(MSG_CLOSE_INPUT_METHODS_PANEL);
9893b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mHandler.removeMessages(MSG_CLOSE_COMPAT_MODE_PANEL);
9903b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mHandler.sendEmptyMessage(MSG_CLOSE_COMPAT_MODE_PANEL);
99156a6d880125906df588e7a973085501d588b18ebDaniel Sandler        mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PEEK);
99256a6d880125906df588e7a973085501d588b18ebDaniel Sandler        mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK);
9939120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler    }
9949120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler
995fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    // called by StatusBar
99606e6630a462b6a5c04c319d781d64896778d351fDaniel Sandler    @Override
9979305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato    public void setLightsOn(boolean on) {
99859485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler        // Policy note: if the frontmost activity needs the menu key, we assume it is a legacy app
99959485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler        // that can't handle lights-out mode.
10000ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        if (mMenuButton.getVisibility() == View.VISIBLE) {
100159485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler            on = true;
100259485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler        }
10030ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        mHandler.removeMessages(MSG_HIDE_CHROME);
10040ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        mHandler.removeMessages(MSG_SHOW_CHROME);
10050ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        mHandler.sendEmptyMessage(on ? MSG_SHOW_CHROME : MSG_HIDE_CHROME);
10069305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato    }
10079305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato
10085c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler    public void topAppWindowChanged(boolean showMenu) {
1009e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler        if (DEBUG) {
10105c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler            Slog.d(TAG, (showMenu?"showing":"hiding") + " the MENU button");
1011e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler        }
10125c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler        mMenuButton.setVisibility(showMenu ? View.VISIBLE : View.GONE);
101359485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler
101459485d7442a175551fcb5eeee71820432df4ea7bDaniel Sandler        // See above re: lights-out policy for legacy apps.
10155c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler        if (showMenu) setLightsOn(true);
101645c0401a0647a5fdc5f37168463c14ad57c5644bDaniel Sandler
10173b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mCompatModeButton.refresh();
1018552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler        if (mCompatModeButton.getVisibility() == View.VISIBLE) {
1019552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler                showCompatibilityHelp();
1020ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn        } else {
1021ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn            hideCompatibilityHelp();
1022ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn            mCompatModePanel.closePanel();
1023552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler        }
1024552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler    }
1025552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler
1026552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler    private void showCompatibilityHelp() {
1027ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn        if (mCompatibilityHelpDialog != null) {
1028ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn            return;
1029ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn        }
1030ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn
1031ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn        mCompatibilityHelpDialog = View.inflate(mContext, R.layout.compat_mode_help, null);
1032ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn        View button = mCompatibilityHelpDialog.findViewById(R.id.button);
1033552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler
1034552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler        button.setOnClickListener(new View.OnClickListener() {
1035552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler            @Override
1036552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler            public void onClick(View v) {
1037ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn                hideCompatibilityHelp();
1038ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn                SharedPreferences.Editor editor = Prefs.edit(mContext);
1039ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn                editor.putBoolean(Prefs.SHOWN_COMPAT_MODE_HELP, true);
1040ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn                editor.apply();
1041552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler            }
1042552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler        });
1043552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler
1044f1dd26b6fda891adc575c563dadb19b3d941faa7Daniel Sandler        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
1045552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler                ViewGroup.LayoutParams.MATCH_PARENT,
1046552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler                ViewGroup.LayoutParams.MATCH_PARENT,
1047552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler                WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG,
1048552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
1049552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
1050552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler                    | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
1051552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler                PixelFormat.TRANSLUCENT);
1052552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler        lp.setTitle("CompatibilityModeDialog");
1053552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler        lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
1054552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler                | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
1055552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler        lp.windowAnimations = com.android.internal.R.style.Animation_ZoomButtons; // simple fade
1056552b1f0d22eea828cfd4f8c721cb5872a988ea7fDaniel Sandler
1057ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn        WindowManagerImpl.getDefault().addView(mCompatibilityHelpDialog, lp);
1058e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler    }
1059e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler
1060ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn    private void hideCompatibilityHelp() {
1061ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn        if (mCompatibilityHelpDialog != null) {
1062ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn            WindowManagerImpl.getDefault().removeView(mCompatibilityHelpDialog);
1063ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn            mCompatibilityHelpDialog = null;
1064ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn        }
1065ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn    }
1066ed31bbf65267c1f383dd0dff37acd034f3b9b59fDianne Hackborn
1067857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato    public void setImeWindowStatus(IBinder token, int vis, int backDisposition) {
1068857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato        mInputMethodSwitchButton.setImeWindowStatus(token,
1069857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                (vis & InputMethodService.IME_ACTIVE) != 0);
10705113382e95d5f5f322bc6618bef7d1c7f96e295fsatok        updateNotificationIcons();
1071913f42d26a32621ad7dd52c52b8d150eedf4f8fesatok        mInputMethodsPanel.setImeToken(token);
1072857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato        int res;
1073857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato        switch (backDisposition) {
1074857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato            case InputMethodService.BACK_DISPOSITION_WILL_NOT_DISMISS:
1075857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                res = R.drawable.ic_sysbar_back;
1076857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                break;
1077857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato            case InputMethodService.BACK_DISPOSITION_WILL_DISMISS:
1078857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                res = R.drawable.ic_sysbar_back_ime;
1079857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                break;
1080857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato            case InputMethodService.BACK_DISPOSITION_DEFAULT:
1081857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato            default:
1082857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                if ((vis & InputMethodService.IME_VISIBLE) != 0) {
1083857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                    res = R.drawable.ic_sysbar_back_ime;
1084857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                } else {
1085857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                    res = R.drawable.ic_sysbar_back;
1086857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                }
1087857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                break;
1088857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato        }
1089857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato        mBackButton.setImageResource(res);
109010163c689a713a35f69aad420c35372946b8b32aDaniel Sandler        if (FAKE_SPACE_BAR) {
1091857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato            mFakeSpaceBar.setVisibility(((vis & InputMethodService.IME_VISIBLE) != 0)
1092857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato                    ? View.VISIBLE : View.GONE);
109310163c689a713a35f69aad420c35372946b8b32aDaniel Sandler        }
109406487a58be22b100daf3f950b9a1d25c3ea42aa2satok    }
109506487a58be22b100daf3f950b9a1d25c3ea42aa2satok
10962992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    @Override
10972992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public void setHardKeyboardStatus(boolean available, boolean enabled) {
10982992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (DEBUG) {
10992992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            Slog.d(TAG, "Set hard keyboard status: available=" + available
11002992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                    + ", enabled=" + enabled);
11012992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
11022992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        mInputMethodSwitchButton.setHardKeyboardStatus(available);
11032992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        updateNotificationIcons();
11042992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        mInputMethodsPanel.setHardKeyboardStatus(available, enabled);
11052992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
11062992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
11072992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    @Override
11082992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public void onHardKeyboardEnabledChange(boolean enabled) {
11092992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        try {
11102992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mBarService.setHardKeyboardEnabled(enabled);
11112992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        } catch (RemoteException ex) {
11122992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
11132992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
11142992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
111550ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato    private boolean isImmersive() {
111650ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        try {
111750ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato            return ActivityManagerNative.getDefault().isTopActivityImmersive();
111850ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato            //Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive"));
111950ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        } catch (RemoteException ex) {
112050ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato            // the end is nigh
112150ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato            return false;
112250ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato        }
112350ec5ec0b8b3ab9cf697c8e3925e3fdd837f5e7dJoe Onorato    }
112485babff4a30d1baf8841749b706bd31dcaa1a73aJim Miller
11255dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato    private void setAreThereNotifications() {
1126ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler        final boolean hasClearable = mNotificationData.hasClearableItems();
11275dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato    }
11285dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato
1129f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    /**
1130f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato     * Cancel this notification and tell the status bar service about the failure. Hold no locks.
1131f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato     */
1132f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    void handleNotificationError(IBinder key, StatusBarNotification n, String message) {
1133f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        removeNotification(key);
1134f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        try {
1135f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato            mBarService.onNotificationError(n.pkg, n.tag, n.id, n.uid, n.initialPid, message);
1136f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        } catch (RemoteException ex) {
1137f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato            // The end is nigh.
1138f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        }
1139f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    }
1140f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato
114110163c689a713a35f69aad420c35372946b8b32aDaniel Sandler    private void sendKey(KeyEvent key) {
114210163c689a713a35f69aad420c35372946b8b32aDaniel Sandler        try {
114310163c689a713a35f69aad420c35372946b8b32aDaniel Sandler            if (DEBUG) Slog.d(TAG, "injecting key event: " + key);
114410163c689a713a35f69aad420c35372946b8b32aDaniel Sandler            mWindowManager.injectInputEventNoWait(key);
114510163c689a713a35f69aad420c35372946b8b32aDaniel Sandler        } catch (RemoteException ex) {
114610163c689a713a35f69aad420c35372946b8b32aDaniel Sandler        }
114710163c689a713a35f69aad420c35372946b8b32aDaniel Sandler    }
114810163c689a713a35f69aad420c35372946b8b32aDaniel Sandler
1149f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
1150f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        public void onClick(View v) {
1151fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato            if (v == mNotificationTrigger) {
1152f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato                onClickNotificationTrigger();
1153f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato            } else if (v == mRecentButton) {
1154f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato                onClickRecentButton();
115582beadfa067b1e286fa604f8d7960d769411c954satok            } else if (v == mInputMethodSwitchButton) {
115682beadfa067b1e286fa604f8d7960d769411c954satok                onClickInputMethodSwitchButton();
11573b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler            } else if (v == mCompatModeButton) {
11583b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                onClickCompatModeButton();
1159f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato            }
1160f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        }
1161f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    };
1162f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato
1163f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    public void onClickNotificationTrigger() {
1164b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler        if (DEBUG) Slog.d(TAG, "clicked notification icons; disabled=" + mDisabled);
1165091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato        if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) {
11663a2fdedf693cca9146af8fd463e20cca5a2d1e20Daniel Sandler            int msg = !mNotificationPanel.isShowing()
11673a2fdedf693cca9146af8fd463e20cca5a2d1e20Daniel Sandler                ? MSG_OPEN_NOTIFICATION_PANEL
11683a2fdedf693cca9146af8fd463e20cca5a2d1e20Daniel Sandler                : MSG_CLOSE_NOTIFICATION_PANEL;
11693a2fdedf693cca9146af8fd463e20cca5a2d1e20Daniel Sandler            mHandler.removeMessages(msg);
11703a2fdedf693cca9146af8fd463e20cca5a2d1e20Daniel Sandler            mHandler.sendEmptyMessage(msg);
1171091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato        }
11729120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler    }
11739120d55b806aec981ce7c1af20b7aa3d303ccca5Daniel Sandler
1174f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    public void onClickRecentButton() {
1175b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler        if (DEBUG) Slog.d(TAG, "clicked recent apps; disabled=" + mDisabled);
11763b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) {
11773b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka            int msg = (mRecentsPanel.getVisibility() == View.GONE)
11783b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                ? MSG_OPEN_RECENTS_PANEL
11793b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                : MSG_CLOSE_RECENTS_PANEL;
11803b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka            mHandler.removeMessages(msg);
11813b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka            mHandler.sendEmptyMessage(msg);
118244c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller        }
11833eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler    }
11843eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
118582beadfa067b1e286fa604f8d7960d769411c954satok    public void onClickInputMethodSwitchButton() {
118682beadfa067b1e286fa604f8d7960d769411c954satok        if (DEBUG) Slog.d(TAG, "clicked input methods panel; disabled=" + mDisabled);
118782beadfa067b1e286fa604f8d7960d769411c954satok        int msg = (mInputMethodsPanel.getVisibility() == View.GONE) ?
118882beadfa067b1e286fa604f8d7960d769411c954satok                MSG_OPEN_INPUT_METHODS_PANEL : MSG_CLOSE_INPUT_METHODS_PANEL;
118982beadfa067b1e286fa604f8d7960d769411c954satok        mHandler.removeMessages(msg);
119082beadfa067b1e286fa604f8d7960d769411c954satok        mHandler.sendEmptyMessage(msg);
119182beadfa067b1e286fa604f8d7960d769411c954satok    }
119282beadfa067b1e286fa604f8d7960d769411c954satok
11933b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler    public void onClickCompatModeButton() {
11943b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        int msg = (mCompatModePanel.getVisibility() == View.GONE) ?
11953b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler                MSG_OPEN_COMPAT_MODE_PANEL : MSG_CLOSE_COMPAT_MODE_PANEL;
11963b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mHandler.removeMessages(msg);
11973b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        mHandler.sendEmptyMessage(msg);
11983b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler    }
11993b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler
1200c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler    public NotificationClicker makeClicker(PendingIntent intent, String pkg, String tag, int id) {
1201c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler        return new NotificationClicker(intent, pkg, tag, id);
1202c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler    }
1203c51451a318af8e7076e7789bc1fcd91454f1e5a9Daniel Sandler
12043eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler    private class NotificationClicker implements View.OnClickListener {
12053eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        private PendingIntent mIntent;
12063eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        private String mPkg;
12073eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        private String mTag;
12083eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        private int mId;
12093eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
12103eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        NotificationClicker(PendingIntent intent, String pkg, String tag, int id) {
12113eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            mIntent = intent;
12123eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            mPkg = pkg;
12133eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            mTag = tag;
12143eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            mId = id;
12153eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
12163eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
12173eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        public void onClick(View v) {
12183eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            try {
12193eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                // The intent we are sending is for the application, which
12203eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                // won't have permission to immediately start an activity after
12213eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                // the user switches to home.  We know it is safe to do at this
12223eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                // point, so make sure new activity switches are now allowed.
12233eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                ActivityManagerNative.getDefault().resumeAppSwitches();
12243eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            } catch (RemoteException e) {
12253eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            }
12263eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
12273eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            if (mIntent != null) {
12283eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                int[] pos = new int[2];
12293eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                v.getLocationOnScreen(pos);
12303eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                Intent overlay = new Intent();
12313eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                overlay.setSourceBounds(
12323eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                        new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight()));
12333eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                try {
1234f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato                    mIntent.send(mContext, 0, overlay);
12353eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                } catch (PendingIntent.CanceledException e) {
12363eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    // the stack trace isn't very helpful here.  Just log the exception message.
12373eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    Slog.w(TAG, "Sending contentIntent failed: " + e);
12383eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                }
12393eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            }
12403eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
12413eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            try {
12423eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                mBarService.onNotificationClick(mPkg, mTag, mId);
12433eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            } catch (RemoteException ex) {
12443eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                // system process is dead if we're here.
12453eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            }
12463eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
12473eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            // close the shade if it was open
12483eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            animateCollapse();
12493eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
12503eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            // If this click was on the intruder alert, hide that instead
12513eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler//            mHandler.sendEmptyMessage(MSG_HIDE_INTRUDER);
12523eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
12533eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler    }
12543eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
12553eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler    StatusBarNotification removeNotificationViews(IBinder key) {
1256ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler        NotificationData.Entry entry = mNotificationData.remove(key);
12573eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        if (entry == null) {
12583eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            Slog.w(TAG, "removeNotification for unknown key: " + key);
12593eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            return null;
12603eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
12613eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // Remove the expanded view.
12623eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        ViewGroup rowParent = (ViewGroup)entry.row.getParent();
12633eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        if (rowParent != null) rowParent.removeView(entry.row);
1264a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler
1265a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler        if (key == mNotificationPeekKey) {
1266a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler            // must close the peek as well, since it's gone
1267a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler            mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK);
1268a8e5b060a6ec5a5807f2858eccec835c7b083067Daniel Sandler        }
12693eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // Remove the icon.
12700f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler//        ViewGroup iconParent = (ViewGroup)entry.icon.getParent();
12710f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler//        if (iconParent != null) iconParent.removeView(entry.icon);
12720ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        updateNotificationIcons();
12733eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
12743eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        return entry.notification;
12753eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler    }
12763eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
127756a6d880125906df588e7a973085501d588b18ebDaniel Sandler    private class NotificationTriggerTouchListener implements View.OnTouchListener {
127856a6d880125906df588e7a973085501d588b18ebDaniel Sandler        VelocityTracker mVT;
127956a6d880125906df588e7a973085501d588b18ebDaniel Sandler        float mInitialTouchX, mInitialTouchY;
128056a6d880125906df588e7a973085501d588b18ebDaniel Sandler        int mTouchSlop;
128156a6d880125906df588e7a973085501d588b18ebDaniel Sandler
128256a6d880125906df588e7a973085501d588b18ebDaniel Sandler        public NotificationTriggerTouchListener() {
128356a6d880125906df588e7a973085501d588b18ebDaniel Sandler            mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
128456a6d880125906df588e7a973085501d588b18ebDaniel Sandler        }
128556a6d880125906df588e7a973085501d588b18ebDaniel Sandler
128656a6d880125906df588e7a973085501d588b18ebDaniel Sandler        public boolean onTouch(View v, MotionEvent event) {
128756a6d880125906df588e7a973085501d588b18ebDaniel Sandler//            Slog.d(TAG, String.format("touch: (%.1f, %.1f) initial: (%.1f, %.1f)",
128856a6d880125906df588e7a973085501d588b18ebDaniel Sandler//                        event.getX(),
128956a6d880125906df588e7a973085501d588b18ebDaniel Sandler//                        event.getY(),
129056a6d880125906df588e7a973085501d588b18ebDaniel Sandler//                        mInitialTouchX,
129156a6d880125906df588e7a973085501d588b18ebDaniel Sandler//                        mInitialTouchY));
129256a6d880125906df588e7a973085501d588b18ebDaniel Sandler            final int action = event.getAction();
129356a6d880125906df588e7a973085501d588b18ebDaniel Sandler            switch (action) {
129456a6d880125906df588e7a973085501d588b18ebDaniel Sandler                case MotionEvent.ACTION_DOWN:
129556a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    mVT = VelocityTracker.obtain();
129656a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    mInitialTouchX = event.getX();
129756a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    mInitialTouchY = event.getY();
129856a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    // fall through
129956a6d880125906df588e7a973085501d588b18ebDaniel Sandler                case MotionEvent.ACTION_OUTSIDE:
130056a6d880125906df588e7a973085501d588b18ebDaniel Sandler                case MotionEvent.ACTION_MOVE:
130156a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    // check for fling
130256a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    if (mVT != null) {
130356a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        mVT.addMovement(event);
130456a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        mVT.computeCurrentVelocity(1000); // pixels per second
130556a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        // require a little more oomph once we're already in peekaboo mode
130656a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        if (mVT.getYVelocity() < -mNotificationFlingVelocity) {
130756a6d880125906df588e7a973085501d588b18ebDaniel Sandler                            animateExpand();
130856a6d880125906df588e7a973085501d588b18ebDaniel Sandler                            mVT.recycle();
130956a6d880125906df588e7a973085501d588b18ebDaniel Sandler                            mVT = null;
131056a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        }
131156a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    }
131256a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    return true;
131356a6d880125906df588e7a973085501d588b18ebDaniel Sandler                case MotionEvent.ACTION_UP:
131456a6d880125906df588e7a973085501d588b18ebDaniel Sandler                case MotionEvent.ACTION_CANCEL:
131556a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    if (mVT != null) {
131656a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        if (action == MotionEvent.ACTION_UP
131756a6d880125906df588e7a973085501d588b18ebDaniel Sandler                         // was this a sloppy tap?
13189f0f0e0e3100caec459a5b5ef836317844c83b3fJim Miller                         && Math.abs(event.getX() - mInitialTouchX) < mTouchSlop
131956a6d880125906df588e7a973085501d588b18ebDaniel Sandler                         && Math.abs(event.getY() - mInitialTouchY) < (mTouchSlop / 3)
132056a6d880125906df588e7a973085501d588b18ebDaniel Sandler                         // dragging off the bottom doesn't count
132156a6d880125906df588e7a973085501d588b18ebDaniel Sandler                         && (int)event.getY() < v.getBottom()) {
132256a6d880125906df588e7a973085501d588b18ebDaniel Sandler                            animateExpand();
1323aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                            v.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
1324aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                            v.playSoundEffect(SoundEffectConstants.CLICK);
132556a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        }
132656a6d880125906df588e7a973085501d588b18ebDaniel Sandler
132756a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        mVT.recycle();
132856a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        mVT = null;
132956a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        return true;
133056a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    }
133156a6d880125906df588e7a973085501d588b18ebDaniel Sandler            }
133256a6d880125906df588e7a973085501d588b18ebDaniel Sandler            return false;
133356a6d880125906df588e7a973085501d588b18ebDaniel Sandler        }
133456a6d880125906df588e7a973085501d588b18ebDaniel Sandler    }
133556a6d880125906df588e7a973085501d588b18ebDaniel Sandler
1336663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler    final static int NOTIFICATION_PEEK_HOLD_THRESH = 200; // ms
1337663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler    final static int NOTIFICATION_PEEK_FADE_DELAY = 3000; // ms
1338663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler
1339663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler    public void resetNotificationPeekFadeTimer() {
1340663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler        if (DEBUG) {
1341663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler            Slog.d(TAG, "setting peek fade timer for " + NOTIFICATION_PEEK_FADE_DELAY
1342663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler                + "ms from now");
1343663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler        }
1344663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler        mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PEEK);
1345663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler        mHandler.sendEmptyMessageDelayed(MSG_CLOSE_NOTIFICATION_PEEK,
1346663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler                NOTIFICATION_PEEK_FADE_DELAY);
1347663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler    }
134856a6d880125906df588e7a973085501d588b18ebDaniel Sandler
1349663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler    private class NotificationIconTouchListener implements View.OnTouchListener {
1350b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        VelocityTracker mVT;
135156a6d880125906df588e7a973085501d588b18ebDaniel Sandler        int mPeekIndex;
135256a6d880125906df588e7a973085501d588b18ebDaniel Sandler        float mInitialTouchX, mInitialTouchY;
135356a6d880125906df588e7a973085501d588b18ebDaniel Sandler        int mTouchSlop;
1354b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1355b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        public NotificationIconTouchListener() {
135656a6d880125906df588e7a973085501d588b18ebDaniel Sandler            mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
1357b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        }
1358b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1359b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        public boolean onTouch(View v, MotionEvent event) {
1360b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            boolean peeking = mNotificationPeekWindow.getVisibility() != View.GONE;
13617c270fab75c2f4529e45ea80b31d4017ab516482Joe Onorato            boolean panelShowing = mNotificationPanel.isShowing();
1362b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            if (panelShowing) return false;
1363b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
136456a6d880125906df588e7a973085501d588b18ebDaniel Sandler            int numIcons = mIconLayout.getChildCount();
136556a6d880125906df588e7a973085501d588b18ebDaniel Sandler            int newPeekIndex = (int)(event.getX() * numIcons / mIconLayout.getWidth());
136656a6d880125906df588e7a973085501d588b18ebDaniel Sandler            if (newPeekIndex > numIcons - 1) newPeekIndex = numIcons - 1;
136756a6d880125906df588e7a973085501d588b18ebDaniel Sandler            else if (newPeekIndex < 0) newPeekIndex = 0;
136856a6d880125906df588e7a973085501d588b18ebDaniel Sandler
136956a6d880125906df588e7a973085501d588b18ebDaniel Sandler            final int action = event.getAction();
137056a6d880125906df588e7a973085501d588b18ebDaniel Sandler            switch (action) {
1371b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                case MotionEvent.ACTION_DOWN:
1372b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    mVT = VelocityTracker.obtain();
137356a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    mInitialTouchX = event.getX();
137456a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    mInitialTouchY = event.getY();
137556a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    mPeekIndex = -1;
1376b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1377b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    // fall through
1378b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                case MotionEvent.ACTION_OUTSIDE:
1379b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                case MotionEvent.ACTION_MOVE:
1380b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    // peek and switch icons if necessary
1381b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
138256a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    if (newPeekIndex != mPeekIndex) {
138356a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        mPeekIndex = newPeekIndex;
138456a6d880125906df588e7a973085501d588b18ebDaniel Sandler
138556a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        if (DEBUG) Slog.d(TAG, "will peek at notification #" + mPeekIndex);
1386b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        Message peekMsg = mHandler.obtainMessage(MSG_OPEN_NOTIFICATION_PEEK);
138756a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        peekMsg.arg1 = mPeekIndex;
1388b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1389b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
1390b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
139156a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        if (peeking) {
139256a6d880125906df588e7a973085501d588b18ebDaniel Sandler                            // no delay if we're scrubbing left-right
139356a6d880125906df588e7a973085501d588b18ebDaniel Sandler                            mHandler.sendMessage(peekMsg);
139456a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        } else {
139556a6d880125906df588e7a973085501d588b18ebDaniel Sandler                            // wait for fling
139656a6d880125906df588e7a973085501d588b18ebDaniel Sandler                            mHandler.sendMessageDelayed(peekMsg, NOTIFICATION_PEEK_HOLD_THRESH);
139756a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        }
1398b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    }
1399b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1400b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    // check for fling
1401b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    if (mVT != null) {
1402b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        mVT.addMovement(event);
140356a6d880125906df588e7a973085501d588b18ebDaniel Sandler                        mVT.computeCurrentVelocity(1000); // pixels per second
1404b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        // require a little more oomph once we're already in peekaboo mode
1405b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        if (!panelShowing && (
1406b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                               (peeking && mVT.getYVelocity() < -mNotificationFlingVelocity*3)
1407b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            || (mVT.getYVelocity() < -mNotificationFlingVelocity))) {
1408b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
1409b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PANEL);
1410b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK);
1411b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                            mHandler.sendEmptyMessage(MSG_OPEN_NOTIFICATION_PANEL);
1412b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                        }
1413b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    }
1414b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    return true;
1415b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                case MotionEvent.ACTION_UP:
1416b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                case MotionEvent.ACTION_CANCEL:
1417b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
1418aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                    if (!peeking) {
1419aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                        if (action == MotionEvent.ACTION_UP
1420aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                                // was this a sloppy tap?
14219f0f0e0e3100caec459a5b5ef836317844c83b3fJim Miller                                && Math.abs(event.getX() - mInitialTouchX) < mTouchSlop
1422aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                                && Math.abs(event.getY() - mInitialTouchY) < (mTouchSlop / 3)
1423aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                                // dragging off the bottom doesn't count
1424aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                                && (int)event.getY() < v.getBottom()) {
1425aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                            Message peekMsg = mHandler.obtainMessage(MSG_OPEN_NOTIFICATION_PEEK);
1426aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                            peekMsg.arg1 = mPeekIndex;
1427aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                            mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
1428aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                            mHandler.sendMessage(peekMsg);
1429aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler
1430aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                            v.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
1431aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                            v.playSoundEffect(SoundEffectConstants.CLICK);
1432aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler
1433aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                            peeking = true; // not technically true yet, but the next line will run
1434aa051d66afa791872bfe362a94765dece07cd4c5Daniel Sandler                        }
143556a6d880125906df588e7a973085501d588b18ebDaniel Sandler                    }
143656a6d880125906df588e7a973085501d588b18ebDaniel Sandler
1437b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    if (peeking) {
1438663f0f2da9fd57916d5c575a264d8afe7743eb4aDaniel Sandler                        resetNotificationPeekFadeTimer();
1439b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    }
144056a6d880125906df588e7a973085501d588b18ebDaniel Sandler
1441b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    mVT.recycle();
1442b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    mVT = null;
1443b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                    return true;
1444b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            }
1445b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            return false;
1446b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        }
1447b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler    }
1448b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
14493eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler    StatusBarIconView addNotificationViews(IBinder key, StatusBarNotification notification) {
1450dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        if (DEBUG) {
1451dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler            Slog.d(TAG, "addNotificationViews(key=" + key + ", notification=" + notification);
1452dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        }
14533eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // Construct the icon.
1454f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        final StatusBarIconView iconView = new StatusBarIconView(mContext,
14556179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                notification.pkg + "/0x" + Integer.toHexString(notification.id),
14566179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                notification.notification);
14573eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
14583eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
14593eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
14603eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    notification.notification.icon,
14613eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    notification.notification.iconLevel,
14626179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                    notification.notification.number,
14636179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                    notification.notification.tickerText);
14643eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        if (!iconView.set(ic)) {
14653eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            handleNotificationError(key, notification, "Couldn't attach StatusBarIcon: " + ic);
14663eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            return null;
14673eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
14683eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // Construct the expanded view.
14693eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        NotificationData.Entry entry = new NotificationData.Entry(key, notification, iconView);
1470dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        if (!inflateViews(entry, mPile)) {
14713eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            handleNotificationError(key, notification, "Couldn't expand RemoteViews for: "
14723eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                    + notification);
14733eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            return null;
14743eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
1475b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
14763eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // Add the icon.
1477ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler        int pos = mNotificationData.add(entry);
1478a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler        if (DEBUG) {
1479a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler            Slog.d(TAG, "addNotificationViews: added at " + pos);
1480a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler        }
14810ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        updateNotificationIcons();
14820f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler
14833eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        return iconView;
14843eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler    }
14853eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
14860ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    private void reloadAllNotificationIcons() {
14870ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        if (mIconLayout == null) return;
14880ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        mIconLayout.removeAllViews();
14890ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        updateNotificationIcons();
14900ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    }
14910ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
14920ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler    private void updateNotificationIcons() {
14930f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler        // XXX: need to implement a new limited linear layout class
14940f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler        // to avoid removing & readding everything
1495dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
14960ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler        if (mIconLayout == null) return;
14970ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler
1498282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler        // first, populate the main notification panel
1499282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler        loadNotificationPanel();
1500282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler
1501b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        final LinearLayout.LayoutParams params
1502dc10030581d6eec1c96acd62ed511f91d25d73a1Joe Onorato            = new LinearLayout.LayoutParams(mIconSize + 2*mIconHPadding, mNaturalBarHeight);
1503b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1504ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler        // alternate behavior in DND mode
1505282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler        if (mNotificationDNDMode) {
1506282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler            if (mIconLayout.getChildCount() == 0) {
1507282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                final Notification dndNotification = new Notification.Builder(mContext)
1508282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                    .setContentTitle(mContext.getText(R.string.notifications_off_title))
1509282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                    .setContentText(mContext.getText(R.string.notifications_off_text))
1510282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                    .setSmallIcon(R.drawable.ic_notification_dnd)
1511282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                    .setOngoing(true)
1512282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                    .getNotification();
1513282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler
15146179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                final StatusBarIconView iconView = new StatusBarIconView(mContext, "_dnd",
15156179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                        dndNotification);
15166179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                iconView.setImageResource(R.drawable.ic_notification_dnd);
15176179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
15186179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                iconView.setPadding(mIconHPadding, 0, mIconHPadding, 0);
15196179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov
1520282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                mNotificationDNDDummyEntry = new NotificationData.Entry(
1521282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                        null,
1522282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                        new StatusBarNotification("", 0, "", 0, 0, dndNotification),
1523282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                        iconView);
1524282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler
1525282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler                mIconLayout.addView(iconView, params);
1526282ff9ae3f798dec325ce6b868f053649b596a8cDaniel Sandler            }
1527ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler
1528ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler            return;
1529ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler        }
1530ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler
1531ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler        int N = mNotificationData.size();
1532dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
1533dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        if (DEBUG) {
1534b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            Slog.d(TAG, "refreshing icons: " + N + " notifications, mIconLayout=" + mIconLayout);
1535dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        }
1536dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
1537b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        ArrayList<View> toShow = new ArrayList<View>();
1538b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
15393b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        // Extra Special Icons
15403b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        // The IME switcher and compatibility mode icons take the place of notifications. You didn't
15413b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        // need to see all those new emails, did you?
15423b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        int maxNotificationIconsCount = mMaxNotificationIcons;
15433b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        if (mInputMethodSwitchButton.getVisibility() != View.GONE) maxNotificationIconsCount --;
15443b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler        if (mCompatModeButton.getVisibility()        != View.GONE) maxNotificationIconsCount --;
15453b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler
154682beadfa067b1e286fa604f8d7960d769411c954satok        for (int i=0; i< maxNotificationIconsCount; i++) {
15470f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler            if (i>=N) break;
1548ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler            toShow.add(mNotificationData.get(N-i-1).icon);
15490f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler        }
1550dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler
1551b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        ArrayList<View> toRemove = new ArrayList<View>();
1552b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        for (int i=0; i<mIconLayout.getChildCount(); i++) {
1553b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            View child = mIconLayout.getChildAt(i);
1554b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            if (!toShow.contains(child)) {
1555b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                toRemove.add(child);
1556b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            }
1557b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        }
1558b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1559b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        for (View remove : toRemove) {
1560b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            mIconLayout.removeView(remove);
1561dfa08db1652585a8cf27f929371c7ca6bf18ca60Daniel Sandler        }
1562271ea12dc29ad30009df785f21f6782ec29844c8Daniel Sandler
1563b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        for (int i=0; i<toShow.size(); i++) {
1564b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            View v = toShow.get(i);
15650ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler            v.setPadding(mIconHPadding, 0, mIconHPadding, 0);
1566b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            if (v.getParent() == null) {
15670ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandler                mIconLayout.addView(v, i, params);
1568b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            }
1569b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        }
15700f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler    }
15710f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler
1572b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler    private void loadNotificationPanel() {
1573ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler        int N = mNotificationData.size();
1574b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1575b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        ArrayList<View> toShow = new ArrayList<View>();
1576b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1577b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        for (int i=0; i<N; i++) {
1578ce6ff6403428069004e53651ea3b870a6bc67bb4Daniel Sandler            View row = mNotificationData.get(N-i-1).row;
1579b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            toShow.add(row);
1580b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        }
1581b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1582b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        ArrayList<View> toRemove = new ArrayList<View>();
1583b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        for (int i=0; i<mPile.getChildCount(); i++) {
1584b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            View child = mPile.getChildAt(i);
1585b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            if (!toShow.contains(child)) {
1586b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler                toRemove.add(child);
1587b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            }
1588b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        }
1589b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1590b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        for (View remove : toRemove) {
1591b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            mPile.removeView(remove);
1592b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        }
1593b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
1594b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        for (int i=0; i<toShow.size(); i++) {
1595b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            View v = toShow.get(i);
1596b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            if (v.getParent() == null) {
1597a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler                mPile.addView(v, N-1-i); // the notification panel has newest at the bottom
1598b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler            }
1599b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler        }
160040c1545d7231c856a1144a317e044ffa921448d8Daniel Sandler
160140c1545d7231c856a1144a317e044ffa921448d8Daniel Sandler        mNotificationPanel.setNotificationCount(N);
1602b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler    }
1603b0cc50de14dc9e2d0d224803bb523aa7f48904acDaniel Sandler
16044daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato    void workAroundBadLayerDrawableOpacity(View v) {
16054daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato        LayerDrawable d = (LayerDrawable)v.getBackground();
1606f844dc4fa8ae53d485f10ebc7f91899159d7551eDaniel Sandler        if (d == null) return;
16074daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato        v.setBackgroundDrawable(null);
16084daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato        d.setOpacity(PixelFormat.TRANSLUCENT);
16094daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato        v.setBackgroundDrawable(d);
16104daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato    }
16114daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato
16123eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler    private boolean inflateViews(NotificationData.Entry entry, ViewGroup parent) {
16133eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        StatusBarNotification sbn = entry.notification;
16143eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        RemoteViews remoteViews = sbn.notification.contentView;
16153eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        if (remoteViews == null) {
16163eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            return false;
16173eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
16183eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
16193eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // create the row view
1620f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(
1621f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato                Context.LAYOUT_INFLATER_SERVICE);
1622755cc74e4cebdf67d21a2477512a4ac9b01e8323Joe Onorato        View row = inflater.inflate(R.layout.status_bar_notification_row, parent, false);
16234daaeafd278d22ec9013d1cdaade562044ee907eJoe Onorato        workAroundBadLayerDrawableOpacity(row);
16240f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler        View vetoButton = row.findViewById(R.id.veto);
1625a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato        if (entry.notification.isClearable()) {
1626a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato            final String _pkg = sbn.pkg;
1627a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato            final String _tag = sbn.tag;
1628a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato            final int _id = sbn.id;
162944c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller            vetoButton.setOnClickListener(new View.OnClickListener() {
1630a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato                    public void onClick(View v) {
1631a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato                        try {
1632a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato                            mBarService.onNotificationClear(_pkg, _tag, _id);
1633a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato                        } catch (RemoteException ex) {
1634a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato                            // system process is dead if we're here.
1635a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato                        }
16360f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler                    }
1637a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato                });
1638a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato        } else {
1639100748e32898f0ce7398faa3b0218718fb9142e4Joe Onorato            if ((sbn.notification.flags & Notification.FLAG_ONGOING_EVENT) == 0) {
1640100748e32898f0ce7398faa3b0218718fb9142e4Joe Onorato                vetoButton.setVisibility(View.INVISIBLE);
16416179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                vetoButton.setContentDescription("VETO");
1642100748e32898f0ce7398faa3b0218718fb9142e4Joe Onorato            } else {
1643100748e32898f0ce7398faa3b0218718fb9142e4Joe Onorato                vetoButton.setVisibility(View.GONE);
1644100748e32898f0ce7398faa3b0218718fb9142e4Joe Onorato            }
1645a4a6503d30ed21402847dbd25849ba2dc68a1369Joe Onorato        }
16466179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        vetoButton.setContentDescription(mContext.getString(
16476179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                R.string.accessibility_remove_notification));
16483eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
1649561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        // the large icon
1650561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        ImageView largeIcon = (ImageView)row.findViewById(R.id.large_icon);
1651561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        if (sbn.notification.largeIcon != null) {
1652561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            largeIcon.setImageBitmap(sbn.notification.largeIcon);
16536179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov            largeIcon.setContentDescription(sbn.notification.tickerText);
1654561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        } else {
1655561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            largeIcon.getLayoutParams().width = 0;
1656561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato            largeIcon.setVisibility(View.INVISIBLE);
1657561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato        }
16586179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        largeIcon.setContentDescription(sbn.notification.tickerText);
1659561d3858bb9409b999a19f7ba93f0b12e1db835fJoe Onorato
16603eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // bind the click event to the content area
16613eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        ViewGroup content = (ViewGroup)row.findViewById(R.id.content);
16623eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        // XXX: update to allow controls within notification views
16633eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        content.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
16643eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler//        content.setOnFocusChangeListener(mFocusChangeListener);
16653eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        PendingIntent contentIntent = sbn.notification.contentIntent;
16663eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        if (contentIntent != null) {
16673eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            content.setOnClickListener(new NotificationClicker(contentIntent,
16683eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler                        sbn.pkg, sbn.tag, sbn.id));
1669184498ce5a8d77e1d9c45693363829daaeef9611Joe Onorato        } else {
1670184498ce5a8d77e1d9c45693363829daaeef9611Joe Onorato            content.setOnClickListener(null);
16713eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
16723eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
16733eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        View expanded = null;
16743eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        Exception exception = null;
16753eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        try {
1676f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato            expanded = remoteViews.apply(mContext, content);
16773eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
16783eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        catch (RuntimeException e) {
16793eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            exception = e;
16803eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
16813eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        if (expanded == null) {
168246439cec0eb0da4d0f853f2d8712d0c00c98475bJoe Onorato            final String ident = sbn.pkg + "/0x" + Integer.toHexString(sbn.id);
16833eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            Slog.e(TAG, "couldn't inflate view for notification " + ident, exception);
16843eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            return false;
16853eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        } else {
16863eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            content.addView(expanded);
16873eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            row.setDrawingCacheEnabled(true);
16883eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
16893eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
16903eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        entry.row = row;
16913eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        entry.content = content;
16923eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        entry.expanded = expanded;
169380a44401a22344f7eabce6976372ab144ef22893Joe Onorato        entry.largeIcon = largeIcon;
16943eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
16953eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        return true;
16963eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler    }
1697ce70d91844d2e4fb987617d2924ae5b73096e5c3Daniel Sandler
16981d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler    public void userActivity() {
16991d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler    }
17001d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler
17013b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka    public void toggleRecentApps() {
17023b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        int msg = (mRecentsPanel.getVisibility() == View.GONE)
17033b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                ? MSG_OPEN_RECENTS_PANEL : MSG_CLOSE_RECENTS_PANEL;
17043b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        mHandler.removeMessages(msg);
17053b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        mHandler.sendEmptyMessage(msg);
17063b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka    }
17073b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka
1708b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato    public class TouchOutsideListener implements View.OnTouchListener {
1709b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        private int mMsg;
1710ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato        private StatusBarPanel mPanel;
1711b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato
1712ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato        public TouchOutsideListener(int msg, StatusBarPanel panel) {
1713b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato            mMsg = msg;
1714ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato            mPanel = panel;
1715b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        }
1716b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato
1717b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        public boolean onTouch(View v, MotionEvent ev) {
1718ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato            final int action = ev.getAction();
1719ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato            if (action == MotionEvent.ACTION_OUTSIDE
1720ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato                    || (action == MotionEvent.ACTION_DOWN
1721ddf680bff5bb9bc04ef04667644db8ade0b38c46Joe Onorato                        && !mPanel.isInContentArea((int)ev.getX(), (int)ev.getY()))) {
1722b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato                mHandler.removeMessages(mMsg);
1723b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato                mHandler.sendEmptyMessage(mMsg);
1724b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato                return true;
1725b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato            }
1726b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato            return false;
1727b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato        }
1728b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato    }
1729091e1b8a86d34d2d51d2a5f7ae3cd903925fa5bfJoe Onorato
1730f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1731f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        pw.print("mDisabled=0x");
1732f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato        pw.println(Integer.toHexString(mDisabled));
1733933464dd02e9aeaff7944a2c8e3e44942971e1e8Joe Onorato        pw.println("mNetworkController:");
1734933464dd02e9aeaff7944a2c8e3e44942971e1e8Joe Onorato        mNetworkController.dump(fd, pw, args);
1735f3c3c4fd14cb4185ec6df5a4355aab8b9f4039dcJoe Onorato    }
1736808182dc874e93582da38d013a4a790d6bc08fc9Joe Onorato}
1737d39e388e6d7f19d6e8d620e449af4124efab1d0dDaniel Sandler
1738d39e388e6d7f19d6e8d620e449af4124efab1d0dDaniel Sandler
1739