Loading core/java/com/android/internal/statusbar/StatusBarIcon.java +1 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ public class StatusBarIcon implements Parcelable { out.writeString(this.iconPackage); out.writeInt(this.iconId); out.writeInt(this.iconLevel); out.writeInt(this.visible ? 1 : 0); out.writeInt(this.number); } Loading core/java/com/android/internal/statusbar/StatusBarNotification.java +4 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,10 @@ public class StatusBarNotification implements Parcelable { + " notification=" + notification + ")"; } public boolean isOngoing() { return (notification.flags & Notification.FLAG_ONGOING_EVENT) != 0; } } core/res/res/layout/status_bar_latest_event_content.xml +2 −1 Original line number Diff line number Diff line Loading @@ -12,7 +12,8 @@ android:orientation="horizontal" android:paddingTop="3dp" > <com.android.server.status.AnimatedImageView android:id="@+id/icon" <!--com.android.server.status.AnimatedImageView android:id="@+id/icon" --> <ImageView android:id="@+id/icon" android:layout_width="25dp" android:layout_height="25dp" android:scaleType="fitCenter" Loading packages/StatusBarPhone/src/com/android/policy/statusbar/phone/NotificationData.java +44 −22 Original line number Diff line number Diff line Loading @@ -16,29 +16,51 @@ package com.android.policy.statusbar.phone; import android.app.PendingIntent; import android.widget.RemoteViews; import android.os.IBinder; import android.view.View; import com.android.internal.statusbar.StatusBarNotification; import java.util.ArrayList; /** * The list of currently displaying notifications. */ public class NotificationData { public String pkg; public String tag; public int id; public CharSequence tickerText; public long when; public boolean ongoingEvent; public boolean clearable; public RemoteViews contentView; public PendingIntent contentIntent; public PendingIntent deleteIntent; public String toString() { return "NotificationData(package=" + pkg + " id=" + id + " tickerText=" + tickerText + " ongoingEvent=" + ongoingEvent + " contentIntent=" + contentIntent + " deleteIntent=" + deleteIntent + " clearable=" + clearable + " contentView=" + contentView + " when=" + when + ")"; public static final class Entry { public IBinder key; public StatusBarNotification notification; public StatusBarIconView icon; public View expanded; } private final ArrayList<Entry> mEntries = new ArrayList<Entry>(); public int size() { return mEntries.size(); } public Entry getEntryAt(int index) { return mEntries.get(index); } public int add(IBinder key, StatusBarNotification notification, View expanded) { Entry entry = new Entry(); entry.key = key; entry.notification = notification; entry.expanded = expanded; final int index = chooseIndex(notification.notification.when); mEntries.add(index, entry); return index; } private int chooseIndex(final long when) { final int N = mEntries.size(); for (int i=0; i<N; i++) { Entry entry = mEntries.get(i); if (entry.notification.notification.when > when) { return i; } } return N; } } packages/StatusBarPhone/src/com/android/policy/statusbar/phone/PhoneStatusBarService.java +64 −18 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import com.android.internal.statusbar.StatusBarNotification; import android.app.ActivityManagerNative; import android.app.Dialog; import android.app.Notification; import android.app.PendingIntent; import android.app.Service; import android.app.StatusBarManager; Loading Loading @@ -127,22 +128,28 @@ public class PhoneStatusBarService extends StatusBarService { LinearLayout mStatusIcons; // expanded notifications NotificationViewList mNotificationData = new NotificationViewList(); Dialog mExpandedDialog; ExpandedView mExpandedView; WindowManager.LayoutParams mExpandedParams; ScrollView mScrollView; View mNotificationLinearLayout; TextView mOngoingTitle; LinearLayout mOngoingItems; TextView mLatestTitle; LinearLayout mLatestItems; View mExpandedContents; // top bar TextView mNoNotificationsTitle; TextView mSpnLabel; TextView mPlmnLabel; TextView mClearButton; View mExpandedContents; // drag bar CloseDragHandle mCloseView; // ongoing NotificationData mOngoing = new NotificationData(); TextView mOngoingTitle; LinearLayout mOngoingItems; // latest NotificationData mLatest = new NotificationData(); TextView mLatestTitle; LinearLayout mLatestItems; // position int[] mPositionTmp = new int[2]; boolean mExpanded; boolean mExpandedVisible; Loading Loading @@ -317,6 +324,36 @@ public class PhoneStatusBarService extends StatusBarService { } public void addNotification(IBinder key, StatusBarNotification notification) { NotificationData list; ViewGroup parent; final boolean isOngoing = notification.isOngoing(); if (isOngoing) { list = mOngoing; parent = mOngoingItems; } else { list = mLatest; parent = mLatestItems; } // Construct the expanded view. final View view = makeNotificationView(notification, parent); // Construct the icon. StatusBarIconView iconView = new StatusBarIconView(this, notification.pkg + "/" + notification.id); iconView.set(new StatusBarIcon(notification.pkg, notification.notification.icon, notification.notification.iconLevel)); // Add the expanded view. final int viewIndex = list.add(key, notification, view); parent.addView(view, viewIndex); // Add the icon. final int iconIndex = chooseIconIndex(isOngoing, viewIndex); mNotificationIcons.addView(iconView, iconIndex, new LinearLayout.LayoutParams(mIconWidth, mHeight)); // show the ticker // TODO // recalculate the position of the sliding windows updateExpandedViewPos(EXPANDED_LEAVE_ALONE); } public void updateNotification(IBinder key, StatusBarNotification notification) { Loading Loading @@ -385,8 +422,17 @@ public class PhoneStatusBarService extends StatusBarService { } }; private int chooseIconIndex(boolean isOngoing, int index) { final int ongoingSize = mOngoing.size(); final int latestSize = mLatest.size(); if (!isOngoing) { index = mLatest.size() + index; } return (ongoingSize + latestSize) - index - 1; } View makeNotificationView(StatusBarNotification notification, ViewGroup parent) { NotificationData n = notification.data; Notification n = notification.notification; RemoteViews remoteViews = n.contentView; if (remoteViews == null) { return null; Loading @@ -403,7 +449,8 @@ public class PhoneStatusBarService extends StatusBarService { content.setOnFocusChangeListener(mFocusChangeListener); PendingIntent contentIntent = n.contentIntent; if (contentIntent != null) { content.setOnClickListener(new Launcher(contentIntent, n.pkg, n.tag, n.id)); content.setOnClickListener(new Launcher(contentIntent, notification.pkg, notification.tag, notification.id)); } View child = null; Loading @@ -415,15 +462,17 @@ public class PhoneStatusBarService extends StatusBarService { exception = e; } if (child == null) { Slog.e(TAG, "couldn't inflate view for package " + n.pkg, exception); Slog.e(TAG, "couldn't inflate view for package " + notification.pkg, exception); return null; } content.addView(child); row.setDrawingCacheEnabled(true); /* notification.view = row; notification.contentView = child; */ return row; } Loading @@ -433,6 +482,7 @@ public class PhoneStatusBarService extends StatusBarService { notification.iconLevel); icon.number = notification.number; */ /* void addNotificationView(StatusBarNotification notification) { if (notification.view != null) { throw new RuntimeException("Assertion failed: notification.view=" Loading @@ -449,11 +499,13 @@ public class PhoneStatusBarService extends StatusBarService { int index = mNotificationData.getExpandedIndex(notification); parent.addView(child, index); } */ /** * Remove the old one and put the new one in its place. * @param notification the notification */ /* void updateNotificationView(StatusBarNotification notification, NotificationData oldData) { NotificationData n = notification.data; if (oldData != null && n != null Loading Loading @@ -498,8 +550,10 @@ public class PhoneStatusBarService extends StatusBarService { notification.view = null; } } */ private void setAreThereNotifications() { /* boolean ongoing = mOngoingItems.getChildCount() != 0; boolean latest = mLatestItems.getChildCount() != 0; Loading @@ -517,6 +571,7 @@ public class PhoneStatusBarService extends StatusBarService { } else { mNoNotificationsTitle.setVisibility(View.VISIBLE); } */ } private void makeExpandedVisible() { Loading Loading @@ -588,15 +643,6 @@ public class PhoneStatusBarService extends StatusBarService { return; } // It seems strange to sometimes not expand... if (false) { synchronized (mNotificationData) { if (mNotificationData.size() == 0) { return; } } } mExpanded = true; makeExpandedVisible(); updateExpandedViewPos(EXPANDED_FULL_OPEN); Loading Loading
core/java/com/android/internal/statusbar/StatusBarIcon.java +1 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ public class StatusBarIcon implements Parcelable { out.writeString(this.iconPackage); out.writeInt(this.iconId); out.writeInt(this.iconLevel); out.writeInt(this.visible ? 1 : 0); out.writeInt(this.number); } Loading
core/java/com/android/internal/statusbar/StatusBarNotification.java +4 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,10 @@ public class StatusBarNotification implements Parcelable { + " notification=" + notification + ")"; } public boolean isOngoing() { return (notification.flags & Notification.FLAG_ONGOING_EVENT) != 0; } }
core/res/res/layout/status_bar_latest_event_content.xml +2 −1 Original line number Diff line number Diff line Loading @@ -12,7 +12,8 @@ android:orientation="horizontal" android:paddingTop="3dp" > <com.android.server.status.AnimatedImageView android:id="@+id/icon" <!--com.android.server.status.AnimatedImageView android:id="@+id/icon" --> <ImageView android:id="@+id/icon" android:layout_width="25dp" android:layout_height="25dp" android:scaleType="fitCenter" Loading
packages/StatusBarPhone/src/com/android/policy/statusbar/phone/NotificationData.java +44 −22 Original line number Diff line number Diff line Loading @@ -16,29 +16,51 @@ package com.android.policy.statusbar.phone; import android.app.PendingIntent; import android.widget.RemoteViews; import android.os.IBinder; import android.view.View; import com.android.internal.statusbar.StatusBarNotification; import java.util.ArrayList; /** * The list of currently displaying notifications. */ public class NotificationData { public String pkg; public String tag; public int id; public CharSequence tickerText; public long when; public boolean ongoingEvent; public boolean clearable; public RemoteViews contentView; public PendingIntent contentIntent; public PendingIntent deleteIntent; public String toString() { return "NotificationData(package=" + pkg + " id=" + id + " tickerText=" + tickerText + " ongoingEvent=" + ongoingEvent + " contentIntent=" + contentIntent + " deleteIntent=" + deleteIntent + " clearable=" + clearable + " contentView=" + contentView + " when=" + when + ")"; public static final class Entry { public IBinder key; public StatusBarNotification notification; public StatusBarIconView icon; public View expanded; } private final ArrayList<Entry> mEntries = new ArrayList<Entry>(); public int size() { return mEntries.size(); } public Entry getEntryAt(int index) { return mEntries.get(index); } public int add(IBinder key, StatusBarNotification notification, View expanded) { Entry entry = new Entry(); entry.key = key; entry.notification = notification; entry.expanded = expanded; final int index = chooseIndex(notification.notification.when); mEntries.add(index, entry); return index; } private int chooseIndex(final long when) { final int N = mEntries.size(); for (int i=0; i<N; i++) { Entry entry = mEntries.get(i); if (entry.notification.notification.when > when) { return i; } } return N; } }
packages/StatusBarPhone/src/com/android/policy/statusbar/phone/PhoneStatusBarService.java +64 −18 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import com.android.internal.statusbar.StatusBarNotification; import android.app.ActivityManagerNative; import android.app.Dialog; import android.app.Notification; import android.app.PendingIntent; import android.app.Service; import android.app.StatusBarManager; Loading Loading @@ -127,22 +128,28 @@ public class PhoneStatusBarService extends StatusBarService { LinearLayout mStatusIcons; // expanded notifications NotificationViewList mNotificationData = new NotificationViewList(); Dialog mExpandedDialog; ExpandedView mExpandedView; WindowManager.LayoutParams mExpandedParams; ScrollView mScrollView; View mNotificationLinearLayout; TextView mOngoingTitle; LinearLayout mOngoingItems; TextView mLatestTitle; LinearLayout mLatestItems; View mExpandedContents; // top bar TextView mNoNotificationsTitle; TextView mSpnLabel; TextView mPlmnLabel; TextView mClearButton; View mExpandedContents; // drag bar CloseDragHandle mCloseView; // ongoing NotificationData mOngoing = new NotificationData(); TextView mOngoingTitle; LinearLayout mOngoingItems; // latest NotificationData mLatest = new NotificationData(); TextView mLatestTitle; LinearLayout mLatestItems; // position int[] mPositionTmp = new int[2]; boolean mExpanded; boolean mExpandedVisible; Loading Loading @@ -317,6 +324,36 @@ public class PhoneStatusBarService extends StatusBarService { } public void addNotification(IBinder key, StatusBarNotification notification) { NotificationData list; ViewGroup parent; final boolean isOngoing = notification.isOngoing(); if (isOngoing) { list = mOngoing; parent = mOngoingItems; } else { list = mLatest; parent = mLatestItems; } // Construct the expanded view. final View view = makeNotificationView(notification, parent); // Construct the icon. StatusBarIconView iconView = new StatusBarIconView(this, notification.pkg + "/" + notification.id); iconView.set(new StatusBarIcon(notification.pkg, notification.notification.icon, notification.notification.iconLevel)); // Add the expanded view. final int viewIndex = list.add(key, notification, view); parent.addView(view, viewIndex); // Add the icon. final int iconIndex = chooseIconIndex(isOngoing, viewIndex); mNotificationIcons.addView(iconView, iconIndex, new LinearLayout.LayoutParams(mIconWidth, mHeight)); // show the ticker // TODO // recalculate the position of the sliding windows updateExpandedViewPos(EXPANDED_LEAVE_ALONE); } public void updateNotification(IBinder key, StatusBarNotification notification) { Loading Loading @@ -385,8 +422,17 @@ public class PhoneStatusBarService extends StatusBarService { } }; private int chooseIconIndex(boolean isOngoing, int index) { final int ongoingSize = mOngoing.size(); final int latestSize = mLatest.size(); if (!isOngoing) { index = mLatest.size() + index; } return (ongoingSize + latestSize) - index - 1; } View makeNotificationView(StatusBarNotification notification, ViewGroup parent) { NotificationData n = notification.data; Notification n = notification.notification; RemoteViews remoteViews = n.contentView; if (remoteViews == null) { return null; Loading @@ -403,7 +449,8 @@ public class PhoneStatusBarService extends StatusBarService { content.setOnFocusChangeListener(mFocusChangeListener); PendingIntent contentIntent = n.contentIntent; if (contentIntent != null) { content.setOnClickListener(new Launcher(contentIntent, n.pkg, n.tag, n.id)); content.setOnClickListener(new Launcher(contentIntent, notification.pkg, notification.tag, notification.id)); } View child = null; Loading @@ -415,15 +462,17 @@ public class PhoneStatusBarService extends StatusBarService { exception = e; } if (child == null) { Slog.e(TAG, "couldn't inflate view for package " + n.pkg, exception); Slog.e(TAG, "couldn't inflate view for package " + notification.pkg, exception); return null; } content.addView(child); row.setDrawingCacheEnabled(true); /* notification.view = row; notification.contentView = child; */ return row; } Loading @@ -433,6 +482,7 @@ public class PhoneStatusBarService extends StatusBarService { notification.iconLevel); icon.number = notification.number; */ /* void addNotificationView(StatusBarNotification notification) { if (notification.view != null) { throw new RuntimeException("Assertion failed: notification.view=" Loading @@ -449,11 +499,13 @@ public class PhoneStatusBarService extends StatusBarService { int index = mNotificationData.getExpandedIndex(notification); parent.addView(child, index); } */ /** * Remove the old one and put the new one in its place. * @param notification the notification */ /* void updateNotificationView(StatusBarNotification notification, NotificationData oldData) { NotificationData n = notification.data; if (oldData != null && n != null Loading Loading @@ -498,8 +550,10 @@ public class PhoneStatusBarService extends StatusBarService { notification.view = null; } } */ private void setAreThereNotifications() { /* boolean ongoing = mOngoingItems.getChildCount() != 0; boolean latest = mLatestItems.getChildCount() != 0; Loading @@ -517,6 +571,7 @@ public class PhoneStatusBarService extends StatusBarService { } else { mNoNotificationsTitle.setVisibility(View.VISIBLE); } */ } private void makeExpandedVisible() { Loading Loading @@ -588,15 +643,6 @@ public class PhoneStatusBarService extends StatusBarService { return; } // It seems strange to sometimes not expand... if (false) { synchronized (mNotificationData) { if (mNotificationData.size() == 0) { return; } } } mExpanded = true; makeExpandedVisible(); updateExpandedViewPos(EXPANDED_FULL_OPEN); Loading