Merge "Add content description for weather complication." into tm-qpr-dev

This commit is contained in:
Darrell Shi
2022-07-15 20:19:06 +00:00
committed by Android (Google) Code Review
4 changed files with 40 additions and 4 deletions

View File

@@ -2562,6 +2562,10 @@
=1 {# notification} =1 {# notification}
other {# notifications} other {# notifications}
}</string> }</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 --> <!-- [CHAR LIMIT=NONE] Le audio broadcast dialog, media app is broadcasting -->
<string name="broadcasting_description_is_broadcasting">Broadcasting</string> <string name="broadcasting_description_is_broadcasting">Broadcasting</string>

View File

@@ -24,6 +24,7 @@ import android.app.smartspace.SmartspaceAction;
import android.app.smartspace.SmartspaceTarget; import android.app.smartspace.SmartspaceTarget;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.text.TextUtils; import android.text.TextUtils;
@@ -133,16 +134,19 @@ public class DreamWeatherComplication implements Complication {
private final ActivityStarter mActivityStarter; private final ActivityStarter mActivityStarter;
private final String mSmartspaceTrampolineActivityComponent; private final String mSmartspaceTrampolineActivityComponent;
private SmartspaceTargetListener mSmartspaceTargetListener; private SmartspaceTargetListener mSmartspaceTargetListener;
private final Resources mResources;
@Inject @Inject
DreamWeatherViewController( DreamWeatherViewController(
@Named(DREAM_WEATHER_COMPLICATION_VIEW) TextView view, @Named(DREAM_WEATHER_COMPLICATION_VIEW) TextView view,
@Named(SMARTSPACE_TRAMPOLINE_ACTIVITY_COMPONENT) String smartspaceTrampoline, @Named(SMARTSPACE_TRAMPOLINE_ACTIVITY_COMPONENT) String smartspaceTrampoline,
ActivityStarter activityStarter, ActivityStarter activityStarter,
DreamSmartspaceController smartspaceController DreamSmartspaceController smartspaceController,
Resources resources
) { ) {
super(view); super(view);
mActivityStarter = activityStarter; mActivityStarter = activityStarter;
mResources = resources;
mSmartSpaceController = smartspaceController; mSmartSpaceController = smartspaceController;
mSmartspaceTrampolineActivityComponent = smartspaceTrampoline; mSmartspaceTrampolineActivityComponent = smartspaceTrampoline;
} }
@@ -161,8 +165,10 @@ public class DreamWeatherComplication implements Complication {
return; return;
} }
String temperature = headerAction.getTitle().toString(); final CharSequence temperature = headerAction.getTitle();
mView.setText(temperature); mView.setText(temperature);
mView.setContentDescription(getFormattedContentDescription(temperature,
headerAction.getContentDescription()));
final Icon icon = headerAction.getIcon(); final Icon icon = headerAction.getIcon();
if (icon != null) { if (icon != null) {
final int iconSize = final int iconSize =
@@ -174,7 +180,6 @@ public class DreamWeatherComplication implements Complication {
mView.setCompoundDrawablePadding( mView.setCompoundDrawablePadding(
getResources().getDimensionPixelSize( getResources().getDimensionPixelSize(
R.dimen.smart_action_button_icon_padding)); R.dimen.smart_action_button_icon_padding));
} }
mView.setOnClickListener(v -> { mView.setOnClickListener(v -> {
final Intent intent = headerAction.getIntent(); final Intent intent = headerAction.getIntent();
@@ -196,5 +201,21 @@ public class DreamWeatherComplication implements Complication {
protected void onViewDetached() { protected void onViewDetached() {
mSmartSpaceController.removeUnfilteredListener(mSmartspaceTargetListener); 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);
}
} }
} }

View File

@@ -19,12 +19,14 @@ package com.android.systemui.dreams.complication.dagger;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;
import android.content.res.Resources;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions;
import com.android.systemui.R; 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.ComplicationLayoutParams;
import com.android.systemui.dreams.complication.DreamWeatherComplication.DreamWeatherViewHolder; import com.android.systemui.dreams.complication.DreamWeatherComplication.DreamWeatherViewHolder;
@@ -34,6 +36,7 @@ import java.lang.annotation.Retention;
import javax.inject.Named; import javax.inject.Named;
import javax.inject.Scope; import javax.inject.Scope;
import dagger.Binds;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import dagger.Subcomponent; import dagger.Subcomponent;
@@ -106,5 +109,12 @@ public interface DreamWeatherComplicationComponent {
ComplicationLayoutParams.DIRECTION_END, ComplicationLayoutParams.DIRECTION_END,
INSERT_ORDER_WEIGHT, /* snapToGuide= */ true); INSERT_ORDER_WEIGHT, /* snapToGuide= */ true);
} }
/**
* Binds resources in the dream weather complication scope.
*/
@Binds
@DreamWeatherComplicationScope
Resources getResources(@Main Resources resources);
} }
} }

View File

@@ -21,6 +21,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.widget.TextView; import android.widget.TextView;
@@ -79,7 +80,7 @@ public class DreamWeatherComplicationTest extends SysuiTestCase {
final DreamWeatherComplication.DreamWeatherViewController controller = final DreamWeatherComplication.DreamWeatherViewController controller =
new DreamWeatherComplication.DreamWeatherViewController(mock( new DreamWeatherComplication.DreamWeatherViewController(mock(
TextView.class), TRAMPOLINE_COMPONENT, mock(ActivityStarter.class), TextView.class), TRAMPOLINE_COMPONENT, mock(ActivityStarter.class),
mDreamSmartspaceController); mDreamSmartspaceController, mock(Resources.class));
controller.onViewAttached(); controller.onViewAttached();
verify(mDreamSmartspaceController).addUnfilteredListener(any()); verify(mDreamSmartspaceController).addUnfilteredListener(any());
controller.onViewDetached(); controller.onViewDetached();