}
}
}
}
}
return;
}
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
oldList = mLatest;
PixelFormat.RGBX_8888);
lp.gravity = getStatusBarGravity();
lp.setTitle("StatusBar");
<<<<<<< HEAD
// TODO lp.windowAnimations = R.style.Animation_StatusBar;
WindowManagerImpl.getDefault().addView(sb, lp);
=======
lp.windowAnimations = com.android.internal.R.style.Animation_StatusBar;
WindowManagerImpl.getDefault().addView(view, lp);
}
public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) {
if (SPEW_ICONS) {
Slog.d(TAG, "addIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
+ " icon=" + icon);
}
StatusBarIconView view = new StatusBarIconView(this, slot);
view.set(icon);
mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams(mIconSize, mIconSize));
}
public void updateIcon(String slot, int index, int viewIndex,
StatusBarIcon old, StatusBarIcon icon) {
if (SPEW_ICONS) {
Slog.d(TAG, "updateIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
+ " old=" + old + " icon=" + icon);
}
StatusBarIconView view = (StatusBarIconView)mStatusIcons.getChildAt(viewIndex);
view.set(icon);
}
public void removeIcon(String slot, int index, int viewIndex) {
if (SPEW_ICONS) {
Slog.d(TAG, "removeIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex);
}
mStatusIcons.removeViewAt(viewIndex);
}
public void addNotification(IBinder key, StatusBarNotification notification) {
boolean shouldTick = true;
if (notification.notification.fullScreenIntent != null) {
shouldTick = false;
Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
try {
notification.notification.fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
}
}
StatusBarIconView iconView = addNotificationViews(key, notification);
if (iconView == null) return;
if (shouldTick) {
tick(notification);
}
// Recalculate the position of the sliding windows and the titles.
setAreThereNotifications();
public void updateNotification(IBinder key, StatusBarNotification notification) {
NotificationData oldList;
int oldIndex = mOngoing.findEntry(key);
if (oldIndex >= 0) {
oldList = mOngoing;
} else {
oldIndex = mLatest.findEntry(key);
if (oldIndex < 0) {
Slog.w(TAG, "updateNotification for unknown key: " + key);
return;
}
final NotificationData.Entry oldEntry = oldList.getEntryAt(oldIndex);
final StatusBarNotification oldNotification = oldEntry.notification;
final RemoteViews oldContentView = oldNotification.notification.contentView;
final RemoteViews contentView = notification.notification.contentView;
if (false) {
Slog.d(TAG, "old notification: when=" + oldNotification.notification.when
+ " ongoing=" + oldNotification.isOngoing()
+ " expanded=" + oldEntry.expanded
+ " contentView=" + oldContentView);
Slog.d(TAG, "new notification: when=" + notification.notification.when
+ " ongoing=" + oldNotification.isOngoing()
+ " contentView=" + contentView);
}
// Can we just reapply the RemoteViews in place? If when didn't change, the order
// didn't change.
if (notification.notification.when == oldNotification.notification.when
&& notification.isOngoing() == oldNotification.isOngoing()
&& oldEntry.expanded != null
&& contentView != null && oldContentView != null
&& contentView.getPackage() != null
&& oldContentView.getPackage() != null
&& oldContentView.getPackage().equals(contentView.getPackage())
&& oldContentView.getLayoutId() == contentView.getLayoutId()) {
if (SPEW) Slog.d(TAG, "reusing notification");
oldEntry.notification = notification;
try {
// Reapply the RemoteViews
contentView.reapply(this, oldEntry.content);
// update the contentIntent
final PendingIntent contentIntent = notification.notification.contentIntent;
if (contentIntent != null) {
oldEntry.content.setOnClickListener(new Launcher(contentIntent,
notification.pkg, notification.tag, notification.id));
}
// Update the icon.
final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
notification.notification.icon, notification.notification.iconLevel,
notification.notification.number);
if (!oldEntry.icon.set(ic)) {
handleNotificationError(key, notification, "Couldn't update icon: " + ic);
return;
}
}
catch (RuntimeException e) {
// It failed to add cleanly. Log, and remove the view from the panel.
Slog.w(TAG, "Couldn't reapply views for package " + contentView.getPackage(), e);
removeNotificationViews(key);
addNotificationViews(key, notification);
}
} else {
if (SPEW) Slog.d(TAG, "not reusing notification");
removeNotificationViews(key);
addNotificationViews(key, notification);
}
// Restart the ticker if it's still running
if (notification.notification.tickerText != null
&& !TextUtils.equals(notification.notification.tickerText,
oldEntry.notification.notification.tickerText)) {
tick(notification);
}
// Recalculate the position of the sliding windows and the titles.
setAreThereNotifications();
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
}
public void removeNotification(IBinder key) {
// Add the expanded view.
if (SPEW) Slog.d(TAG, "removeNotification key=" + key);
StatusBarNotification old = removeNotificationViews(key);
if (old != null) {
// Cancel the ticker if it's still running
mTicker.removeEntry(old);
// Recalculate the position of the sliding windows and the titles.
setAreThereNotifications();
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
}
}
private int chooseIconIndex(boolean isOngoing, int viewIndex) {
final int latestSize = mLatest.size();
if (isOngoing) {
return latestSize + (mOngoing.size() - viewIndex);
} else {
return latestSize - viewIndex;
}
}
View[] makeNotificationView(StatusBarNotification notification, ViewGroup parent) {
Notification n = notification.notification;
RemoteViews remoteViews = n.contentView;
if (remoteViews == null) {
return null;
}
// create the row view
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.status_bar_latest_event, parent, false);
// bind the click event to the content area
ViewGroup content = (ViewGroup)row.findViewById(R.id.content);
content.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
content.setOnFocusChangeListener(mFocusChangeListener);
PendingIntent contentIntent = n.contentIntent;
if (contentIntent != null) {
content.setOnClickListener(new Launcher(contentIntent, notification.pkg,
notification.tag, notification.id));
}
View expanded = null;
Exception exception = null;
try {
expanded = remoteViews.apply(this, content);
}
catch (RuntimeException e) {
exception = e;
}
if (expanded == null) {
String ident = notification.pkg + "/0x" + Integer.toHexString(notification.id);
Slog.e(TAG, "couldn't inflate view for notification " + ident, exception);
return null;
} else {
content.addView(expanded);
row.setDrawingCacheEnabled(true);
}
return new View[] { row, content, expanded };
}
StatusBarIconView addNotificationViews(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[] views = makeNotificationView(notification, parent);
if (views == null) {
handleNotificationError(key, notification, "Couldn't expand RemoteViews for: "
+ notification);
return null;
}
final View row = views[0];
final View content = views[1];
final View expanded = views[2];
// Construct the icon.
final StatusBarIconView iconView = new StatusBarIconView(this,
notification.pkg + "/0x" + Integer.toHexString(notification.id));
final StatusBarIcon ic = new StatusBarIcon(notification.pkg, notification.notification.icon,
notification.notification.iconLevel, notification.notification.number);
if (!iconView.set(ic)) {
handleNotificationError(key, notification, "Coulding create icon: " + ic);
return null;
}
final int viewIndex = list.add(key, notification, row, content, expanded, iconView);
parent.addView(row, viewIndex);
// Add the icon.
final int iconIndex = chooseIconIndex(isOngoing, viewIndex);
mNotificationIcons.addView(iconView, iconIndex);
return iconView;
}
StatusBarNotification removeNotificationViews(IBinder key) {
NotificationData.Entry entry = mOngoing.remove(key);
if (entry == null) {
entry = mLatest.remove(key);
if (entry == null) {
Slog.w(TAG, "removeNotification for unknown key: " + key);
return null;
}
}
// Remove the expanded view.
((ViewGroup)entry.row.getParent()).removeView(entry.row);
// Remove the icon.
((ViewGroup)entry.icon.getParent()).removeView(entry.icon);
return entry.notification;
}
private void setAreThereNotifications() {
boolean ongoing = mOngoing.hasVisibleItems();
boolean latest = mLatest.hasVisibleItems();
// (no ongoing notifications are clearable)
if (mLatest.hasClearableItems()) {
mClearButton.setVisibility(View.VISIBLE);
} else {
mClearButton.setVisibility(View.INVISIBLE);
}
mOngoingTitle.setVisibility(ongoing ? View.VISIBLE : View.GONE);
mLatestTitle.setVisibility(latest ? View.VISIBLE : View.GONE);
if (ongoing || latest) {
mNoNotificationsTitle.setVisibility(View.GONE);
} else {
mNoNotificationsTitle.setVisibility(View.VISIBLE);
}
}
/**
* State is one or more of the DISABLE constants from StatusBarManager.
*/
public void disable(int state) {
final int old = mDisabled;
final int diff = state ^ old;
mDisabled = state;
if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) {
if ((state & StatusBarManager.DISABLE_EXPAND) != 0) {
if (SPEW) Slog.d(TAG, "DISABLE_EXPAND: yes");
animateCollapse();
}
}
if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes");
if (mTicking) {
mTicker.halt();
} else {
setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out);
}
} else {
if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no");
if (!mExpandedVisible) {
setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);
}
}
} else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
if (mTicking && (state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_TICKER: yes");
mTicker.halt();
}
}
}
/**
* All changes to the status bar and notifications funnel through here and are batched.
*/
private class H extends Handler {
public void handleMessage(Message m) {
switch (m.what) {
case MSG_ANIMATE:
doAnimation();
break;
case MSG_ANIMATE_REVEAL:
doRevealAnimation();
break;
View.OnFocusChangeListener mFocusChangeListener = new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
// Because 'v' is a ViewGroup, all its children will be (un)selected
// too, which allows marqueeing to work.
v.setSelected(hasFocus);
}
};
private void makeExpandedVisible() {
if (SPEW) Slog.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible);
if (mExpandedVisible) {
mExpandedVisible = true;
visibilityChanged(true);
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mExpandedParams.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
mExpandedDialog.getWindow().setAttributes(mExpandedParams);
mExpandedView.requestFocus(View.FOCUS_FORWARD);
mTrackingView.setVisibility(View.VISIBLE);
mExpandedView.setVisibility(View.VISIBLE);
if (!mTicking) {
setDateViewVisibility(true, com.android.internal.R.anim.fade_in);
}
}
public void animateExpand() {
if (SPEW) Slog.d(TAG, "Animate expand: expanded=" + mExpanded);
if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) {
return ;
}
if (mExpanded) {
return;
}
prepareTracking(0, true);
performFling(0, 2000.0f, true);
}
public void animateCollapse() {
if (SPEW) {
Slog.d(TAG, "animateCollapse(): mExpanded=" + mExpanded
+ " mExpandedVisible=" + mExpandedVisible
+ " mExpanded=" + mExpanded
+ " mAnimating=" + mAnimating
+ " mAnimY=" + mAnimY
+ " mAnimVel=" + mAnimVel);
}
if (!mExpandedVisible) {
return;
}
int y;
if (mAnimating) {
y = (int)mAnimY;
} else {
y = mDisplay.getHeight()-1;
}
// Let the fling think that we're open so it goes in the right direction
// and doesn't try to re-open the windowshade.
mExpanded = true;
prepareTracking(y, false);
performFling(y, -2000.0f, true);
}
void performExpand() {
if (SPEW) Slog.d(TAG, "performExpand: mExpanded=" + mExpanded);
if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) {
return ;
}
if (mExpanded) {
return;
}
mExpanded = true;
makeExpandedVisible();
updateExpandedViewPos(EXPANDED_FULL_OPEN);
>>>>>>> 368fdba47a49f249aa4346edaf3f45291ca6a7ff
Slog.d(TAG, "Added status bar view: gravity=0x" + Integer.toHexString(lp.gravity)
+ " icons=" + iconList.size() |