Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3d6ade0b authored by Matías Hernández's avatar Matías Hernández
Browse files

Move the metric unit together with the label (in expanded view)

E.g. "Speed (km/h) / 100" instead of "Speed / 100 km/h"

Guarded by a temporary flag, so that we can experiment with both behaviors; the chosen one will be then merged with the main flag.

Bug: 434910979
Test: atest NotificationMetricStyleTest
Flag: android.app.api_metric_style
Flag: android.app.metric_style_unit_in_label
Change-Id: Ibac5fef55cc883272e7b22e4085592e3a34bcfcc
parent 34187898
Loading
Loading
Loading
Loading
+21 −5
Original line number Diff line number Diff line
@@ -11824,18 +11824,34 @@ public class Notification implements Parcelable
                    final Metric.MetricValue metricValue = metric.getValue();
                    final Metric.MetricValue.ValueString valueString = metricValue.toValueString(
                            mBuilder.mContext);
                    final String metricLabel;
                    if (isExpandedView) {
                        if (Flags.metricStyleUnitInLabel()
                                && !TextUtils.isEmpty(valueString.subtext())) {
                            metricLabel = mBuilder.mContext.getString(
                                    R.string.notification_metric_label_unit,
                                    metric.getLabel(), valueString.subtext());
                        } else {
                            metricLabel = metric.getLabel();
                        }
                    } else {
                        // No unit shown in collapsed view.
                        metricLabel = mBuilder.mContext.getString(
                                com.android.internal.R.string.notification_metric_label_template,
                                R.string.notification_metric_label_separator,
                                metric.getLabel());
                    }
                    contentView.setTextViewText(metricView.labelId(), metricLabel);
                    if (Flags.metricStyleUnitInLabel()) {
                        contentView.setViewVisibility(metricView.unitId(), View.GONE);
                    } else if (isExpandedView) {
                        contentView.setViewVisibility(metricView.unitId(),
                            TextUtils.isEmpty(valueString.subtext()) ? View.GONE : View.VISIBLE);
                                TextUtils.isEmpty(valueString.subtext())
                                        ? View.GONE
                                        : View.VISIBLE);
                        contentView.setTextViewText(metricView.unitId(), valueString.subtext());
                    }
                    if (metricValue instanceof Metric.TimeDifference timeDifference
                            && timeDifference.getPausedDuration() == null) {
+10 −0
Original line number Diff line number Diff line
@@ -52,6 +52,16 @@ flag {
  bug: "415827681"
}

flag {
  name: "metric_style_unit_in_label"
  namespace: "notifications"
  description: "In MetricStyle, concatenate the unit of the MetricValue to the label, instead of displaying it next to the value. This flag is only for prototyping; either the flag-on or flag-off path will be inlined once the behavior is decided."
  bug: "434910979"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}

flag {
  name: "modes_ui_dnd_tile"
  namespace: "systemui"
+6 −2
Original line number Diff line number Diff line
@@ -5661,8 +5661,12 @@
    <!-- Tempalate for Notification.MessagingStyle to join a conversation name with the name of the sender of a message, to make a notification title [CHAR LIMIT=NONE] -->
    <string name="notification_messaging_title_template"><xliff:g id="conversation_title" example="Tasty Treat Team">%1$s</xliff:g>: <xliff:g id="sender_name" example="Adrian Baker">%2$s</xliff:g></string>
    <!-- Template for Notification.MetricStyle to join Metric label with a separator e.g.: `:` -->
    <string name="notification_metric_label_template"><xliff:g id="metric_label" example="Steps">%1$s</xliff:g>:</string>
    <!-- Template for Notification.MetricStyle to join Metric label with its unit, e.g. "Speed (km/h)". -->
    <string name="notification_metric_label_unit"><xliff:g id="metric_label" example="Speed">%1$s</xliff:g> (<xliff:g id="metric_unit" example="km/h">%2$s</xliff:g>)</string>
    <!-- Template for Notification.MetricStyle to join Metric label with its unit and a separator, e.g. "Speed (km/h):". -->
    <string name="notification_metric_label_unit_separator"><xliff:g id="metric_label" example="Speed">%1$s</xliff:g> (<xliff:g id="metric_unit" example="km/h">%2$s</xliff:g>):</string>
    <!-- Template for Notification.MetricStyle to join Metric label with a separator e.g.: "Speed:". -->
    <string name="notification_metric_label_separator"><xliff:g id="metric_label" example="Steps">%1$s</xliff:g>:</string>
    <!-- Action text to be displayed for the "answer" action of an incoming call [CHAR LIMIT=13] -->
    <string name="call_notification_answer_action">Answer</string>
+3 −1
Original line number Diff line number Diff line
@@ -3579,7 +3579,9 @@
  <java-symbol type="string" name="notification_messaging_title_template" />

  <!-- Notifications: MetricStyle -->
  <java-symbol type="string" name="notification_metric_label_template" />
  <java-symbol type="string" name="notification_metric_label_unit" />
  <java-symbol type="string" name="notification_metric_label_unit_separator" />
  <java-symbol type="string" name="notification_metric_label_separator" />

  <!-- Notifications: CallStyle -->
  <java-symbol type="layout" name="notification_template_material_call" />
+111 −0
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package android.app;

import static android.app.Notification.EXTRA_METRICS;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;

import static com.google.common.truth.Truth.assertThat;

@@ -37,14 +39,21 @@ import android.content.ContentResolver;
import android.content.Context;
import android.os.Bundle;
import android.os.SystemClock;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.RemoteViews;
import android.widget.TextView;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;

import com.android.internal.R;

import com.google.common.truth.Expect;

import org.junit.After;
@@ -568,6 +577,108 @@ public class NotificationMetricStyleTest {
        assertThat(noUnit.toValueString(mContext)).isEqualTo(new ValueString("Boring", null));
    }

    @Test
    @DisableFlags(Flags.FLAG_METRIC_STYLE_UNIT_IN_LABEL)
    public void makeContentView_displaysLabelButNoUnit() {
        Notification.Builder n = new Notification.Builder(mContext, "channel")
                .setStyle(new MetricStyle()
                        .addMetric(new Metric(new FixedInt(42), "Answer"))
                        .addMetric(new Metric(new FixedInt(273, "°K"), "Temp")));

        RemoteViews remoteViews = n.getStyle().makeContentView();
        FrameLayout container = new FrameLayout(mContext);
        container.addView(remoteViews.apply(mContext, container));

        assertThat(((TextView) container.findViewById(R.id.metric_label_0)).getText().toString())
                .isEqualTo("Answer:");
        assertThat(((TextView) container.findViewById(R.id.metric_value_0)).getText().toString())
                .isEqualTo("42");
        assertThat((View) container.findViewById(R.id.metric_unit_0)).isNull();

        assertThat(((TextView) container.findViewById(R.id.metric_label_1)).getText().toString())
                .isEqualTo("Temp:");
        assertThat(((TextView) container.findViewById(R.id.metric_value_1)).getText().toString())
                .isEqualTo("273");
        assertThat((View) container.findViewById(R.id.metric_unit_1)).isNull();
    }

    @Test
    @EnableFlags(Flags.FLAG_METRIC_STYLE_UNIT_IN_LABEL)
    public void makeContentView_displaysLabelButNoUnit_evenWithUnitInLabelFlag() {
        Notification.Builder n = new Notification.Builder(mContext, "channel")
                .setStyle(new MetricStyle()
                        .addMetric(new Metric(new FixedInt(42), "Answer"))
                        .addMetric(new Metric(new FixedInt(273, "°K"), "Temp")));

        RemoteViews remoteViews = n.getStyle().makeContentView();
        FrameLayout container = new FrameLayout(mContext);
        container.addView(remoteViews.apply(mContext, container));

        assertThat(((TextView) container.findViewById(R.id.metric_label_0)).getText().toString())
                .isEqualTo("Answer:");
        assertThat(((TextView) container.findViewById(R.id.metric_value_0)).getText().toString())
                .isEqualTo("42");
        assertThat((View) container.findViewById(R.id.metric_unit_0)).isNull();

        assertThat(((TextView) container.findViewById(R.id.metric_label_1)).getText().toString())
                .isEqualTo("Temp:");
        assertThat(((TextView) container.findViewById(R.id.metric_value_1)).getText().toString())
                .isEqualTo("273");
        assertThat((View) container.findViewById(R.id.metric_unit_1)).isNull();
    }

    @Test
    @DisableFlags(Flags.FLAG_METRIC_STYLE_UNIT_IN_LABEL)
    public void makeExpandedContentView_displaysLabelAndUnit() {
        Notification.Builder n = new Notification.Builder(mContext, "channel")
                .setStyle(new MetricStyle()
                        .addMetric(new Metric(new FixedInt(42), "Answer"))
                        .addMetric(new Metric(new FixedInt(273, "°K"), "Temp")));

        RemoteViews remoteViews = n.getStyle().makeExpandedContentView();
        FrameLayout container = new FrameLayout(mContext);
        container.addView(remoteViews.apply(mContext, container));

        assertThat(((TextView) container.findViewById(R.id.metric_label_0)).getText().toString())
                .isEqualTo("Answer");
        assertThat(((TextView) container.findViewById(R.id.metric_value_0)).getText().toString())
                .isEqualTo("42");
        assertThat(container.findViewById(R.id.metric_unit_0).getVisibility()).isEqualTo(GONE);

        assertThat(((TextView) container.findViewById(R.id.metric_label_1)).getText().toString())
                .isEqualTo("Temp");
        assertThat(((TextView) container.findViewById(R.id.metric_value_1)).getText().toString())
                .isEqualTo("273");
        assertThat(container.findViewById(R.id.metric_unit_1).getVisibility()).isEqualTo(VISIBLE);
        assertThat(((TextView) container.findViewById(R.id.metric_unit_1)).getText().toString())
                .isEqualTo("°K");
    }

    @Test
    @EnableFlags(Flags.FLAG_METRIC_STYLE_UNIT_IN_LABEL)
    public void makeExpandedContentView_concatenatesLabelAndUnit() {
        Notification.Builder n = new Notification.Builder(mContext, "channel")
                .setStyle(new MetricStyle()
                        .addMetric(new Metric(new FixedInt(42), "Answer"))
                        .addMetric(new Metric(new FixedInt(273, "°K"), "Temp")));

        RemoteViews remoteViews = n.getStyle().makeExpandedContentView();
        FrameLayout container = new FrameLayout(mContext);
        container.addView(remoteViews.apply(mContext, container));

        assertThat(((TextView) container.findViewById(R.id.metric_label_0)).getText().toString())
                .isEqualTo("Answer");
        assertThat(((TextView) container.findViewById(R.id.metric_value_0)).getText().toString())
                .isEqualTo("42");
        assertThat(container.findViewById(R.id.metric_unit_0).getVisibility()).isEqualTo(GONE);

        assertThat(((TextView) container.findViewById(R.id.metric_label_1)).getText().toString())
                .isEqualTo("Temp (°K)");
        assertThat(((TextView) container.findViewById(R.id.metric_value_1)).getText().toString())
                .isEqualTo("273");
        assertThat(container.findViewById(R.id.metric_unit_1).getVisibility()).isEqualTo(GONE);
    }

    private void withLocale(Locale locale, Runnable r) {
        Locale previous = Locale.getDefault();
        try {