diff options
| -rw-r--r-- | packages/SystemUI/res/values/colors.xml | 1 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt | 76 |
2 files changed, 74 insertions, 3 deletions
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index ff16e063f5b1..fe65f32c6eb0 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -148,6 +148,7 @@ <!-- Animated Action colors --> <color name="animated_action_button_text_color">@androidprv:color/materialColorOnSurface</color> <color name="animated_action_button_stroke_color">@androidprv:color/materialColorOnSurface</color> + <color name="animated_action_button_attribution_color">@androidprv:color/materialColorOnSurfaceVariant</color> <!-- Biometric dialog colors --> <color name="biometric_dialog_gray">#ff757575</color> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt index b33c2005479e..4e18935834cf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt @@ -34,6 +34,10 @@ import android.graphics.drawable.Icon import android.os.Build import android.os.Bundle import android.os.SystemClock +import android.text.Annotation +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.ForegroundColorSpan import android.util.Log import android.view.ContextThemeWrapper import android.view.LayoutInflater @@ -504,15 +508,40 @@ constructor( choice: CharSequence, delayOnClickListener: Boolean, ): Button { - val layoutRes = + val enableAnimatedReply = Flags.notificationAnimatedActionsTreatment() && + smartReplies.fromAssistant && isAnimatedReply(choice) + val layoutRes = if (enableAnimatedReply) { + R.layout.animated_action_button + } else { if (notificationsRedesignTemplates()) R.layout.notification_2025_smart_reply_button else R.layout.smart_reply_button + } + return (LayoutInflater.from(parent.context).inflate(layoutRes, parent, false) as Button) .apply { - text = choice + // choiceToDeliver does not contain Annotation with extra data + val choiceToDeliver: CharSequence + if (enableAnimatedReply) { + choiceToDeliver = choice.toString() + // If the choice is animated reply, format the text by concatenating + // attributionText with different color to choice text + val fullTextWithAttribution = formatChoiceWithAttribution(choice) + text = fullTextWithAttribution + } else { + choiceToDeliver = choice + text = choice + } + val onClickListener = View.OnClickListener { - onSmartReplyClick(entry, smartReplies, replyIndex, parent, this, choice) + onSmartReplyClick( + entry, + smartReplies, + replyIndex, + parent, + this, + choiceToDeliver + ) } setOnClickListener( if (delayOnClickListener) @@ -600,6 +629,47 @@ constructor( RemoteInput.setResultsSource(intent, RemoteInput.SOURCE_CHOICE) return intent } + + // Check if the choice is animated reply + private fun isAnimatedReply(choice: CharSequence): Boolean { + if (choice is Spanned) { + val annotations = choice.getSpans(0, choice.length, Annotation::class.java) + for (annotation in annotations) { + if (annotation.key == "isAnimatedReply" && annotation.value == "1") { + return true + } + } + } + return false + } + + // Format the text by concatenating attributionText with attribution text color to choice text + private fun formatChoiceWithAttribution(choice: CharSequence): CharSequence { + val colorInt = context.getColor(R.color.animated_action_button_attribution_color) + if (choice is Spanned) { + val annotations = choice.getSpans(0, choice.length, Annotation::class.java) + for (annotation in annotations) { + if (annotation.key == "attributionText") { + // Extract the attribution text + val extraText = annotation.value + // Concatenate choice text and attribution text + val spannableWithColor = SpannableStringBuilder(choice) + spannableWithColor.append(" $extraText") + // Apply color to attribution text + spannableWithColor.setSpan( + ForegroundColorSpan(colorInt), + choice.length, + spannableWithColor.length, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + return spannableWithColor + } + } + } + + // Return the original if no attributionText found + return choice.toString() + } } /** |