diff options
| author | 2016-06-01 17:09:45 -0700 | |
|---|---|---|
| committer | 2016-06-13 14:31:51 -0700 | |
| commit | feafa052f33d97b9bf73cae8aa4074462c399f73 (patch) | |
| tree | dd6352ebac690efd66f574d27b59e9056877e006 | |
| parent | e82ac10fa29f1f076cf5fd7ab25f0f7a072254db (diff) | |
Add MessagingStyle transitions
Fixes a particularly bad transition in the case where there
is one incoming message to a group.
Change-Id: Ieddece4a496292a69e14cdcd74d94986938d8223
Fixes: 29043489
4 files changed, 118 insertions, 5 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 83a20668b3b4..0fca78d5e8dc 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -4570,12 +4570,21 @@ public class Notification implements Parcelable : mConversationTitle; boolean hasTitle = !TextUtils.isEmpty(title); - if (!hasTitle && mMessages.size() == 1) { - CharSequence sender = mMessages.get(0).mSender; - CharSequence text = mMessages.get(0).mText; + if (mMessages.size() == 1) { + // Special case for a single message: Use the big text style + // so the collapsed and expanded versions match nicely. + CharSequence bigTitle; + CharSequence text; + if (hasTitle) { + bigTitle = title; + text = makeMessageLine(mMessages.get(0)); + } else { + bigTitle = mMessages.get(0).mSender; + text = mMessages.get(0).mText; + } RemoteViews contentView = mBuilder.applyStandardTemplateWithActions( mBuilder.getBigTextLayoutResource(), - false /* progress */, sender, null /* text */); + false /* progress */, bigTitle, null /* text */); BigTextStyle.applyBigTextContentView(mBuilder, contentView, text); return contentView; } @@ -4601,6 +4610,8 @@ public class Notification implements Parcelable contentView.setInt(R.id.notification_messaging, "setNumIndentLines", mBuilder.mN.mLargeIcon == null ? 0 : (hasTitle ? 1 : 2)); + int contractedChildId = View.NO_ID; + Message contractedMessage = findLatestIncomingMessage(); int firstMessage = Math.max(0, mMessages.size() - rowIds.length); while (firstMessage + i < mMessages.size() && i < rowIds.length) { Message m = mMessages.get(firstMessage + i); @@ -4609,8 +4620,15 @@ public class Notification implements Parcelable contentView.setViewVisibility(rowId, View.VISIBLE); contentView.setTextViewText(rowId, makeMessageLine(m)); + if (contractedMessage == m) { + contractedChildId = rowId; + } + i++; } + // Record this here to allow transformation between the contracted and expanded views. + contentView.setInt(R.id.notification_messaging, "setContractedChildId", + contractedChildId); return contentView; } diff --git a/core/java/com/android/internal/widget/MessagingLinearLayout.java b/core/java/com/android/internal/widget/MessagingLinearLayout.java index dc7b7f5b9646..d2a43b755f18 100644 --- a/core/java/com/android/internal/widget/MessagingLinearLayout.java +++ b/core/java/com/android/internal/widget/MessagingLinearLayout.java @@ -48,6 +48,11 @@ public class MessagingLinearLayout extends ViewGroup { private int mIndentLines; + /** + * Id of the child that's also visible in the contracted layout. + */ + private int mContractedChildId; + public MessagingLinearLayout(Context context, @Nullable AttributeSet attrs) { super(context, attrs); @@ -255,14 +260,29 @@ public class MessagingLinearLayout extends ViewGroup { return copy; } - @RemotableViewMethod /** * Sets how many lines should be indented to avoid a floating image. */ + @RemotableViewMethod public void setNumIndentLines(int numberLines) { mIndentLines = numberLines; } + /** + * Set id of the child that's also visible in the contracted layout. + */ + @RemotableViewMethod + public void setContractedChildId(int contractedChildId) { + mContractedChildId = contractedChildId; + } + + /** + * Get id of the child that's also visible in the contracted layout. + */ + public int getContractedChildId() { + return mContractedChildId; + } + public static class LayoutParams extends MarginLayoutParams { boolean hide = false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMessagingTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMessagingTemplateViewWrapper.java new file mode 100644 index 000000000000..ff2febfa38f8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMessagingTemplateViewWrapper.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2016 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 + */ + +package com.android.systemui.statusbar.notification; + +import com.android.internal.widget.MessagingLinearLayout; +import com.android.systemui.statusbar.ExpandableNotificationRow; +import com.android.systemui.statusbar.TransformableView; + +import android.content.Context; +import android.service.notification.StatusBarNotification; +import android.view.View; + +/** + * Wraps a notification containing a messaging template + */ +public class NotificationMessagingTemplateViewWrapper extends NotificationTemplateViewWrapper { + + private View mContractedMessage; + + protected NotificationMessagingTemplateViewWrapper(Context ctx, View view, + ExpandableNotificationRow row) { + super(ctx, view, row); + } + + private void resolveViews() { + mContractedMessage = null; + + View container = mView.findViewById(com.android.internal.R.id.notification_messaging); + if (container instanceof MessagingLinearLayout + && ((MessagingLinearLayout) container).getChildCount() > 0) { + MessagingLinearLayout messagingContainer = (MessagingLinearLayout) container; + + // Only consider the first child - transforming to a position other than the first + // looks bad because we have to move across other messages that are fading in. + View child = messagingContainer.getChildAt(0); + if (child.getId() == messagingContainer.getContractedChildId()) { + mContractedMessage = child; + } + } + } + + @Override + public void notifyContentUpdated(StatusBarNotification notification) { + // Reinspect the notification. Before the super call, because the super call also updates + // the transformation types and we need to have our values set by then. + resolveViews(); + super.notifyContentUpdated(notification); + } + + @Override + protected void updateTransformedTypes() { + // This also clears the existing types + super.updateTransformedTypes(); + if (mContractedMessage != null) { + mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_TEXT, + mContractedMessage); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java index 22519e6e4de3..16348dfe5818 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java @@ -50,6 +50,8 @@ public abstract class NotificationViewWrapper implements TransformableView { return new NotificationBigTextTemplateViewWrapper(ctx, v, row); } else if ("media".equals(v.getTag()) || "bigMediaNarrow".equals(v.getTag())) { return new NotificationMediaTemplateViewWrapper(ctx, v, row); + } else if ("messaging".equals(v.getTag())) { + return new NotificationMessagingTemplateViewWrapper(ctx, v, row); } return new NotificationTemplateViewWrapper(ctx, v, row); } else if (v instanceof NotificationHeaderView) { |