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

Commit 80aab1d8 authored by Darrell Shi's avatar Darrell Shi
Browse files

Add content description for weather complication.

This change sets the content description of the weather complication for
a11y, so that TalkBack reads both the weather condition (which is
presented as an icon visually), and the temperature.

Bug: 228406334
Fix: 228406334
Test: turn on TalkBack and verify weather complication reads both
weather condition and temperature
Test: atest DreamWeatherComplicationTest

Change-Id: I9d94b01776c59484eb5084e879634ac0742ae2bb
parent 4f934d78
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -2560,6 +2560,10 @@
    =1 {# notification}
    other {# notifications}
    }</string>
    <!-- Accessibility label for weather complication on dreams with weather condition and temperature [CHAR_LIMIT=200] -->
    <string name="dream_overlay_weather_complication_desc">
        <xliff:g id="weather_condition" example="Partly cloudy">%1$s</xliff:g>, <xliff:g id="temperature" example="7°C">%2$s</xliff:g>
    </string>

    <!-- [CHAR LIMIT=NONE] Le audio broadcast dialog, media app is broadcasting -->
    <string name="broadcasting_description_is_broadcasting">Broadcasting</string>
+24 −3
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.app.smartspace.SmartspaceAction;
import android.app.smartspace.SmartspaceTarget;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.text.TextUtils;
@@ -133,16 +134,19 @@ public class DreamWeatherComplication implements Complication {
        private final ActivityStarter mActivityStarter;
        private final String mSmartspaceTrampolineActivityComponent;
        private SmartspaceTargetListener mSmartspaceTargetListener;
        private final Resources mResources;

        @Inject
        DreamWeatherViewController(
                @Named(DREAM_WEATHER_COMPLICATION_VIEW) TextView view,
                @Named(SMARTSPACE_TRAMPOLINE_ACTIVITY_COMPONENT) String smartspaceTrampoline,
                ActivityStarter activityStarter,
                DreamSmartspaceController smartspaceController
                DreamSmartspaceController smartspaceController,
                Resources resources
        ) {
            super(view);
            mActivityStarter = activityStarter;
            mResources = resources;
            mSmartSpaceController = smartspaceController;
            mSmartspaceTrampolineActivityComponent = smartspaceTrampoline;
        }
@@ -161,8 +165,10 @@ public class DreamWeatherComplication implements Complication {
                                return;
                            }

                            String temperature = headerAction.getTitle().toString();
                            final CharSequence temperature = headerAction.getTitle();
                            mView.setText(temperature);
                            mView.setContentDescription(getFormattedContentDescription(temperature,
                                    headerAction.getContentDescription()));
                            final Icon icon = headerAction.getIcon();
                            if (icon != null) {
                                final int iconSize =
@@ -174,7 +180,6 @@ public class DreamWeatherComplication implements Complication {
                                mView.setCompoundDrawablePadding(
                                        getResources().getDimensionPixelSize(
                                                R.dimen.smart_action_button_icon_padding));

                            }
                            mView.setOnClickListener(v -> {
                                final Intent intent = headerAction.getIntent();
@@ -196,5 +201,21 @@ public class DreamWeatherComplication implements Complication {
        protected void onViewDetached() {
            mSmartSpaceController.removeUnfilteredListener(mSmartspaceTargetListener);
        }

        /**
         * Returns a formatted content description for accessibility of the weather condition and
         * temperature.
         */
        private CharSequence getFormattedContentDescription(CharSequence temperature,
                CharSequence weatherCondition) {
            if (TextUtils.isEmpty(temperature)) {
                return weatherCondition;
            } else if (TextUtils.isEmpty(weatherCondition)) {
                return temperature;
            }

            return mResources.getString(R.string.dream_overlay_weather_complication_desc,
                    weatherCondition, temperature);
        }
    }
}
+10 −0
Original line number Diff line number Diff line
@@ -19,12 +19,14 @@ package com.android.systemui.dreams.complication.dagger;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.TextView;

import com.android.internal.util.Preconditions;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dreams.complication.ComplicationLayoutParams;
import com.android.systemui.dreams.complication.DreamWeatherComplication.DreamWeatherViewHolder;

@@ -34,6 +36,7 @@ import java.lang.annotation.Retention;
import javax.inject.Named;
import javax.inject.Scope;

import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.Subcomponent;
@@ -106,5 +109,12 @@ public interface DreamWeatherComplicationComponent {
                    ComplicationLayoutParams.DIRECTION_END,
                    INSERT_ORDER_WEIGHT, /* snapToGuide= */ true);
        }

        /**
         * Binds resources in the dream weather complication scope.
         */
        @Binds
        @DreamWeatherComplicationScope
        Resources getResources(@Main Resources resources);
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import android.content.Context;
import android.content.res.Resources;
import android.testing.AndroidTestingRunner;
import android.widget.TextView;

@@ -79,7 +80,7 @@ public class DreamWeatherComplicationTest extends SysuiTestCase {
        final DreamWeatherComplication.DreamWeatherViewController controller =
                new DreamWeatherComplication.DreamWeatherViewController(mock(
                        TextView.class), TRAMPOLINE_COMPONENT, mock(ActivityStarter.class),
                        mDreamSmartspaceController);
                        mDreamSmartspaceController, mock(Resources.class));
        controller.onViewAttached();
        verify(mDreamSmartspaceController).addUnfilteredListener(any());
        controller.onViewDetached();