CommandQueue.java revision 514ad663f0a8b239cc59409175e0bd489c591aa0
10cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato/*
20cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * Copyright (C) 2010 The Android Open Source Project
30cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato *
40cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
50cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * you may not use this file except in compliance with the License.
60cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * You may obtain a copy of the License at
70cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato *
80cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
90cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato *
100cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * Unless required by applicable law or agreed to in writing, software
110cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
120cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * See the License for the specific language governing permissions and
140cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * limitations under the License.
150cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato */
160cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
170cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratopackage com.android.policy.statusbar.phone;
180cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
190cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport android.os.Handler;
200cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport android.os.Message;
21514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onoratoimport android.util.Log;
220cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
230cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBar;
240cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIcon;
250cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIconList;
260cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
270cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoclass CommandQueue extends IStatusBar.Stub {
28514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato    private static final String TAG = "StatusBar.CommandQueue";
290cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
300cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private static final int MSG_MASK = 0xffff0000;
310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private static final int INDEX_MASK = 0x0000ffff;
320cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
330cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private static final int MSG_ICON = 0x00010000;
340cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private static final int OP_SET_ICON = 1;
350cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private static final int OP_REMOVE_ICON = 2;
360cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
370cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private StatusBarIconList mList;
380cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private Callbacks mCallbacks;
390cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private Handler mHandler = new H();
400cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
410cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    /**
420cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato     * These methods are called back on the main thread.
430cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato     */
440cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public interface Callbacks {
450cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon);
460cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        public void updateIcon(String slot, int index, int viewIndex,
470cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                StatusBarIcon old, StatusBarIcon icon);
480cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        public void removeIcon(String slot, int index, int viewIndex);
490cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
500cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
510cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
520cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mCallbacks = callbacks;
530cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mList = list;
540cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
550cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
560cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public void setIcon(int index, StatusBarIcon icon) {
570cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        synchronized (mList) {
580cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            int what = MSG_ICON | index;
590cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mHandler.removeMessages(what);
600cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mHandler.obtainMessage(what, OP_SET_ICON, 0, icon.clone()).sendToTarget();
610cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
620cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
630cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
640cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public void removeIcon(int index) {
650cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        synchronized (mList) {
660cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            int what = MSG_ICON | index;
670cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mHandler.removeMessages(what);
680cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mHandler.obtainMessage(what, OP_REMOVE_ICON, 0, null).sendToTarget();
690cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
700cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
710cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
720cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private final class H extends Handler {
730cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        public void handleMessage(Message msg) {
740cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            int what = msg.what & MSG_MASK;
750cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            switch (msg.what) {
760cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                case MSG_ICON: {
770cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    int index = msg.what & INDEX_MASK;
780cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    int viewIndex = mList.getViewIndex(index);
790cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    switch (msg.arg1) {
800cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                        case OP_SET_ICON: {
810cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            StatusBarIcon icon = (StatusBarIcon)msg.obj;
820cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            StatusBarIcon old = mList.getIcon(index);
830cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            if (old == null) {
840cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                                mList.setIcon(index, icon);
850cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                                mCallbacks.addIcon(mList.getSlot(index), index, viewIndex, icon);
860cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            } else {
870cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                                mList.setIcon(index, icon);
880cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                                mCallbacks.updateIcon(mList.getSlot(index), index, viewIndex,
890cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                                        old, icon);
900cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            }
910cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            break;
920cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                        }
930cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                        case OP_REMOVE_ICON:
940cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            mList.removeIcon(index);
950cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            mCallbacks.removeIcon(mList.getSlot(index), index, viewIndex);
960cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            break;
970cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    }
980cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    break;
990cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato               }
1000cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            }
1010cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
1020cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
1030cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato}
1040cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1050cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
106