Loading packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +24 −10 Original line number Diff line number Diff line Loading @@ -388,6 +388,7 @@ public class TabletStatusBar extends StatusBar { mNotificationPanel.setVisibility(View.VISIBLE); // synchronize with current shadow state mShadowController.hideElement(mNotificationArea); mTicker.halt(); } break; case MSG_CLOSE_NOTIFICATION_PANEL: Loading Loading @@ -458,12 +459,7 @@ public class TabletStatusBar extends StatusBar { if (DEBUG) Slog.d(TAG, "addNotification(" + key + " -> " + notification + ")"); addNotificationViews(key, notification); boolean immersive = false; try { immersive = ActivityManagerNative.getDefault().isTopActivityImmersive(); //Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive")); } catch (RemoteException ex) { } final boolean immersive = isImmersive(); if (false && immersive) { // TODO: immersive mode popups for tablet } else if (notification.notification.fullScreenIntent != null) { Loading @@ -475,7 +471,7 @@ public class TabletStatusBar extends StatusBar { } catch (PendingIntent.CanceledException e) { } } else { tick(notification); tick(key, notification); } setAreThereNotifications(); Loading Loading @@ -549,7 +545,14 @@ public class TabletStatusBar extends StatusBar { removeNotificationViews(key); addNotificationViews(key, notification); } // TODO: ticker; immersive mode // fullScreenIntent doesn't happen on updates. You need to clear & repost a new // notification. final boolean immersive = isImmersive(); if (false && immersive) { // TODO: immersive mode } else { tick(key, notification); } setAreThereNotifications(); } Loading @@ -557,6 +560,7 @@ public class TabletStatusBar extends StatusBar { public void removeNotification(IBinder key) { if (DEBUG) Slog.d(TAG, "removeNotification(" + key + ") // TODO"); removeNotificationViews(key); mTicker.remove(key); setAreThereNotifications(); } Loading Loading @@ -603,7 +607,7 @@ public class TabletStatusBar extends StatusBar { return n.tickerView != null || !TextUtils.isEmpty(n.tickerText); } private void tick(StatusBarNotification n) { private void tick(IBinder key, StatusBarNotification n) { // Don't show the ticker when the windowshade is open. if (mNotificationPanel.getVisibility() == View.VISIBLE) { return; Loading @@ -615,7 +619,7 @@ public class TabletStatusBar extends StatusBar { if (hasTicker(n.notification) && mStatusBarView.getWindowToken() != null) { if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) { mTicker.add(n); mTicker.add(key, n); } } } Loading Loading @@ -655,6 +659,16 @@ public class TabletStatusBar extends StatusBar { mInputMethodShortcutButton.setIMEButtonVisible(token, visible); } private boolean isImmersive() { try { return ActivityManagerNative.getDefault().isTopActivityImmersive(); //Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive")); } catch (RemoteException ex) { // the end is nigh return false; } } private void setAreThereNotifications() { final boolean hasClearable = mNotns.hasClearableItems(); Loading packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java +61 −20 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.graphics.Bitmap; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Slog; import android.view.Gravity; Loading @@ -47,6 +48,9 @@ import com.android.systemui.statusbar.StatusBarIconView; public class TabletTicker extends Handler { private static final String TAG = "StatusBar.TabletTicker"; // 3 is enough to let us see most cases, but not get so far behind that it's too annoying. private static final int QUEUE_LENGTH = 3; private static final int MSG_ADVANCE = 1; private static final int ADVANCE_DELAY = 5000; // 5 seconds Loading @@ -54,42 +58,77 @@ public class TabletTicker extends Handler { private Context mContext; private ViewGroup mWindow; private IBinder mCurrentKey; private StatusBarNotification mCurrentNotification; private View mCurrentView; private StatusBarNotification[] mQueue; private IBinder[] mKeys = new IBinder[QUEUE_LENGTH]; private StatusBarNotification[] mQueue = new StatusBarNotification[QUEUE_LENGTH]; private int mQueuePos; public TabletTicker(Context context) { mContext = context; // TODO: Make this a configuration value. // 3 is enough to let us see most cases, but not get so far behind that it's annoying. mQueue = new StatusBarNotification[3]; } public void add(StatusBarNotification notification) { public void add(IBinder key, StatusBarNotification notification) { if (false) { Slog.d(TAG, "add mCurrentNotification=" + mCurrentNotification Slog.d(TAG, "add 1 mCurrentNotification=" + mCurrentNotification + " mQueuePos=" + mQueuePos + " mQueue=" + Arrays.toString(mQueue)); } // If it's already in here, remove whatever's in there and put the new one at the end. remove(key, false); mKeys[mQueuePos] = key; mQueue[mQueuePos] = notification; // If nothing is running now, start the next one if (mQueuePos == 0) { // If nothing is running now, start the next one. if (mQueuePos == 0 && mCurrentNotification == null) { sendEmptyMessage(MSG_ADVANCE); } if (mQueuePos < mQueue.length - 1) { if (mQueuePos < QUEUE_LENGTH - 1) { mQueuePos++; } } public void remove(IBinder key) { remove(key, true); } public void remove(IBinder key, boolean advance) { if (mCurrentKey == key) { Slog.d(TAG, "removed current"); // Showing now if (advance) { removeMessages(MSG_ADVANCE); sendEmptyMessage(MSG_ADVANCE); } } else { // In the queue for (int i=0; i<QUEUE_LENGTH; i++) { if (mKeys[i] == key) { Slog.d(TAG, "removed from queue: " + i); for (; i<QUEUE_LENGTH-1; i++) { mKeys[i] = mKeys[i+1]; mQueue[i] = mQueue[i+1]; } mKeys[QUEUE_LENGTH-1] = null; mQueue[QUEUE_LENGTH-1] = null; if (mQueuePos > 0) { mQueuePos--; } break; } } } } public void halt() { removeMessages(MSG_ADVANCE); if (mCurrentView != null || mQueuePos != 0) { final int N = mQueue.length; for (int i=0; i<N; i++) { for (int i=0; i<QUEUE_LENGTH; i++) { mKeys[i] = null; mQueue[i] = null; } mQueuePos = 0; Loading @@ -110,14 +149,14 @@ public class TabletTicker extends Handler { if (mCurrentView != null) { mWindow.removeView(mCurrentView); mCurrentView = null; mCurrentKey = null; mCurrentNotification = null; } // In with the new... StatusBarNotification next = dequeue(); while (next != null) { mCurrentNotification = next; mCurrentView = makeTickerView(next); dequeue(); while (mCurrentNotification != null) { mCurrentView = makeTickerView(mCurrentNotification); if (mCurrentView != null) { if (mWindow == null) { mWindow = makeWindow(); Loading @@ -127,7 +166,7 @@ public class TabletTicker extends Handler { sendEmptyMessageDelayed(MSG_ADVANCE, ADVANCE_DELAY); break; } next = dequeue(); dequeue(); } // if there's nothing left, close the window Loading @@ -138,20 +177,22 @@ public class TabletTicker extends Handler { } } private StatusBarNotification dequeue() { StatusBarNotification notification = mQueue[0]; private void dequeue() { mCurrentKey = mKeys[0]; mCurrentNotification = mQueue[0]; if (false) { Slog.d(TAG, "dequeue mQueuePos=" + mQueuePos + " mQueue=" + Arrays.toString(mQueue)); } final int N = mQueuePos; for (int i=0; i<N; i++) { mKeys[i] = mKeys[i+1]; mQueue[i] = mQueue[i+1]; } mKeys[N] = null; mQueue[N] = null; if (mQueuePos > 0) { mQueuePos--; } return notification; } private ViewGroup makeWindow() { Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +24 −10 Original line number Diff line number Diff line Loading @@ -388,6 +388,7 @@ public class TabletStatusBar extends StatusBar { mNotificationPanel.setVisibility(View.VISIBLE); // synchronize with current shadow state mShadowController.hideElement(mNotificationArea); mTicker.halt(); } break; case MSG_CLOSE_NOTIFICATION_PANEL: Loading Loading @@ -458,12 +459,7 @@ public class TabletStatusBar extends StatusBar { if (DEBUG) Slog.d(TAG, "addNotification(" + key + " -> " + notification + ")"); addNotificationViews(key, notification); boolean immersive = false; try { immersive = ActivityManagerNative.getDefault().isTopActivityImmersive(); //Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive")); } catch (RemoteException ex) { } final boolean immersive = isImmersive(); if (false && immersive) { // TODO: immersive mode popups for tablet } else if (notification.notification.fullScreenIntent != null) { Loading @@ -475,7 +471,7 @@ public class TabletStatusBar extends StatusBar { } catch (PendingIntent.CanceledException e) { } } else { tick(notification); tick(key, notification); } setAreThereNotifications(); Loading Loading @@ -549,7 +545,14 @@ public class TabletStatusBar extends StatusBar { removeNotificationViews(key); addNotificationViews(key, notification); } // TODO: ticker; immersive mode // fullScreenIntent doesn't happen on updates. You need to clear & repost a new // notification. final boolean immersive = isImmersive(); if (false && immersive) { // TODO: immersive mode } else { tick(key, notification); } setAreThereNotifications(); } Loading @@ -557,6 +560,7 @@ public class TabletStatusBar extends StatusBar { public void removeNotification(IBinder key) { if (DEBUG) Slog.d(TAG, "removeNotification(" + key + ") // TODO"); removeNotificationViews(key); mTicker.remove(key); setAreThereNotifications(); } Loading Loading @@ -603,7 +607,7 @@ public class TabletStatusBar extends StatusBar { return n.tickerView != null || !TextUtils.isEmpty(n.tickerText); } private void tick(StatusBarNotification n) { private void tick(IBinder key, StatusBarNotification n) { // Don't show the ticker when the windowshade is open. if (mNotificationPanel.getVisibility() == View.VISIBLE) { return; Loading @@ -615,7 +619,7 @@ public class TabletStatusBar extends StatusBar { if (hasTicker(n.notification) && mStatusBarView.getWindowToken() != null) { if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) { mTicker.add(n); mTicker.add(key, n); } } } Loading Loading @@ -655,6 +659,16 @@ public class TabletStatusBar extends StatusBar { mInputMethodShortcutButton.setIMEButtonVisible(token, visible); } private boolean isImmersive() { try { return ActivityManagerNative.getDefault().isTopActivityImmersive(); //Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive")); } catch (RemoteException ex) { // the end is nigh return false; } } private void setAreThereNotifications() { final boolean hasClearable = mNotns.hasClearableItems(); Loading
packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java +61 −20 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.graphics.Bitmap; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Slog; import android.view.Gravity; Loading @@ -47,6 +48,9 @@ import com.android.systemui.statusbar.StatusBarIconView; public class TabletTicker extends Handler { private static final String TAG = "StatusBar.TabletTicker"; // 3 is enough to let us see most cases, but not get so far behind that it's too annoying. private static final int QUEUE_LENGTH = 3; private static final int MSG_ADVANCE = 1; private static final int ADVANCE_DELAY = 5000; // 5 seconds Loading @@ -54,42 +58,77 @@ public class TabletTicker extends Handler { private Context mContext; private ViewGroup mWindow; private IBinder mCurrentKey; private StatusBarNotification mCurrentNotification; private View mCurrentView; private StatusBarNotification[] mQueue; private IBinder[] mKeys = new IBinder[QUEUE_LENGTH]; private StatusBarNotification[] mQueue = new StatusBarNotification[QUEUE_LENGTH]; private int mQueuePos; public TabletTicker(Context context) { mContext = context; // TODO: Make this a configuration value. // 3 is enough to let us see most cases, but not get so far behind that it's annoying. mQueue = new StatusBarNotification[3]; } public void add(StatusBarNotification notification) { public void add(IBinder key, StatusBarNotification notification) { if (false) { Slog.d(TAG, "add mCurrentNotification=" + mCurrentNotification Slog.d(TAG, "add 1 mCurrentNotification=" + mCurrentNotification + " mQueuePos=" + mQueuePos + " mQueue=" + Arrays.toString(mQueue)); } // If it's already in here, remove whatever's in there and put the new one at the end. remove(key, false); mKeys[mQueuePos] = key; mQueue[mQueuePos] = notification; // If nothing is running now, start the next one if (mQueuePos == 0) { // If nothing is running now, start the next one. if (mQueuePos == 0 && mCurrentNotification == null) { sendEmptyMessage(MSG_ADVANCE); } if (mQueuePos < mQueue.length - 1) { if (mQueuePos < QUEUE_LENGTH - 1) { mQueuePos++; } } public void remove(IBinder key) { remove(key, true); } public void remove(IBinder key, boolean advance) { if (mCurrentKey == key) { Slog.d(TAG, "removed current"); // Showing now if (advance) { removeMessages(MSG_ADVANCE); sendEmptyMessage(MSG_ADVANCE); } } else { // In the queue for (int i=0; i<QUEUE_LENGTH; i++) { if (mKeys[i] == key) { Slog.d(TAG, "removed from queue: " + i); for (; i<QUEUE_LENGTH-1; i++) { mKeys[i] = mKeys[i+1]; mQueue[i] = mQueue[i+1]; } mKeys[QUEUE_LENGTH-1] = null; mQueue[QUEUE_LENGTH-1] = null; if (mQueuePos > 0) { mQueuePos--; } break; } } } } public void halt() { removeMessages(MSG_ADVANCE); if (mCurrentView != null || mQueuePos != 0) { final int N = mQueue.length; for (int i=0; i<N; i++) { for (int i=0; i<QUEUE_LENGTH; i++) { mKeys[i] = null; mQueue[i] = null; } mQueuePos = 0; Loading @@ -110,14 +149,14 @@ public class TabletTicker extends Handler { if (mCurrentView != null) { mWindow.removeView(mCurrentView); mCurrentView = null; mCurrentKey = null; mCurrentNotification = null; } // In with the new... StatusBarNotification next = dequeue(); while (next != null) { mCurrentNotification = next; mCurrentView = makeTickerView(next); dequeue(); while (mCurrentNotification != null) { mCurrentView = makeTickerView(mCurrentNotification); if (mCurrentView != null) { if (mWindow == null) { mWindow = makeWindow(); Loading @@ -127,7 +166,7 @@ public class TabletTicker extends Handler { sendEmptyMessageDelayed(MSG_ADVANCE, ADVANCE_DELAY); break; } next = dequeue(); dequeue(); } // if there's nothing left, close the window Loading @@ -138,20 +177,22 @@ public class TabletTicker extends Handler { } } private StatusBarNotification dequeue() { StatusBarNotification notification = mQueue[0]; private void dequeue() { mCurrentKey = mKeys[0]; mCurrentNotification = mQueue[0]; if (false) { Slog.d(TAG, "dequeue mQueuePos=" + mQueuePos + " mQueue=" + Arrays.toString(mQueue)); } final int N = mQueuePos; for (int i=0; i<N; i++) { mKeys[i] = mKeys[i+1]; mQueue[i] = mQueue[i+1]; } mKeys[N] = null; mQueue[N] = null; if (mQueuePos > 0) { mQueuePos--; } return notification; } private ViewGroup makeWindow() { Loading