Fix talkback doesn't speak subtext info
In the original design, we only set title description for view holder, this is wrong. It causes talkback can't speak subtext info. Currently, we set the title content description in the title view directly, so talkback can say the title and subtext now when talkback focus on an app view. Test: Talkback speaks full information for an app entry Fix: 177873163 Change-Id: I94996d596a85cc2813ed1b10cdd4ed2bee62f4a9
This commit is contained in:
@@ -19,6 +19,7 @@ package com.android.settings.applications.manageapplications;
|
|||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -37,9 +38,8 @@ import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
|||||||
|
|
||||||
public class ApplicationViewHolder extends RecyclerView.ViewHolder {
|
public class ApplicationViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
private final TextView mAppName;
|
@VisibleForTesting
|
||||||
private final ImageView mAppIcon;
|
final TextView mAppName;
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
final TextView mSummary;
|
final TextView mSummary;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -49,6 +49,8 @@ public class ApplicationViewHolder extends RecyclerView.ViewHolder {
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
final Switch mSwitch;
|
final Switch mSwitch;
|
||||||
|
|
||||||
|
private final ImageView mAppIcon;
|
||||||
|
|
||||||
ApplicationViewHolder(View itemView) {
|
ApplicationViewHolder(View itemView) {
|
||||||
super(itemView);
|
super(itemView);
|
||||||
mAppName = itemView.findViewById(android.R.id.title);
|
mAppName = itemView.findViewById(android.R.id.title);
|
||||||
@@ -95,11 +97,16 @@ public class ApplicationViewHolder extends RecyclerView.ViewHolder {
|
|||||||
itemView.setEnabled(isEnabled);
|
itemView.setEnabled(isEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTitle(CharSequence title) {
|
void setTitle(CharSequence title, CharSequence contentDescription) {
|
||||||
if (title == null) {
|
if (title == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mAppName.setText(title);
|
mAppName.setText(title);
|
||||||
|
|
||||||
|
if (TextUtils.isEmpty(contentDescription)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mAppName.setContentDescription(contentDescription);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setIcon(int drawableRes) {
|
void setIcon(int drawableRes) {
|
||||||
|
@@ -1422,9 +1422,8 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
// Bind the data efficiently with the holder
|
// Bind the data efficiently with the holder
|
||||||
final ApplicationsState.AppEntry entry = mEntries.get(position);
|
final ApplicationsState.AppEntry entry = mEntries.get(position);
|
||||||
synchronized (entry) {
|
synchronized (entry) {
|
||||||
holder.setTitle(entry.label);
|
|
||||||
mState.ensureLabelDescription(entry);
|
mState.ensureLabelDescription(entry);
|
||||||
holder.itemView.setContentDescription(entry.labelDescription);
|
holder.setTitle(entry.label, entry.labelDescription);
|
||||||
mState.ensureIcon(entry);
|
mState.ensureIcon(entry);
|
||||||
holder.setIcon(entry.icon);
|
holder.setIcon(entry.icon);
|
||||||
updateSummary(holder, entry);
|
updateSummary(holder, entry);
|
||||||
|
@@ -69,6 +69,22 @@ public class ApplicationViewHolderTest {
|
|||||||
assertThat(mHolder.mSummary.getText()).isEqualTo(mContext.getText(R.string.disabled));
|
assertThat(mHolder.mSummary.getText()).isEqualTo(mContext.getText(R.string.disabled));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setTitle_titleIsNotEmptyAndContentIsNotEmpty_shouldSetTitleAndContentDescription() {
|
||||||
|
mHolder.setTitle("title", "content");
|
||||||
|
|
||||||
|
assertThat(mHolder.mAppName).isEqualTo("title");
|
||||||
|
assertThat(mHolder.mAppName.getContentDescription()).isEqualTo("content");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setTitle_titleIsNotEmptyButContentIsEmpty_shouldSetTitle() {
|
||||||
|
mHolder.setTitle("title", "");
|
||||||
|
|
||||||
|
assertThat(mHolder.mAppName).isEqualTo("title");
|
||||||
|
assertThat(mHolder.mAppName.getContentDescription()).isEqualTo("title");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void updateSize() {
|
public void updateSize() {
|
||||||
final String invalidStr = "invalid";
|
final String invalidStr = "invalid";
|
||||||
|
Reference in New Issue
Block a user