Merge "Fixed a bug where notification header could become empty" into nyc-dev
am: 57e4a67be1
* commit '57e4a67be13eede636608f789d1b88d0889683ec':
Fixed a bug where notification header could become empty
Change-Id: I5c22f22e67ed60ae441adccf852fc3850c400ad5
This commit is contained in:
@@ -184,6 +184,11 @@ public class Notification implements Parcelable
|
||||
*/
|
||||
public long when;
|
||||
|
||||
/**
|
||||
* The creation time of the notification
|
||||
*/
|
||||
private long creationTime;
|
||||
|
||||
/**
|
||||
* The resource id of a drawable to use as the icon in the status bar.
|
||||
*
|
||||
@@ -1479,6 +1484,7 @@ public class Notification implements Parcelable
|
||||
public Notification()
|
||||
{
|
||||
this.when = System.currentTimeMillis();
|
||||
this.creationTime = System.currentTimeMillis();
|
||||
this.priority = PRIORITY_DEFAULT;
|
||||
}
|
||||
|
||||
@@ -1516,6 +1522,7 @@ public class Notification implements Parcelable
|
||||
this.icon = icon;
|
||||
this.tickerText = tickerText;
|
||||
this.when = when;
|
||||
this.creationTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1526,6 +1533,7 @@ public class Notification implements Parcelable
|
||||
int version = parcel.readInt();
|
||||
|
||||
when = parcel.readLong();
|
||||
creationTime = parcel.readLong();
|
||||
if (parcel.readInt() != 0) {
|
||||
mSmallIcon = Icon.CREATOR.createFromParcel(parcel);
|
||||
if (mSmallIcon.getType() == Icon.TYPE_RESOURCE) {
|
||||
@@ -1614,6 +1622,7 @@ public class Notification implements Parcelable
|
||||
*/
|
||||
public void cloneInto(Notification that, boolean heavy) {
|
||||
that.when = this.when;
|
||||
that.creationTime = this.creationTime;
|
||||
that.mSmallIcon = this.mSmallIcon;
|
||||
that.number = this.number;
|
||||
|
||||
@@ -1794,6 +1803,7 @@ public class Notification implements Parcelable
|
||||
parcel.writeInt(1);
|
||||
|
||||
parcel.writeLong(when);
|
||||
parcel.writeLong(creationTime);
|
||||
if (mSmallIcon == null && icon != 0) {
|
||||
// you snuck an icon in here without using the builder; let's try to keep it
|
||||
mSmallIcon = Icon.createWithResource("", icon);
|
||||
@@ -3129,6 +3139,7 @@ public class Notification implements Parcelable
|
||||
contentView.setViewVisibility(R.id.header_text, View.GONE);
|
||||
contentView.setViewVisibility(R.id.header_text_divider, View.GONE);
|
||||
contentView.setViewVisibility(R.id.time_divider, View.GONE);
|
||||
contentView.setViewVisibility(R.id.time, View.GONE);
|
||||
contentView.setImageViewIcon(R.id.profile_badge, null);
|
||||
contentView.setViewVisibility(R.id.profile_badge, View.GONE);
|
||||
}
|
||||
@@ -3264,6 +3275,10 @@ public class Notification implements Parcelable
|
||||
contentView.setViewVisibility(R.id.time, View.VISIBLE);
|
||||
contentView.setLong(R.id.time, "setTime", mN.when);
|
||||
}
|
||||
} else {
|
||||
// We still want a time to be set but gone, such that we can show and hide it
|
||||
// on demand in case it's a child notification without anything in the header
|
||||
contentView.setLong(R.id.time, "setTime", mN.when != 0 ? mN.when : mN.creationTime);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3331,7 +3346,7 @@ public class Notification implements Parcelable
|
||||
* otherwise
|
||||
*/
|
||||
private boolean showsTimeOrChronometer() {
|
||||
return mN.when != 0 && mN.extras.getBoolean(EXTRA_SHOW_WHEN);
|
||||
return mN.showsTimeOrChronometer();
|
||||
}
|
||||
|
||||
private void resetStandardTemplateWithActions(RemoteViews big) {
|
||||
@@ -3693,6 +3708,8 @@ public class Notification implements Parcelable
|
||||
mN.extras = getAllExtras();
|
||||
}
|
||||
|
||||
mN.creationTime = System.currentTimeMillis();
|
||||
|
||||
// lazy stuff from mContext; see comment in Builder(Context, Notification)
|
||||
Notification.addFieldsFromContext(mContext, mN);
|
||||
|
||||
@@ -3825,6 +3842,15 @@ public class Notification implements Parcelable
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if the notification will show the time or the chronometer; false
|
||||
* otherwise
|
||||
* @hide
|
||||
*/
|
||||
public boolean showsTimeOrChronometer() {
|
||||
return when != 0 && extras.getBoolean(EXTRA_SHOW_WHEN);
|
||||
}
|
||||
|
||||
/**
|
||||
* An object that can apply a rich notification style to a {@link Notification.Builder}
|
||||
* object.
|
||||
|
||||
@@ -131,8 +131,18 @@ public class DateTimeView extends TextView {
|
||||
update();
|
||||
}
|
||||
|
||||
@Override
|
||||
@android.view.RemotableViewMethod
|
||||
public void setVisibility(@Visibility int visibility) {
|
||||
boolean gotVisible = visibility != GONE && getVisibility() == GONE;
|
||||
super.setVisibility(visibility);
|
||||
if (gotVisible) {
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
void update() {
|
||||
if (mTime == null) {
|
||||
if (mTime == null || getVisibility() == GONE) {
|
||||
return;
|
||||
}
|
||||
if (mShowRelativeTime) {
|
||||
|
||||
@@ -69,15 +69,17 @@
|
||||
android:text="@string/notification_header_divider_symbol"
|
||||
android:singleLine="true"
|
||||
android:visibility="gone"/>
|
||||
<ViewStub
|
||||
<DateTimeView
|
||||
android:id="@+id/time"
|
||||
android:textAppearance="@style/TextAppearance.Material.Notification.Time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginStart="2dp"
|
||||
android:layout_marginEnd="2dp"
|
||||
android:layout="@layout/notification_template_part_time"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
android:showRelative="true"
|
||||
android:singleLine="true"
|
||||
android:visibility="gone" />
|
||||
<ViewStub
|
||||
android:id="@+id/chronometer"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2012 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<DateTimeView android:id="@+id/time" xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:textAppearance="@style/TextAppearance.Material.Notification.Time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginEnd="4dp"
|
||||
android:layout_weight="0"
|
||||
android:showRelative="true"
|
||||
android:singleLine="true"
|
||||
/>
|
||||
@@ -65,12 +65,7 @@ public class NotificationHeaderUtil {
|
||||
ImageView expand = (ImageView) view.findViewById(
|
||||
com.android.internal.R.id.expand_button);
|
||||
applyToChild(icon, apply, header.getOriginalIconColor());
|
||||
int color = header.getOriginalNotificationColor();
|
||||
if (color == Notification.COLOR_DEFAULT) {
|
||||
color = view.getContext().getColor(
|
||||
com.android.internal.R.color.notification_icon_default_color);
|
||||
}
|
||||
applyToChild(expand, apply, color);
|
||||
applyToChild(expand, apply, header.getOriginalNotificationColor());
|
||||
}
|
||||
|
||||
private void applyToChild(View view, boolean shouldApply, int originalColor) {
|
||||
@@ -116,7 +111,7 @@ public class NotificationHeaderUtil {
|
||||
@Override
|
||||
public boolean compare(View parent, View child, Object parentData,
|
||||
Object childData) {
|
||||
return parent.getVisibility() == View.VISIBLE;
|
||||
return parent.getVisibility() != View.GONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -161,11 +156,11 @@ public class NotificationHeaderUtil {
|
||||
mComparators.get(compI).apply(row);
|
||||
}
|
||||
// We need to sanitize the dividers since they might be off-balance now
|
||||
sanitizeDividers(row);
|
||||
sanitizeHeaderViews(row);
|
||||
}
|
||||
}
|
||||
|
||||
private void sanitizeDividers(ExpandableNotificationRow row) {
|
||||
private void sanitizeHeaderViews(ExpandableNotificationRow row) {
|
||||
if (row.isSummaryWithChildren()) {
|
||||
sanitizeHeader(row.getNotificationHeader());
|
||||
return;
|
||||
@@ -188,9 +183,26 @@ public class NotificationHeaderUtil {
|
||||
if (rowHeader == null) {
|
||||
return;
|
||||
}
|
||||
final int childCount = rowHeader.getChildCount();
|
||||
View time = rowHeader.findViewById(com.android.internal.R.id.time);
|
||||
boolean hasVisibleText = false;
|
||||
for (int i = 1; i < childCount - 1 ; i++) {
|
||||
View child = rowHeader.getChildAt(i);
|
||||
if (child instanceof TextView
|
||||
&& child.getVisibility() != View.GONE
|
||||
&& !mDividers.contains(Integer.valueOf(child.getId()))
|
||||
&& child != time) {
|
||||
hasVisibleText = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// in case no view is visible we make sure the time is visible
|
||||
int timeVisibility = !hasVisibleText
|
||||
|| mRow.getStatusBarNotification().getNotification().showsTimeOrChronometer()
|
||||
? View.VISIBLE : View.GONE;
|
||||
time.setVisibility(timeVisibility);
|
||||
View left = null;
|
||||
View right;
|
||||
final int childCount = rowHeader.getChildCount();
|
||||
for (int i = 1; i < childCount - 1 ; i++) {
|
||||
View child = rowHeader.getChildAt(i);
|
||||
if (mDividers.contains(Integer.valueOf(child.getId()))) {
|
||||
@@ -202,14 +214,14 @@ public class NotificationHeaderUtil {
|
||||
// A divider was found, this needs to be hidden
|
||||
i--;
|
||||
break;
|
||||
} else if (right.getVisibility() == View.VISIBLE) {
|
||||
} else if (right.getVisibility() != View.GONE && right instanceof TextView) {
|
||||
visible = left != null;
|
||||
left = right;
|
||||
break;
|
||||
}
|
||||
}
|
||||
child.setVisibility(visible ? View.VISIBLE : View.GONE);
|
||||
} else if (child.getVisibility() == View.VISIBLE) {
|
||||
} else if (child.getVisibility() != View.GONE && child instanceof TextView) {
|
||||
left = child;
|
||||
}
|
||||
}
|
||||
@@ -219,7 +231,7 @@ public class NotificationHeaderUtil {
|
||||
for (int compI = 0; compI < mComparators.size(); compI++) {
|
||||
mComparators.get(compI).apply(row, true /* reset */);
|
||||
}
|
||||
sanitizeDividers(row);
|
||||
sanitizeHeaderViews(row);
|
||||
}
|
||||
|
||||
private static class HeaderProcessor {
|
||||
|
||||
Reference in New Issue
Block a user