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