Merge "Auto-expand the top notification." into jb-dev

This commit is contained in:
Chris Wren
2012-05-10 10:50:17 -07:00
committed by Android (Google) Code Review
7 changed files with 118 additions and 16 deletions

View File

@@ -17,4 +17,5 @@
<resources>
<item type="id" name="expandable_tag" />
<item type="id" name="user_expanded_tag" />
</resources>

View File

@@ -34,6 +34,7 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
View getChildAtPosition(MotionEvent ev);
View getChildAtPosition(float x, float y);
boolean canChildBeExpanded(View v);
boolean setUserExpandedChild(View v, boolean userxpanded);
}
private static final String TAG = "ExpandHelper";
@@ -272,6 +273,7 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
mScaleAnimation.start();
mStretching = false;
setGlow(0f);
mCallback.setUserExpandedChild(mCurrView, h == mNaturalHeight);
if (DEBUG) Log.d(TAG, "scale was finished on view: " + mCurrView);
clearView();
}

View File

@@ -486,17 +486,7 @@ public abstract class BaseStatusBar extends SystemUI implements
// for blaming (see SwipeHelper.setLongPressListener)
row.setTag(sbn.pkg);
// XXX: temporary: while testing big notifications, auto-expand all of them
ViewGroup.LayoutParams lp = row.getLayoutParams();
Boolean expandable = Boolean.FALSE;
if (large != null) {
lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
expandable = Boolean.TRUE;
} else {
lp.height = rowHeight;
}
row.setLayoutParams(lp);
row.setTag(R.id.expandable_tag, expandable);
workAroundBadLayerDrawableOpacity(row);
View vetoButton = updateNotificationVetoButton(row, sbn);
vetoButton.setContentDescription(mContext.getString(
@@ -562,10 +552,11 @@ public abstract class BaseStatusBar extends SystemUI implements
applyLegacyRowBackground(sbn, content);
row.setTag(R.id.expandable_tag, Boolean.valueOf(large != null));
entry.row = row;
entry.content = content;
entry.expanded = expandedOneU;
entry.expandedLarge = expandedOneU;
entry.setLargeView(expandedLarge);
return true;
}
@@ -674,6 +665,7 @@ public abstract class BaseStatusBar extends SystemUI implements
// Remove the expanded view.
ViewGroup rowParent = (ViewGroup)entry.row.getParent();
if (rowParent != null) rowParent.removeView(entry.row);
updateExpansionStates();
updateNotificationIcons();
return entry.notification;
@@ -712,16 +704,53 @@ public abstract class BaseStatusBar extends SystemUI implements
if (DEBUG) {
Slog.d(TAG, "addNotificationViews: added at " + pos);
}
updateExpansionStates();
updateNotificationIcons();
return iconView;
}
protected boolean expandView(NotificationData.Entry entry, boolean expand) {
if (entry.expandable()) {
int rowHeight =
mContext.getResources().getDimensionPixelSize(R.dimen.notification_height);
ViewGroup.LayoutParams lp = entry.row.getLayoutParams();
if (expand) {
lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
} else {
lp.height = rowHeight;
}
entry.row.setLayoutParams(lp);
return expand;
} else {
return false;
}
}
protected void updateExpansionStates() {
int N = mNotificationData.size();
for (int i = 0; i < N; i++) {
NotificationData.Entry entry = mNotificationData.get(i);
if (i == (N-1)) {
if (DEBUG) Slog.d(TAG, "expanding top notification at " + i);
expandView(entry, true);
} else {
if (!entry.userExpanded()) {
if (DEBUG) Slog.d(TAG, "collapsing notification at " + i);
expandView(entry, false);
} else {
if (DEBUG) Slog.d(TAG, "ignoring user-modified notification at " + i);
}
}
}
}
protected abstract void haltTicker();
protected abstract void setAreThereNotifications();
protected abstract void updateNotificationIcons();
protected abstract void tick(IBinder key, StatusBarNotification n, boolean firstTime);
protected abstract void updateExpandedViewPos(int expandedPosition);
protected abstract int getExpandedViewMaxHeight();
protected boolean isTopNotification(ViewGroup parent, NotificationData.Entry entry) {
return parent.indexOfChild(entry.row) == 0;
@@ -798,6 +827,7 @@ public abstract class BaseStatusBar extends SystemUI implements
handleNotificationError(key, notification, "Couldn't update icon: " + ic);
return;
}
updateExpansionStates();
}
catch (RuntimeException e) {
// It failed to add cleanly. Log, and remove the view from the panel.
@@ -807,6 +837,9 @@ public abstract class BaseStatusBar extends SystemUI implements
}
} else {
if (DEBUG) Slog.d(TAG, "not reusing notification for key: " + key);
if (DEBUG) Slog.d(TAG, "contents was " + (contentsUnchanged ? "unchanged" : "changed"));
if (DEBUG) Slog.d(TAG, "order was " + (orderUnchanged ? "unchanged" : "changed"));
if (DEBUG) Slog.d(TAG, "notification is " + (isTopAnyway ? "top" : "not top"));
removeNotificationViews(key);
addNotificationViews(key, notification);
}

