19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.status; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.util.CharSequences; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2295fc68f24a2a93e5664e2234abcfe479d385cc05Dianne Hackbornimport android.app.ActivityManagerNative; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Dialog; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IStatusBar; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.StatusBarManager; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat; 3419a4157ce40f4ab77b60445b8e73069c5877bb8aJoe Onoratoimport android.graphics.Rect; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Telephony; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Display; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.VelocityTracker; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.LinearLayout; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.RemoteViews; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ScrollView; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView; 62105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectimport android.widget.FrameLayout; 63105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The public (ok, semi-public) service for the status bar. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This interesting thing to note about this class is that most of the methods that 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are called from other classes just post a message, and everything else is batched 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and coalesced into a series of calls to methods that all start with "perform." 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are two reasons for this. The first is that some of the methods (activate/deactivate) 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are on IStatusBar, so they're called from the thread pool and they need to make their 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * way onto the UI thread. The second is that the message queue is stopped while animations 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are happening in order to make for smoother transitions. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each icon is either an icon or an icon and a notification. They're treated mostly 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * separately throughout the code, although they both use the same key, which is assigned 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when they are created. 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class StatusBarService extends IStatusBar.Stub 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String TAG = "StatusBar"; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean SPEW = false; 90df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int EXPANDED_LEAVE_ALONE = -10000; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int EXPANDED_FULL_OPEN = -10001; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MSG_ANIMATE = 1000; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MSG_ANIMATE_REVEAL = 1001; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int OP_ADD_ICON = 1; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int OP_UPDATE_ICON = 2; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int OP_REMOVE_ICON = 3; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int OP_SET_VISIBLE = 4; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int OP_EXPAND = 5; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int OP_TOGGLE = 6; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int OP_DISABLE = 7; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class PendingOp { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder key; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IconData iconData; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotificationData notificationData; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean visible; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int integer; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class DisableRecord implements IBinder.DeathRecipient { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int what; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "binder died for pkg=" + pkg); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disable(0, token, pkg); 121fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu token.unlinkToDeath(this, 0); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface NotificationCallbacks { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onSetDisabled(int status); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onClearAll(); 1286ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana void onNotificationClick(String pkg, String tag, int id); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onPanelRevealed(); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ExpandedDialog extends Dialog { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExpandedDialog(Context context) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, com.android.internal.R.style.Theme_Light_NoTitleBar); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean dispatchKeyEvent(KeyEvent event) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean down = event.getAction() == KeyEvent.ACTION_DOWN; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (event.getKeyCode()) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_BACK: 142486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato if (!down) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarService.this.deactivate(); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.dispatchKeyEvent(event); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context mContext; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Display mDisplay; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarView mStatusBarView; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mPixelFormat; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project H mHandler = new H(); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<PendingOp> mQueue = new ArrayList<PendingOp>(); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotificationCallbacks mNotificationCallbacks; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All accesses to mIconMap and mNotificationData are syncronized on those objects, 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // but this is only so dump() can work correctly. Modifying these outside of the UI 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // thread will not work, there are places in the code that unlock and reaquire between 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // reads and require them to not be modified. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // icons 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HashMap<IBinder,StatusBarIcon> mIconMap = new HashMap<IBinder,StatusBarIcon>(); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<StatusBarIcon> mIconList = new ArrayList<StatusBarIcon>(); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] mRightIconSlots; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarIcon[] mRightIcons; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout mIcons; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IconMerger mNotificationIcons; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout mStatusIcons; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarIcon mMoreIcon; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private UninstallReceiver mUninstallReceiver; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // expanded notifications 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotificationViewList mNotificationData = new NotificationViewList(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Dialog mExpandedDialog; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExpandedView mExpandedView; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams mExpandedParams; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ScrollView mScrollView; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View mNotificationLinearLayout; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView mOngoingTitle; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout mOngoingItems; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView mLatestTitle; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout mLatestItems; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView mNoNotificationsTitle; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView mSpnLabel; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView mPlmnLabel; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView mClearButton; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CloseDragHandle mCloseView; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] mCloseLocation = new int[2]; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mExpanded; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mExpandedVisible; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the date view 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DateView mDateView; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the tracker view 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TrackingView mTrackingView; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams mTrackingParams; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mTrackingPosition; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ticker 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Ticker mTicker; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View mTickerView; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mTicking; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Tracking finger for opening/closing. 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mTracking; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VelocityTracker mVelocityTracker; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int ANIM_FRAME_DURATION = (1000/60); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAnimating; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurAnimationTime; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mDisplayHeight; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mAnimY; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mAnimVel; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mAnimAccel; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mAnimLastTime; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAnimatingReveal = false; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mViewDelta; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] mAbsPos = new int[2]; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for disabling the status bar 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mDisabled = 0; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct the service, add the status bar view to the window manager 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public StatusBarService(Context context) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplay = ((WindowManager)context.getSystemService( 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context.WINDOW_SERVICE)).getDefaultDisplay(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project makeStatusBarView(context); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUninstallReceiver = new UninstallReceiver(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setNotificationCallbacks(NotificationCallbacks listener) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationCallbacks = listener; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Constructing the view 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void makeStatusBarView(Context context) { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = context.getResources(); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRightIconSlots = res.getStringArray(com.android.internal.R.array.status_bar_icon_order); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRightIcons = new StatusBarIcon[mRightIconSlots.length]; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExpandedView expanded = (ExpandedView)View.inflate(context, 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.status_bar_expanded, null); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expanded.mService = this; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarView sb = (StatusBarView)View.inflate(context, 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.status_bar, null); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.mService = this; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // figure out which pixel-format to use for the status bar. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPixelFormat = PixelFormat.TRANSLUCENT; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable bg = sb.getBackground(); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bg != null) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPixelFormat = bg.getOpacity(); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatusBarView = sb; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatusIcons = (LinearLayout)sb.findViewById(R.id.statusIcons); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationIcons = (IconMerger)sb.findViewById(R.id.notificationIcons); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationIcons.service = this; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIcons = (LinearLayout)sb.findViewById(R.id.icons); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTickerView = sb.findViewById(R.id.ticker); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDateView = (DateView)sb.findViewById(R.id.date); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedDialog = new ExpandedDialog(context); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedView = expanded; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOngoingTitle = (TextView)expanded.findViewById(R.id.ongoingTitle); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOngoingItems = (LinearLayout)expanded.findViewById(R.id.ongoingItems); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatestTitle = (TextView)expanded.findViewById(R.id.latestTitle); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatestItems = (LinearLayout)expanded.findViewById(R.id.latestItems); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoNotificationsTitle = (TextView)expanded.findViewById(R.id.noNotificationsTitle); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClearButton = (TextView)expanded.findViewById(R.id.clear_all_button); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClearButton.setOnClickListener(mClearButtonListener); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpnLabel = (TextView)expanded.findViewById(R.id.spnLabel); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlmnLabel = (TextView)expanded.findViewById(R.id.plmnLabel); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScrollView = (ScrollView)expanded.findViewById(R.id.scroll); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationLinearLayout = expanded.findViewById(R.id.notificationLinearLayout); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOngoingTitle.setVisibility(View.GONE); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatestTitle.setVisibility(View.GONE); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTicker = new MyTicker(context, sb); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TickerView tickerView = (TickerView)sb.findViewById(R.id.tickerText); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tickerView.mTicker = mTicker; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackingView = (TrackingView)View.inflate(context, 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.status_bar_tracking, null); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackingView.mService = this; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCloseView = (CloseDragHandle)mTrackingView.findViewById(R.id.close); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCloseView.mService = this; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // add the more icon for the notifications 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IconData moreData = IconData.makeIcon(null, context.getPackageName(), 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.drawable.stat_notify_more, 0, 42); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMoreIcon = new StatusBarIcon(context, moreData, mNotificationIcons); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMoreIcon.view.setId(R.drawable.stat_notify_more); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationIcons.moreIcon = mMoreIcon; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationIcons.addView(mMoreIcon.view); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // set the inital view visibility 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setAreThereNotifications(); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDateView.setVisibility(View.INVISIBLE); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // before we register for broadcasts 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlmnLabel.setText(R.string.lockscreen_carrier_default); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlmnLabel.setVisibility(View.VISIBLE); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpnLabel.setText(""); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpnLabel.setVisibility(View.GONE); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // receive broadcasts 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter = new IntentFilter(); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 324f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato filter.addAction(Intent.ACTION_SCREEN_OFF); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(Telephony.Intents.SPN_STRINGS_UPDATED_ACTION); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.registerReceiver(mBroadcastReceiver, filter); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void systemReady() { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final StatusBarView view = mStatusBarView; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams lp = new WindowManager.LayoutParams( 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT, 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.getContext().getResources().getDimensionPixelSize( 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.dimen.status_bar_height), 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.TYPE_STATUS_BAR, 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING, 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPixelFormat); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.setTitle("StatusBar"); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.windowAnimations = R.style.Animation_StatusBar; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerImpl.getDefault().addView(view, lp); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // From IStatusBar 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void activate() { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addPendingOp(OP_EXPAND, null, true); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void deactivate() { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addPendingOp(OP_EXPAND, null, false); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void toggle() { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addPendingOp(OP_TOGGLE, null, false); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void disable(int what, IBinder token, String pkg) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mNotificationCallbacks) { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is a little gross, but I think it's safe as long as nobody else 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // synchronizes on mNotificationCallbacks. It's important that the the callback 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and the pending op get done in the correct order and not interleaved with 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // other calls, otherwise they'll get out of sync. 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int net; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mDisableRecords) { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project manageDisableListLocked(what, token, pkg); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project net = gatherDisableActionsLocked(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationCallbacks.onSetDisabled(net); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addPendingOp(OP_DISABLE, net); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IBinder addIcon(String slot, String iconPackage, int iconId, int iconLevel) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addIcon(IconData.makeIcon(slot, iconPackage, iconId, iconLevel, 0), null); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateIcon(IBinder key, 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String slot, String iconPackage, int iconId, int iconLevel) { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateIcon(key, IconData.makeIcon(slot, iconPackage, iconId, iconLevel, 0), null); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeIcon(IBinder key) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addPendingOp(OP_REMOVE_ICON, key, null, null, -1); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceStatusBar() { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.STATUS_BAR, 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "StatusBarService"); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceExpandStatusBar() { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.EXPAND_STATUS_BAR, 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "StatusBarService"); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Can be called from any thread 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IBinder addIcon(IconData data, NotificationData n) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int slot; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // assert early-on if they using a slot that doesn't exist. 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data != null && n == null) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project slot = getRightIconIndex(data.slot); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (slot < 0) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("invalid status bar icon slot: " 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (data.slot != null ? "'" + data.slot + "'" : "null")); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project slot = -1; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder key = new Binder(); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addPendingOp(OP_ADD_ICON, key, data, n, -1); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return key; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateIcon(IBinder key, IconData data, NotificationData n) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addPendingOp(OP_UPDATE_ICON, key, data, n, -1); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIconVisibility(IBinder key, boolean visible) { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addPendingOp(OP_SET_VISIBLE, key, visible); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addPendingOp(int code, IBinder key, IconData data, NotificationData n, int i) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mQueue) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingOp op = new PendingOp(); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.key = key; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.code = code; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.iconData = data == null ? null : data.clone(); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.notificationData = n; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.integer = i; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueue.add(op); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mQueue.size() == 1) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendEmptyMessage(2); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addPendingOp(int code, IBinder key, boolean visible) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mQueue) { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingOp op = new PendingOp(); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.key = key; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.code = code; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.visible = visible; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueue.add(op); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mQueue.size() == 1) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendEmptyMessage(1); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addPendingOp(int code, int integer) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mQueue) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingOp op = new PendingOp(); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.code = code; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.integer = integer; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueue.add(op); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mQueue.size() == 1) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendEmptyMessage(1); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock on mDisableRecords 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void manageDisableListLocked(int what, IBinder token, String pkg) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what) 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pkg=" + pkg); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // update the list 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mDisableRecords) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord tok = null; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord t = mDisableRecords.get(i); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.token == token) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok = t; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (what == 0 || !token.isBinderAlive()) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tok != null) { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisableRecords.remove(i); 498fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu tok.token.unlinkToDeath(tok, 0); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tok == null) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok = new DisableRecord(); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.linkToDeath(tok, 0); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (RemoteException ex) { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; // give up 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisableRecords.add(tok); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok.what = what; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok.token = token; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok.pkg = pkg; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock on mDisableRecords 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int gatherDisableActionsLocked() { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // gather the new net flags 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int net = 0; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project net |= mDisableRecords.get(i).what; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return net; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int getRightIconIndex(String slot) { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRightIconSlots.length; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRightIconSlots[i].equals(slot)) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always called from UI thread 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All changes to the status bar and notifications funnel through here and are batched. 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class H extends Handler { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message m) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (m.what == MSG_ANIMATE) { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doAnimation(); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (m.what == MSG_ANIMATE_REVEAL) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doRevealAnimation(); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mQueue) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wasExpanded = mExpanded; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for each one in the queue, find all of the ones with the same key 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and collapse that down into a final op and/or call to setVisibility, etc 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean expand = wasExpanded; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean doExpand = false; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean doDisable = false; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int disableWhat = 0; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mQueue.size(); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingOp op = mQueue.get(0); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean doOp = false; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean visible = false; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean doVisibility = false; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op.code == OP_SET_VISIBLE) { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doVisibility = true; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project visible = op.visible; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (op.code == OP_EXPAND) { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doExpand = true; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expand = op.visible; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (op.code == OP_TOGGLE) { 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doExpand = true; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expand = !expand; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doOp = true; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alwaysHandle(op.code)) { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // coalesce these 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=1; i<N; i++) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingOp o = mQueue.get(i); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!alwaysHandle(o.code) && o.key == op.key) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o.code == OP_SET_VISIBLE) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project visible = o.visible; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doVisibility = true; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (o.code == OP_EXPAND) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expand = o.visible; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doExpand = true; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.code = o.code; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.iconData = o.iconData; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.notificationData = o.notificationData; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueue.remove(i); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueue.remove(0); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (doOp) { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (op.code) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OP_ADD_ICON: 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OP_UPDATE_ICON: 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performAddUpdateIcon(op.key, op.iconData, op.notificationData); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OP_REMOVE_ICON: 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performRemoveIcon(op.key); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OP_DISABLE: 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doDisable = true; 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disableWhat = op.integer; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (doVisibility && op.code != OP_REMOVE_ICON) { 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performSetIconVisibility(op.key, visible); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mQueue.size() != 0) { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Assertion failed: mQueue.size=" + mQueue.size()); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (doExpand) { 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this is last so that we capture all of the pending changes before doing it 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (expand) { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animateExpand(); 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animateCollapse(); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (doDisable) { 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performDisableActions(disableWhat); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean alwaysHandle(int code) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return code == OP_DISABLE; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* private */ void performAddUpdateIcon(IBinder key, IconData data, NotificationData n) 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws StatusBarException { 658df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato if (SPEW) { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "performAddUpdateIcon icon=" + data + " notification=" + n + " key=" + key); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // notification 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != null) { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarNotification notification = getNotification(key); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotificationData oldData = null; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (notification == null) { 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // add 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notification = new StatusBarNotification(); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notification.key = key; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notification.data = n; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mNotificationData) { 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationData.add(notification); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addNotificationView(notification); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setAreThereNotifications(); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // update 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oldData = notification.data; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notification.data = n; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateNotificationView(notification, oldData); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Show the ticker if one is requested, and the text is different 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // than the currently displayed ticker. Also don't do this 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // until status bar window is attached to the window manager, 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // because... well, what's the point otherwise? And trying to 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // run a ticker without being attached will crash! 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n.tickerText != null && mStatusBarView.getWindowToken() != null 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (oldData == null 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || oldData.tickerText == null 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || !CharSequences.equals(oldData.tickerText, n.tickerText))) { 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS) == 0) { 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTicker.addEntry(n, StatusBarIcon.getIcon(mContext, data), n.tickerText); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 694dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani updateExpandedViewPos(EXPANDED_LEAVE_ALONE); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // icon 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mIconMap) { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarIcon icon = mIconMap.get(key); 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (icon == null) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // add 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout v = n == null ? mStatusIcons : mNotificationIcons; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project icon = new StatusBarIcon(mContext, data, v); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIconMap.put(key, icon); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIconList.add(icon); 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n == null) { 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int slotIndex = getRightIconIndex(data.slot); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarIcon[] rightIcons = mRightIcons; 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rightIcons[slotIndex] == null) { 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mRightIcons.length-1; i>slotIndex; i--) { 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarIcon ic = rightIcons[i]; 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ic != null) { 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rightIcons[slotIndex] = icon; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatusIcons.addView(icon.view, pos); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "duplicate icon in slot " + slotIndex + "/" + data.slot); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIconMap.remove(key); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIconList.remove(icon); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iconIndex = mNotificationData.getIconIndex(n); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationIcons.addView(icon.view, iconIndex); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n == null) { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // right hand side icons -- these don't reorder 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project icon.update(mContext, data); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remove old 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup parent = (ViewGroup)icon.view.getParent(); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.removeView(icon.view); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // add new 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project icon.update(mContext, data); 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iconIndex = mNotificationData.getIconIndex(n); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationIcons.addView(icon.view, iconIndex); 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* private */ void performSetIconVisibility(IBinder key, boolean visible) { 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mIconMap) { 750df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato if (SPEW) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "performSetIconVisibility key=" + key + " visible=" + visible); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarIcon icon = mIconMap.get(key); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project icon.view.setVisibility(visible ? View.VISIBLE : View.GONE); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* private */ void performRemoveIcon(IBinder key) { 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 760df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato if (SPEW) { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "performRemoveIcon key=" + key); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarIcon icon = mIconMap.remove(key); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIconList.remove(icon); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (icon != null) { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup parent = (ViewGroup)icon.view.getParent(); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.removeView(icon.view); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int slotIndex = getRightIconIndex(icon.mData.slot); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (slotIndex >= 0) { 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRightIcons[slotIndex] = null; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarNotification notification = getNotification(key); 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (notification != null) { 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeNotificationView(notification); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mNotificationData) { 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationData.remove(notification); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setAreThereNotifications(); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getIconNumberForView(View v) { 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mIconMap) { 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarIcon icon = null; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mIconList.size(); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarIcon ic = mIconList.get(i); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ic.view == v) { 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project icon = ic; 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (icon != null) { 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return icon.getNumber(); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarNotification getNotification(IBinder key) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mNotificationData) { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNotificationData.get(key); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View.OnFocusChangeListener mFocusChangeListener = new View.OnFocusChangeListener() { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onFocusChange(View v, boolean hasFocus) { 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Because 'v' is a ViewGroup, all its children will be (un)selected 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // too, which allows marqueeing to work. 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v.setSelected(hasFocus); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View makeNotificationView(StatusBarNotification notification, ViewGroup parent) { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotificationData n = notification.data; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RemoteViews remoteViews = n.contentView; 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (remoteViews == null) { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // create the row view 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutInflater inflater = (LayoutInflater)mContext.getSystemService( 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context.LAYOUT_INFLATER_SERVICE); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View row = inflater.inflate(com.android.internal.R.layout.status_bar_latest_event, parent, false); 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bind the click event to the content area 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup content = (ViewGroup)row.findViewById(com.android.internal.R.id.content); 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project content.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project content.setOnFocusChangeListener(mFocusChangeListener); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent contentIntent = n.contentIntent; 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (contentIntent != null) { 8366ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana content.setOnClickListener(new Launcher(contentIntent, n.pkg, n.tag, n.id)); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View child = null; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Exception exception = null; 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child = remoteViews.apply(mContext, content); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (RuntimeException e) { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exception = e; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child == null) { 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "couldn't inflate view for package " + n.pkg, exception); 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project content.addView(child); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project row.setDrawingCacheEnabled(true); 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notification.view = row; 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notification.contentView = child; 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return row; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void addNotificationView(StatusBarNotification notification) { 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (notification.view != null) { 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Assertion failed: notification.view=" 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + notification.view); 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout parent = notification.data.ongoingEvent ? mOngoingItems : mLatestItems; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View child = makeNotificationView(notification, parent); 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child == null) { 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = mNotificationData.getExpandedIndex(notification); 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.addView(child, index); 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the old one and put the new one in its place. 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param notification the notification 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void updateNotificationView(StatusBarNotification notification, NotificationData oldData) { 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotificationData n = notification.data; 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldData != null && n != null 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && n.contentView != null && oldData.contentView != null 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && n.contentView.getPackage() != null 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && oldData.contentView.getPackage() != null 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && oldData.contentView.getPackage().equals(n.contentView.getPackage()) 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && oldData.contentView.getLayoutId() == n.contentView.getLayoutId()) { 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationData.update(notification); 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n.contentView.reapply(mContext, notification.contentView); 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // update the contentIntent 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup content = (ViewGroup)notification.view.findViewById( 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.id.content); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent contentIntent = n.contentIntent; 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (contentIntent != null) { 8996ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana content.setOnClickListener(new Launcher(contentIntent, n.pkg, n.tag, n.id)); 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (RuntimeException e) { 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It failed to add cleanly. Log, and remove the view from the panel. 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "couldn't reapply views for package " + n.contentView.getPackage(), e); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeNotificationView(notification); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationData.update(notification); 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeNotificationView(notification); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addNotificationView(notification); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setAreThereNotifications(); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void removeNotificationView(StatusBarNotification notification) { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View v = notification.view; 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null) { 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup parent = (ViewGroup)v.getParent(); 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.removeView(v); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notification.view = null; 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setAreThereNotifications() { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean ongoing = mOngoingItems.getChildCount() != 0; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean latest = mLatestItems.getChildCount() != 0; 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotificationData.hasClearableItems()) { 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClearButton.setVisibility(View.VISIBLE); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClearButton.setVisibility(View.INVISIBLE); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOngoingTitle.setVisibility(ongoing ? View.VISIBLE : View.GONE); 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatestTitle.setVisibility(latest ? View.VISIBLE : View.GONE); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ongoing || latest) { 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoNotificationsTitle.setVisibility(View.GONE); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoNotificationsTitle.setVisibility(View.VISIBLE); 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void makeExpandedVisible() { 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) Log.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpandedVisible) { 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedVisible = true; 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project panelSlightlyVisible(true); 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateExpandedViewPos(EXPANDED_LEAVE_ALONE); 953ed564b319d6c3b54a566e6400afa9262b2a4ae83Amith Yamasani mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 9546179126dad0396880ce6b808bf81c9e506757626Amith Yamasani mExpandedParams.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 955ed564b319d6c3b54a566e6400afa9262b2a4ae83Amith Yamasani mExpandedDialog.getWindow().setAttributes(mExpandedParams); 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedView.requestFocus(View.FOCUS_FORWARD); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackingView.setVisibility(View.VISIBLE); 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mTicking) { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDateViewVisibility(true, com.android.internal.R.anim.fade_in); 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void animateExpand() { 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) Log.d(TAG, "Animate expand: expanded=" + mExpanded); 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpanded) { 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prepareTracking(0); 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performFling(0, 2000.0f, true); 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void animateCollapse() { 978486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato if (SPEW) { 979486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato Log.d(TAG, "animateCollapse(): mExpanded=" + mExpanded 980486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato + " mExpandedVisible=" + mExpandedVisible 981486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato + " mAnimating=" + mAnimating 982486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato + " mAnimVel=" + mAnimVel); 983486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato } 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mExpandedVisible) { 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato if (mAnimating) { 990486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato return; 991486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato } 992486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato 993486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato int y = mDisplay.getHeight()-1; 994486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato prepareTracking(y); 995486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato performFling(y, -2000.0f, true); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void performExpand() { 999df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato if (SPEW) Log.d(TAG, "performExpand: mExpanded=" + mExpanded); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ; 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpanded) { 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It seems strange to sometimes not expand... 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mNotificationData) { 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotificationData.size() == 0) { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpanded = true; 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project makeExpandedVisible(); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateExpandedViewPos(EXPANDED_FULL_OPEN); 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) postStartTracing(); 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void performCollapse() { 1024df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato if (SPEW) Log.d(TAG, "performCollapse: mExpanded=" + mExpanded 1025df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato + " mExpandedVisible=" + mExpandedVisible); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mExpandedVisible) { 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedVisible = false; 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project panelSlightlyVisible(false); 1032ed564b319d6c3b54a566e6400afa9262b2a4ae83Amith Yamasani mExpandedParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 10336179126dad0396880ce6b808bf81c9e506757626Amith Yamasani mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 1034ed564b319d6c3b54a566e6400afa9262b2a4ae83Amith Yamasani mExpandedDialog.getWindow().setAttributes(mExpandedParams); 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackingView.setVisibility(View.GONE); 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS) == 0) { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDateViewVisibility(false, com.android.internal.R.anim.fade_out); 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mExpanded) { 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpanded = false; 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doAnimation() { 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimating) { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) Log.d(TAG, "doAnimation"); 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) Log.d(TAG, "doAnimation before mAnimY=" + mAnimY); 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incrementAnim(); 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) Log.d(TAG, "doAnimation after mAnimY=" + mAnimY); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimY >= mDisplay.getHeight()-1) { 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) Log.d(TAG, "Animation completed to expanded state."); 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimating = false; 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateExpandedViewPos(EXPANDED_FULL_OPEN); 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performExpand(); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (mAnimY < mStatusBarView.getHeight()) { 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) Log.d(TAG, "Animation completed to collapsed state."); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimating = false; 1063ed564b319d6c3b54a566e6400afa9262b2a4ae83Amith Yamasani updateExpandedViewPos(0); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performCollapse(); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateExpandedViewPos((int)mAnimY); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurAnimationTime += ANIM_FRAME_DURATION; 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE), mCurAnimationTime); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopTracking() { 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTracking = false; 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVelocityTracker.recycle(); 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVelocityTracker = null; 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void incrementAnim() { 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = SystemClock.uptimeMillis(); 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float t = ((float)(now - mAnimLastTime)) / 1000; // ms -> s 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float y = mAnimY; 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float v = mAnimVel; // px/s 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float a = mAnimAccel; // px/s/s 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimY = y + (v*t) + (0.5f*a*t*t); // px 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimVel = v + (a*t); // px/s 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimLastTime = now; // ms 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.d(TAG, "y=" + y + " v=" + v + " a=" + a + " t=" + t + " mAnimY=" + mAnimY 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " mAnimAccel=" + mAnimAccel); 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doRevealAnimation() { 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int h = mCloseView.getHeight() + mStatusBarView.getHeight(); 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimatingReveal && mAnimating && mAnimY < h) { 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incrementAnim(); 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimY >= h) { 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimY = h; 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateExpandedViewPos((int)mAnimY); 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateExpandedViewPos((int)mAnimY); 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurAnimationTime += ANIM_FRAME_DURATION; 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE_REVEAL), 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurAnimationTime); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void prepareTracking(int y) { 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTracking = true; 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVelocityTracker = VelocityTracker.obtain(); 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean opening = !mExpanded; 1113486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato if (opening) { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimAccel = 2000.0f; 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimVel = 200; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimY = mStatusBarView.getHeight(); 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateExpandedViewPos((int)mAnimY); 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimating = true; 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimatingReveal = true; 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeMessages(MSG_ANIMATE); 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeMessages(MSG_ANIMATE_REVEAL); 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = SystemClock.uptimeMillis(); 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimLastTime = now; 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurAnimationTime = now + ANIM_FRAME_DURATION; 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimating = true; 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE_REVEAL), 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurAnimationTime); 1128486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato makeExpandedVisible(); 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it's open, close it? 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimating) { 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimating = false; 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeMessages(MSG_ANIMATE); 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateExpandedViewPos(y + mViewDelta); 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void performFling(int y, float vel, boolean always) { 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimatingReveal = false; 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplayHeight = mDisplay.getHeight(); 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimY = y; 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimVel = vel; 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.d(TAG, "starting with mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel); 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpanded) { 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!always && ( 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vel > 200.0f 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (y > (mDisplayHeight-25) && vel > -200.0f))) { 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We are expanded, but they didn't move sufficiently to cause 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // us to retract. Animate back to the expanded position. 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimAccel = 2000.0f; 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vel < 0) { 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimVel = 0; 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We are expanded and are now going to animate away. 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimAccel = -2000.0f; 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vel > 0) { 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimVel = 0; 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (always || ( 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vel > 200.0f 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (y > (mDisplayHeight/2) && vel > -200.0f))) { 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We are collapsed, and they moved enough to allow us to 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // expand. Animate in the notifications. 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimAccel = 2000.0f; 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vel < 0) { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimVel = 0; 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We are collapsed, but they didn't move sufficiently to cause 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // us to retract. Animate back to the collapsed position. 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimAccel = -2000.0f; 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vel > 0) { 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimVel = 0; 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.d(TAG, "mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " mAnimAccel=" + mAnimAccel); 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = SystemClock.uptimeMillis(); 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimLastTime = now; 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurAnimationTime = now + ANIM_FRAME_DURATION; 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimating = true; 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeMessages(MSG_ANIMATE); 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeMessages(MSG_ANIMATE_REVEAL); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE), mCurAnimationTime); 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopTracking(); 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean interceptTouchEvent(MotionEvent event) { 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) Log.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event); 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int statusBarSize = mStatusBarView.getHeight(); 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int hitSize = statusBarSize*2; 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (event.getAction() == MotionEvent.ACTION_DOWN) { 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = (int)event.getRawY(); 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mExpanded) { 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mViewDelta = statusBarSize - y; 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackingView.getLocationOnScreen(mAbsPos); 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mViewDelta = mAbsPos[1] + mTrackingView.getHeight() - y; 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((!mExpanded && y < hitSize) || 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (mExpanded && y > (mDisplay.getHeight()-hitSize))) { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prepareTracking(y); 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVelocityTracker.addMovement(event); 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mTracking) { 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVelocityTracker.addMovement(event); 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int minY = statusBarSize + mCloseView.getHeight(); 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (event.getAction() == MotionEvent.ACTION_MOVE) { 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = (int)event.getRawY(); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimatingReveal && y < minY) { 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nothing 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimatingReveal = false; 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateExpandedViewPos(y + mViewDelta); 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (event.getAction() == MotionEvent.ACTION_UP) { 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVelocityTracker.computeCurrentVelocity(1000); 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float yVel = mVelocityTracker.getYVelocity(); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean negative = yVel < 0; 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float xVel = mVelocityTracker.getXVelocity(); 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xVel < 0) { 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xVel = -xVel; 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xVel > 150.0f) { 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xVel = 150.0f; // limit how much we care about the x axis 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float vel = (float)Math.hypot(yVel, xVel); 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (negative) { 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vel = -vel; 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performFling((int)event.getRawY(), vel, false); 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class Launcher implements View.OnClickListener { 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PendingIntent mIntent; 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mPkg; 12626ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana private String mTag; 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mId; 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12656ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana Launcher(PendingIntent intent, String pkg, String tag, int id) { 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIntent = intent; 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPkg = pkg; 12686ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana mTag = tag; 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = id; 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(View v) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 127495fc68f24a2a93e5664e2234abcfe479d385cc05Dianne Hackborn // The intent we are sending is for the application, which 127595fc68f24a2a93e5664e2234abcfe479d385cc05Dianne Hackborn // won't have permission to immediately start an activity after 127695fc68f24a2a93e5664e2234abcfe479d385cc05Dianne Hackborn // the user switches to home. We know it is safe to do at this 127795fc68f24a2a93e5664e2234abcfe479d385cc05Dianne Hackborn // point, so make sure new activity switches are now allowed. 127895fc68f24a2a93e5664e2234abcfe479d385cc05Dianne Hackborn ActivityManagerNative.getDefault().resumeAppSwitches(); 127995fc68f24a2a93e5664e2234abcfe479d385cc05Dianne Hackborn } catch (RemoteException e) { 128095fc68f24a2a93e5664e2234abcfe479d385cc05Dianne Hackborn } 128119a4157ce40f4ab77b60445b8e73069c5877bb8aJoe Onorato int[] pos = new int[2]; 128219a4157ce40f4ab77b60445b8e73069c5877bb8aJoe Onorato v.getLocationOnScreen(pos); 128319a4157ce40f4ab77b60445b8e73069c5877bb8aJoe Onorato Intent overlay = new Intent(); 128419a4157ce40f4ab77b60445b8e73069c5877bb8aJoe Onorato overlay.setSourceBounds( 128519a4157ce40f4ab77b60445b8e73069c5877bb8aJoe Onorato new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight())); 128695fc68f24a2a93e5664e2234abcfe479d385cc05Dianne Hackborn try { 128719a4157ce40f4ab77b60445b8e73069c5877bb8aJoe Onorato mIntent.send(mContext, 0, overlay); 12886ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana mNotificationCallbacks.onNotificationClick(mPkg, mTag, mId); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (PendingIntent.CanceledException e) { 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the stack trace isn't very helpful here. Just log the exception message. 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Sending contentIntent failed: " + e); 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deactivate(); 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class MyTicker extends Ticker { 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MyTicker(Context context, StatusBarView sb) { 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, sb); 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void tickerStarting() { 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTicking = true; 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIcons.setVisibility(View.GONE); 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTickerView.setVisibility(View.VISIBLE); 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_up_in, null)); 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIcons.startAnimation(loadAnim(com.android.internal.R.anim.push_up_out, null)); 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpandedVisible) { 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDateViewVisibility(false, com.android.internal.R.anim.push_up_out); 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void tickerDone() { 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIcons.setVisibility(View.VISIBLE); 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTickerView.setVisibility(View.GONE); 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIcons.startAnimation(loadAnim(com.android.internal.R.anim.push_down_in, null)); 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_down_out, 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTickingDoneListener)); 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpandedVisible) { 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDateViewVisibility(true, com.android.internal.R.anim.push_down_in); 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void tickerHalting() { 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIcons.setVisibility(View.VISIBLE); 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTickerView.setVisibility(View.GONE); 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIcons.startAnimation(loadAnim(com.android.internal.R.anim.fade_in, null)); 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.fade_out, 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTickingDoneListener)); 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpandedVisible) { 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDateViewVisibility(true, com.android.internal.R.anim.fade_in); 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation.AnimationListener mTickingDoneListener = new Animation.AnimationListener() {; 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onAnimationEnd(Animation animation) { 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTicking = false; 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onAnimationRepeat(Animation animation) { 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onAnimationStart(Animation animation) { 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Animation loadAnim(int id, Animation.AnimationListener listener) { 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation anim = AnimationUtils.loadAnimation(mContext, id); 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (listener != null) { 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anim.setAnimationListener(listener); 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return anim; 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String viewInfo(View v) { 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "(" + v.getLeft() + "," + v.getTop() + ")(" + v.getRight() + "," + v.getBottom() 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + v.getWidth() + "x" + v.getHeight() + ")"; 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Permission Denial: can't dump StatusBar from from pid=" 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Binder.getCallingPid() 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", uid=" + Binder.getCallingUid()); 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mQueue) { 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Current Status Bar state:"); 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mExpanded=" + mExpanded 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", mExpandedVisible=" + mExpandedVisible); 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mTicking=" + mTicking); 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mTracking=" + mTracking); 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mAnimating=" + mAnimating 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", mAnimY=" + mAnimY + ", mAnimVel=" + mAnimVel 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", mAnimAccel=" + mAnimAccel); 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mCurAnimationTime=" + mCurAnimationTime 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAnimLastTime=" + mAnimLastTime); 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDisplayHeight=" + mDisplayHeight 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAnimatingReveal=" + mAnimatingReveal 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mViewDelta=" + mViewDelta); 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDisplayHeight=" + mDisplayHeight); 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mQueue.size(); 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mQueue.size=" + N); 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingOp op = mQueue.get(i); 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" [" + i + "] key=" + op.key + " code=" + op.code + " visible=" 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + op.visible); 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" iconData=" + op.iconData); 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" notificationData=" + op.notificationData); 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mExpandedParams: " + mExpandedParams); 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mExpandedView: " + viewInfo(mExpandedView)); 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mExpandedDialog: " + mExpandedDialog); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mTrackingParams: " + mTrackingParams); 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mTrackingView: " + viewInfo(mTrackingView)); 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mOngoingTitle: " + viewInfo(mOngoingTitle)); 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mOngoingItems: " + viewInfo(mOngoingItems)); 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mLatestTitle: " + viewInfo(mLatestTitle)); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mLatestItems: " + viewInfo(mLatestItems)); 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mNoNotificationsTitle: " + viewInfo(mNoNotificationsTitle)); 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mCloseView: " + viewInfo(mCloseView)); 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mTickerView: " + viewInfo(mTickerView)); 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mScrollView: " + viewInfo(mScrollView) 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY()); 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("mNotificationLinearLayout: " + viewInfo(mNotificationLinearLayout)); 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mIconMap) { 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mIconMap.size(); 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mIconMap.size=" + N); 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<IBinder> keys = mIconMap.keySet(); 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (IBinder key: keys) { 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarIcon icon = mIconMap.get(key); 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" [" + i + "] key=" + key); 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" data=" + icon.mData); 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mNotificationData) { 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mNotificationData.ongoingCount(); 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" ongoingCount.size=" + N); 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarNotification n = mNotificationData.getOngoing(i); 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" [" + i + "] key=" + n.key + " view=" + n.view); 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" data=" + n.data); 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = mNotificationData.latestCount(); 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" ongoingCount.size=" + N); 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StatusBarNotification n = mNotificationData.getLatest(i); 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" [" + i + "] key=" + n.key + " view=" + n.view); 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" data=" + n.data); 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mDisableRecords) { 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDisableRecords.size=" + N 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mDisabled=0x" + Integer.toHexString(mDisabled)); 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord tok = mDisableRecords.get(i); 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" [" + i + "] what=0x" + Integer.toHexString(tok.what) 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pkg=" + tok.pkg + " token=" + tok.token); 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("see the logcat for a dump of the views we have created."); 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // must happen on ui thread 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.post(new Runnable() { 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatusBarView.getLocationOnScreen(mAbsPos); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "mStatusBarView: ----- (" + mAbsPos[0] + "," + mAbsPos[1] 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ") " + mStatusBarView.getWidth() + "x" 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mStatusBarView.getHeight()); 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatusBarView.debug(); 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedView.getLocationOnScreen(mAbsPos); 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "mExpandedView: ----- (" + mAbsPos[0] + "," + mAbsPos[1] 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ") " + mExpandedView.getWidth() + "x" 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mExpandedView.getHeight()); 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedView.debug(); 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackingView.getLocationOnScreen(mAbsPos); 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "mTrackingView: ----- (" + mAbsPos[0] + "," + mAbsPos[1] 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ") " + mTrackingView.getWidth() + "x" 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mTrackingView.getHeight()); 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackingView.debug(); 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onBarViewAttached() { 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams lp; 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pixelFormat; 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable bg; 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /// ---------- Tracking View -------------- 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixelFormat = PixelFormat.TRANSLUCENT; 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bg = mTrackingView.getBackground(); 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bg != null) { 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixelFormat = bg.getOpacity(); 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp = new WindowManager.LayoutParams( 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT, 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT, 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixelFormat); 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// lp.token = mStatusBarView.getWindowToken(); 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL; 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.setTitle("TrackingView"); 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackingParams = lp; 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerImpl.getDefault().addView(mTrackingView, lp); 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onTrackingViewAttached() { 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams lp; 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pixelFormat; 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable bg; 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /// ---------- Expanded View -------------- 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixelFormat = PixelFormat.TRANSLUCENT; 1511cc9f52f94349ce34489a5a2c803271e53961286bMathias Agopian bg = mExpandedView.getBackground(); 1512cc9f52f94349ce34489a5a2c803271e53961286bMathias Agopian if (bg != null) { 1513cc9f52f94349ce34489a5a2c803271e53961286bMathias Agopian pixelFormat = bg.getOpacity(); 1514cc9f52f94349ce34489a5a2c803271e53961286bMathias Agopian if (pixelFormat != PixelFormat.TRANSLUCENT) { 1515cc9f52f94349ce34489a5a2c803271e53961286bMathias Agopian // we want good-looking gradients, so we force a 8-bits per 1516cc9f52f94349ce34489a5a2c803271e53961286bMathias Agopian // pixel format. 1517cc9f52f94349ce34489a5a2c803271e53961286bMathias Agopian pixelFormat = PixelFormat.RGBX_8888; 1518105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1521ed564b319d6c3b54a566e6400afa9262b2a4ae83Amith Yamasani final int disph = mDisplay.getHeight(); 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp = mExpandedDialog.getWindow().getAttributes(); 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.width = ViewGroup.LayoutParams.FILL_PARENT; 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.x = 0; 1526ed564b319d6c3b54a566e6400afa9262b2a4ae83Amith Yamasani mTrackingPosition = lp.y = -disph; // sufficiently large negative 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.type = WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL; 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 1531ed564b319d6c3b54a566e6400afa9262b2a4ae83Amith Yamasani | WindowManager.LayoutParams.FLAG_DITHER 1532ed564b319d6c3b54a566e6400afa9262b2a4ae83Amith Yamasani | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.format = pixelFormat; 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL; 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.setTitle("StatusBarExpanded"); 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedDialog.getWindow().setAttributes(lp); 1537105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mExpandedDialog.getWindow().setFormat(pixelFormat); 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedParams = lp; 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedDialog.setContentView(mExpandedView, 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.LayoutParams.WRAP_CONTENT)); 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedDialog.show(); 1545105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project FrameLayout hack = (FrameLayout)mExpandedView.getParent(); 1546105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project hack.setForeground(null); 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setDateViewVisibility(boolean visible, int anim) { 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDateView.setUpdates(visible); 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDateView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDateView.startAnimation(loadAnim(anim, null)); 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setNotificationIconVisibility(boolean visible, int anim) { 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int old = mNotificationIcons.getVisibility(); 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int v = visible ? View.VISIBLE : View.INVISIBLE; 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old != v) { 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationIcons.setVisibility(v); 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationIcons.startAnimation(loadAnim(anim, null)); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void updateExpandedViewPos(int expandedPosition) { 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) { 1566486fdb559658ea790e4d5cf310b5e13b244ae0a7Joe Onorato Log.d(TAG, "updateExpandedViewPos before expandedPosition=" + expandedPosition 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTrackingParams.y=" + mTrackingParams.y 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTrackingPosition=" + mTrackingPosition); 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1571dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani int h = mStatusBarView.getHeight(); 1572dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani int disph = mDisplay.getHeight(); 1573dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani 1574dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani // If the expanded view is not visible, make sure they're still off screen. 1575dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani // Maybe the view was resized. 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mExpandedVisible) { 1577dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani if (mTrackingView != null) { 1578dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani mTrackingPosition = mTrackingParams.y = -disph; 1579dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani WindowManagerImpl.getDefault().updateViewLayout(mTrackingView, mTrackingParams); 1580dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani } 1581dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani if (mExpandedParams != null) { 1582dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani mExpandedParams.y = -disph; 1583dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani mExpandedDialog.getWindow().setAttributes(mExpandedParams); 1584dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani } 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1587dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // tracking view... 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos; 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (expandedPosition == EXPANDED_FULL_OPEN) { 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = h; 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (expandedPosition == EXPANDED_LEAVE_ALONE) { 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = mTrackingPosition; 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (expandedPosition <= disph) { 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = expandedPosition; 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = disph; 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos -= disph-h; 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackingPosition = mTrackingParams.y = pos; 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackingParams.height = disph-h; 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerImpl.getDefault().updateViewLayout(mTrackingView, mTrackingParams); 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCloseView.getLocationInWindow(mCloseLocation); 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpandedParams != null) { 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedParams.y = pos + mTrackingView.getHeight() 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project - (mTrackingParams.height-mCloseLocation[1]) - mExpandedView.getHeight(); 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int max = h; 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpandedParams.y > max) { 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedParams.y = max; 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int min = mTrackingPosition; 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpandedParams.y < min) { 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedParams.y = min; 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "mTrackingPosition=" + mTrackingPosition 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTrackingView.height=" + mTrackingView.getHeight() 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " diff=" + (mTrackingPosition + mTrackingView.getHeight()) 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " h=" + h); 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project panelSlightlyVisible((mTrackingPosition + mTrackingView.getHeight()) > h); 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedDialog.getWindow().setAttributes(mExpandedParams); 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) { 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "updateExpandedViewPos after expandedPosition=" + expandedPosition 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTrackingParams.y=" + mTrackingParams.y 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTrackingPosition=" + mTrackingPosition 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mExpandedParams.y=" + mExpandedParams.y); 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void updateAvailableHeight() { 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExpandedView != null) { 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int disph = mDisplay.getHeight(); 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h = mStatusBarView.getHeight(); 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int max = disph - (mCloseView.getHeight() + h); 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExpandedView.setMaxHeight(max); 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The LEDs are turned o)ff when the notification panel is shown, even just a little bit. 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This was added last-minute and is inconsistent with the way the rest of the notifications 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are handled, because the notification isn't really cancelled. The lights are just 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * turned off. If any other notifications happen, the lights will turn back on. Steve says 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this is what he wants. (see bug 1131461) 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mPanelSlightlyVisible; 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void panelSlightlyVisible(boolean visible) { 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPanelSlightlyVisible != visible) { 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPanelSlightlyVisible = visible; 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // tell the notification manager to turn off the lights. 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationCallbacks.onPanelRevealed(); 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void performDisableActions(int net) { 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int old = mDisabled; 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int diff = net ^ old; 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisabled = net; 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // act accordingly 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) { 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((net & StatusBarManager.DISABLE_EXPAND) != 0) { 16755808317af880d0042dc8de451bbdaf039665433bDaniel Sandler Log.d(TAG, "DISABLE_EXPAND: yes"); 16765808317af880d0042dc8de451bbdaf039665433bDaniel Sandler mAnimating = false; 16775808317af880d0042dc8de451bbdaf039665433bDaniel Sandler updateExpandedViewPos(0); 16785808317af880d0042dc8de451bbdaf039665433bDaniel Sandler performCollapse(); 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((net & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes"); 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTicking) { 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationIcons.setVisibility(View.INVISIBLE); 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTicker.halt(); 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out); 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "DISABLE_NOTIFICATION_ICONS: no"); 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mExpandedVisible) { 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in); 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View.OnClickListener mClearButtonListener = new View.OnClickListener() { 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(View v) { 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationCallbacks.onClearAll(); 1702dcdd29781a85c3cdc55d495cd8e77d9628b20010Amith Yamasani addPendingOp(OP_EXPAND, null, false); 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String action = intent.getAction(); 1709f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action) 1710f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato || Intent.ACTION_SCREEN_OFF.equals(action)) { 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deactivate(); 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (Telephony.Intents.SPN_STRINGS_UPDATED_ACTION.equals(action)) { 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false), 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getStringExtra(Telephony.Intents.EXTRA_SPN), 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false), 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getStringExtra(Telephony.Intents.EXTRA_PLMN)); 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateResources(); 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void updateNetworkName(boolean showSpn, String spn, boolean showPlmn, String plmn) { 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "updateNetworkName showSpn=" + showSpn + " spn=" + spn 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " showPlmn=" + showPlmn + " plmn=" + plmn); 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean something = false; 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showPlmn) { 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlmnLabel.setVisibility(View.VISIBLE); 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (plmn != null) { 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlmnLabel.setText(plmn); 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlmnLabel.setText(R.string.lockscreen_carrier_default); 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlmnLabel.setText(""); 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlmnLabel.setVisibility(View.GONE); 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showSpn && spn != null) { 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpnLabel.setText(spn); 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpnLabel.setVisibility(View.VISIBLE); 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project something = true; 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpnLabel.setText(""); 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpnLabel.setVisibility(View.GONE); 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reload some of our resources when the configuration changes. 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We don't reload everything when the configuration changes -- we probably 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should, but getting that smooth is tough. Someday we'll fix that. In the 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * meantime, just update the things that we know change. 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void updateResources() { 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClearButton.setText(mContext.getText(R.string.status_bar_clear_all_button)); 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOngoingTitle.setText(mContext.getText(R.string.status_bar_ongoing_events_title)); 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatestTitle.setText(mContext.getText(R.string.status_bar_latest_events_title)); 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoNotificationsTitle.setText(mContext.getText(R.string.status_bar_no_notifications_title)); 1764bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn if (false) Log.v(TAG, "updateResources"); 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // tracing 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void postStartTracing() { 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.postDelayed(mStartTracing, 3000); 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void vibrate() { 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Vibrator vib = (android.os.Vibrator)mContext.getSystemService( 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context.VIBRATOR_SERVICE); 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vib.vibrate(250); 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Runnable mStartTracing = new Runnable() { 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vibrate(); 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.sleep(250); 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "startTracing"); 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Debug.startMethodTracing("/data/statusbar-traces/trace"); 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.postDelayed(mStopTracing, 10000); 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Runnable mStopTracing = new Runnable() { 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Debug.stopMethodTracing(); 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "stopTracing"); 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vibrate(); 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class UninstallReceiver extends BroadcastReceiver { 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public UninstallReceiver() { 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter = new IntentFilter(); 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(Intent.ACTION_PACKAGE_RESTARTED); 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addDataScheme("package"); 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.registerReceiver(this, filter); 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<StatusBarNotification> list = null; 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (StatusBarService.this) { 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri data = intent.getData(); 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data != null) { 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = data.getSchemeSpecificPart(); 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list = mNotificationData.notificationsForPackage(pkg); 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (list != null) { 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = list.size(); 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeIcon(list.get(i).key); 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1828