Merge "Fixed a bug where notification header could become empty" into nyc-dev
This commit is contained in:
@@ -184,6 +184,11 @@ public class Notification implements Parcelable
|
|||||||
*/
|
*/
|
||||||
public long when;
|
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.
|
* 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()
|
public Notification()
|
||||||
{
|
{
|
||||||
this.when = System.currentTimeMillis();
|
this.when = System.currentTimeMillis();
|
||||||
|
this.creationTime = System.currentTimeMillis();
|
||||||
this.priority = PRIORITY_DEFAULT;
|
this.priority = PRIORITY_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1516,6 +1522,7 @@ public class Notification implements Parcelable
|
|||||||
this.icon = icon;
|
this.icon = icon;
|
||||||
this.tickerText = tickerText;
|
this.tickerText = tickerText;
|
||||||
this.when = when;
|
this.when = when;
|
||||||
|
this.creationTime = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1526,6 +1533,7 @@ public class Notification implements Parcelable
|
|||||||
int version = parcel.readInt();
|
int version = parcel.readInt();
|
||||||
|
|
||||||
when = parcel.readLong();
|
when = parcel.readLong();
|
||||||
|
creationTime = parcel.readLong();
|
||||||
if (parcel.readInt() != 0) {
|
if (parcel.readInt() != 0) {
|
||||||
mSmallIcon = Icon.CREATOR.createFromParcel(parcel);
|
mSmallIcon = Icon.CREATOR.createFromParcel(parcel);
|
||||||
if (mSmallIcon.getType() == Icon.TYPE_RESOURCE) {
|
if (mSmallIcon.getType() == Icon.TYPE_RESOURCE) {
|
||||||
@@ -1614,6 +1622,7 @@ public class Notification implements Parcelable
|
|||||||
*/
|
*/
|
||||||
public void cloneInto(Notification that, boolean heavy) {
|
public void cloneInto(Notification that, boolean heavy) {
|
||||||
that.when = this.when;
|
that.when = this.when;
|
||||||
|
that.creationTime = this.creationTime;
|
||||||
that.mSmallIcon = this.mSmallIcon;
|
that.mSmallIcon = this.mSmallIcon;
|
||||||
that.number = this.number;
|
that.number = this.number;
|
||||||
|
|
||||||
@@ -1794,6 +1803,7 @@ public class Notification implements Parcelable
|
|||||||
parcel.writeInt(1);
|
parcel.writeInt(1);
|
||||||
|
|
||||||
parcel.writeLong(when);
|
parcel.writeLong(when);
|
||||||
|
parcel.writeLong(creationTime);
|
||||||
if (mSmallIcon == null && icon != 0) {
|
if (mSmallIcon == null && icon != 0) {
|
||||||
// you snuck an icon in here without using the builder; let's try to keep it
|
// you snuck an icon in here without using the builder; let's try to keep it
|
||||||
mSmallIcon = Icon.createWithResource("", icon);
|
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, View.GONE);
|
||||||
contentView.setViewVisibility(R.id.header_text_divider, View.GONE);
|
contentView.setViewVisibility(R.id.header_text_divider, View.GONE);
|
||||||
contentView.setViewVisibility(R.id.time_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.setImageViewIcon(R.id.profile_badge, null);
|
||||||
contentView.setViewVisibility(R.id.profile_badge, View.GONE);
|
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.setViewVisibility(R.id.time, View.VISIBLE);
|
||||||
contentView.setLong(R.id.time, "setTime", mN.when);
|
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
|
* otherwise
|
||||||
*/
|
*/
|
||||||
private boolean showsTimeOrChronometer() {
|
private boolean showsTimeOrChronometer() {
|
||||||
return mN.when != 0 && mN.extras.getBoolean(EXTRA_SHOW_WHEN);
|
return mN.showsTimeOrChronometer();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetStandardTemplateWithActions(RemoteViews big) {
|
private void resetStandardTemplateWithActions(RemoteViews big) {
|
||||||
@@ -3693,6 +3708,8 @@ public class Notification implements Parcelable
|
|||||||
mN.extras = getAllExtras();
|
mN.extras = getAllExtras();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mN.creationTime = System.currentTimeMillis();
|
||||||
|
|
||||||
// lazy stuff from mContext; see comment in Builder(Context, Notification)
|
// lazy stuff from mContext; see comment in Builder(Context, Notification)
|
||||||
Notification.addFieldsFromContext(mContext, mN);
|
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}
|
* An object that can apply a rich notification style to a {@link Notification.Builder}
|
||||||
* object.
|
* object.
|
||||||
|
|||||||
@@ -131,8 +131,18 @@ public class DateTimeView extends TextView {
|
|||||||
update();
|
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() {
|
void update() {
|
||||||
if (mTime == null) {
|
if (mTime == null || getVisibility() == GONE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (mShowRelativeTime) {
|
if (mShowRelativeTime) {
|
||||||
|
|||||||
@@ -69,15 +69,17 @@
|
|||||||
android:text="@string/notification_header_divider_symbol"
|
android:text="@string/notification_header_divider_symbol"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:visibility="gone"/>
|
android:visibility="gone"/>
|
||||||
<ViewStub
|
<DateTimeView
|
||||||
android:id="@+id/time"
|
android:id="@+id/time"
|
||||||
|
android:textAppearance="@style/TextAppearance.Material.Notification.Time"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
android:layout_marginStart="2dp"
|
android:layout_marginStart="2dp"
|
||||||
android:layout_marginEnd="2dp"
|
android:layout_marginEnd="2dp"
|
||||||
android:layout="@layout/notification_template_part_time"
|
android:showRelative="true"
|
||||||
android:visibility="gone"
|
android:singleLine="true"
|
||||||
/>
|
android:visibility="gone" />
|
||||||
<ViewStub
|
<ViewStub
|
||||||
android:id="@+id/chronometer"
|
android:id="@+id/chronometer"
|
||||||
android:layout_width="wrap_content"
|
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(
|
ImageView expand = (ImageView) view.findViewById(
|
||||||
com.android.internal.R.id.expand_button);
|
com.android.internal.R.id.expand_button);
|
||||||
applyToChild(icon, apply, header.getOriginalIconColor());
|
applyToChild(icon, apply, header.getOriginalIconColor());
|
||||||
int color = header.getOriginalNotificationColor();
|
applyToChild(expand, apply, header.getOriginalNotificationColor());
|
||||||
if (color == Notification.COLOR_DEFAULT) {
|
|
||||||
color = view.getContext().getColor(
|
|
||||||
com.android.internal.R.color.notification_icon_default_color);
|
|
||||||
}
|
|
||||||
applyToChild(expand, apply, color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyToChild(View view, boolean shouldApply, int originalColor) {
|
private void applyToChild(View view, boolean shouldApply, int originalColor) {
|
||||||
@@ -116,7 +111,7 @@ public class NotificationHeaderUtil {
|
|||||||
@Override
|
@Override
|
||||||
public boolean compare(View parent, View child, Object parentData,
|
public boolean compare(View parent, View child, Object parentData,
|
||||||
Object childData) {
|
Object childData) {
|
||||||
return parent.getVisibility() == View.VISIBLE;
|
return parent.getVisibility() != View.GONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -161,11 +156,11 @@ public class NotificationHeaderUtil {
|
|||||||
mComparators.get(compI).apply(row);
|
mComparators.get(compI).apply(row);
|
||||||
}
|
}
|
||||||
// We need to sanitize the dividers since they might be off-balance now
|
// 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()) {
|
if (row.isSummaryWithChildren()) {
|
||||||
sanitizeHeader(row.getNotificationHeader());
|
sanitizeHeader(row.getNotificationHeader());
|
||||||
return;
|
return;
|
||||||
@@ -188,9 +183,26 @@ public class NotificationHeaderUtil {
|
|||||||
if (rowHeader == null) {
|
if (rowHeader == null) {
|
||||||
return;
|
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 left = null;
|
||||||
View right;
|
View right;
|
||||||
final int childCount = rowHeader.getChildCount();
|
|
||||||
for (int i = 1; i < childCount - 1 ; i++) {
|
for (int i = 1; i < childCount - 1 ; i++) {
|
||||||
View child = rowHeader.getChildAt(i);
|
View child = rowHeader.getChildAt(i);
|
||||||
if (mDividers.contains(Integer.valueOf(child.getId()))) {
|
if (mDividers.contains(Integer.valueOf(child.getId()))) {
|
||||||
@@ -202,14 +214,14 @@ public class NotificationHeaderUtil {
|
|||||||
// A divider was found, this needs to be hidden
|
// A divider was found, this needs to be hidden
|
||||||
i--;
|
i--;
|
||||||
break;
|
break;
|
||||||
} else if (right.getVisibility() == View.VISIBLE) {
|
} else if (right.getVisibility() != View.GONE && right instanceof TextView) {
|
||||||
visible = left != null;
|
visible = left != null;
|
||||||
left = right;
|
left = right;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
child.setVisibility(visible ? View.VISIBLE : View.GONE);
|
child.setVisibility(visible ? View.VISIBLE : View.GONE);
|
||||||
} else if (child.getVisibility() == View.VISIBLE) {
|
} else if (child.getVisibility() != View.GONE && child instanceof TextView) {
|
||||||
left = child;
|
left = child;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -219,7 +231,7 @@ public class NotificationHeaderUtil {
|
|||||||
for (int compI = 0; compI < mComparators.size(); compI++) {
|
for (int compI = 0; compI < mComparators.size(); compI++) {
|
||||||
mComparators.get(compI).apply(row, true /* reset */);
|
mComparators.get(compI).apply(row, true /* reset */);
|
||||||
}
|
}
|
||||||
sanitizeDividers(row);
|
sanitizeHeaderViews(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class HeaderProcessor {
|
private static class HeaderProcessor {
|
||||||
|
|||||||
Reference in New Issue
Block a user