View File

@@ -22,6 +22,7 @@ import android.view.View;
import android.widget.ImageView;
import com.android.internal.statusbar.StatusBarNotification;
import com.android.systemui.R;
import java.util.Comparator;
import java.util.ArrayList;
@@ -38,13 +39,32 @@ public class NotificationData {
public View content; // takes the click events and sends the PendingIntent
public View expanded; // the inflated RemoteViews
public ImageView largeIcon;
public View expandedLarge;
protected View expandedLarge;
public Entry() {}
public Entry(IBinder key, StatusBarNotification n, StatusBarIconView ic) {
this.key = key;
this.notification = n;
this.icon = ic;
}
public void setLargeView(View expandedLarge) {
this.expandedLarge = expandedLarge;
writeBooleanTag(row, R.id.expandable_tag, expandedLarge != null);
}
public View getLargeView() {
return expandedLarge;
}
/**
* Return whether the entry can be expanded.
*/
public boolean expandable() {
return NotificationData.getIsExpandable(row);
}
/**
* Return whether the entry has been manually expanded by the user.
*/
public boolean userExpanded() {
return NotificationData.getUserExpanded(row);
}
}
private final ArrayList<Entry> mEntries = new ArrayList<Entry>();
private final Comparator<Entry> mEntryCmp = new Comparator<Entry>() {
@@ -134,4 +154,41 @@ public class NotificationData {
}
return false;
}
protected static boolean readBooleanTag(View view, int id) {
if (view != null) {
Object value = view.getTag(id);
return value != null && value instanceof Boolean && ((Boolean) value).booleanValue();
}
return false;
}
protected static boolean writeBooleanTag(View view, int id, boolean value) {
if (view != null) {
view.setTag(id, Boolean.valueOf(value));
return value;
}
return false;
}
/**
* Return whether the entry can be expanded.
*/
public static boolean getIsExpandable(View row) {
return readBooleanTag(row, R.id.expandable_tag);
}
/**
* Return whether the entry has been manually expanded by the user.
*/
public static boolean getUserExpanded(View row) {
return readBooleanTag(row, R.id.user_expanded_tag);
}
/**
* Set whether the entry has been manually expanded by the user.
*/
public static boolean setUserExpanded(View row, boolean userExpanded) {
return writeBooleanTag(row, R.id.user_expanded_tag, userExpanded);
}
}

View File

@@ -1771,7 +1771,8 @@ public class PhoneStatusBar extends BaseStatusBar {
return a < 0f ? 0f : (a > 1f ? 1f : a);
}
int getExpandedViewMaxHeight() {
@Override
protected int getExpandedViewMaxHeight() {
return mDisplayMetrics.heightPixels - mNotificationPanelMarginBottomPx;
}

View File

@@ -39,6 +39,7 @@ import com.android.systemui.ExpandHelper;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.R;
import com.android.systemui.SwipeHelper;
import com.android.systemui.statusbar.NotificationData;
import java.util.HashMap;
@@ -175,9 +176,11 @@ public class NotificationRowLayout
}
public boolean canChildBeExpanded(View v) {
Object isExpandable = v.getTag(R.id.expandable_tag);
return isExpandable != null && isExpandable instanceof Boolean &&
((Boolean)isExpandable).booleanValue();
return NotificationData.getIsExpandable(v);
}
public boolean setUserExpandedChild(View v, boolean userExpanded) {
return NotificationData.setUserExpanded(v, userExpanded);
}
public void onChildDismissed(View v) {

View File

@@ -348,6 +348,11 @@ public class TabletStatusBar extends BaseStatusBar implements
scroller.setFillViewport(true);
}
@Override
protected int getExpandedViewMaxHeight() {
return getNotificationPanelHeight();
}
private int getNotificationPanelHeight() {
final Resources res = mContext.getResources();
final Display d = WindowManagerImpl.getDefault().getDefaultDisplay();