diff options
| author | 2023-09-06 14:30:51 +0000 | |
|---|---|---|
| committer | 2023-09-06 14:30:51 +0000 | |
| commit | 4139803cc70b96ef321d25cdabf0de074d0b6a14 (patch) | |
| tree | e06220629d5f4298d13c7a9967aac4f6f66bdab7 /java | |
| parent | 87868f08dc662013308aba277fd7737d59dffd67 (diff) | |
| parent | c9fbc2e62505d8192a353e9322231d870c7cb923 (diff) | |
Merge "Append "Pinned" to content description for pinned targets" into main
Diffstat (limited to 'java')
| -rw-r--r-- | java/res/values/strings.xml | 4 | ||||
| -rw-r--r-- | java/src/com/android/intentresolver/ChooserListAdapter.java | 27 | ||||
| -rw-r--r-- | java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt | 76 |
3 files changed, 89 insertions, 18 deletions
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 4b5367c0..0c772573 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -303,4 +303,8 @@ <string name="exclude_link">Exclude link</string> <!-- Title for a button. Adds back a (previously excluded) web link into the shared content. --> <string name="include_link">Include link</string> + + <!-- Accesssibility content description for a sharesheet target that has been pinned to the + front of the list by the user. [CHAR LIMIT=NONE] --> + <string name="pinned">Pinned</string> </resources> diff --git a/java/src/com/android/intentresolver/ChooserListAdapter.java b/java/src/com/android/intentresolver/ChooserListAdapter.java index e6d6dbf4..d1101f1e 100644 --- a/java/src/com/android/intentresolver/ChooserListAdapter.java +++ b/java/src/com/android/intentresolver/ChooserListAdapter.java @@ -296,11 +296,23 @@ public class ChooserListAdapter extends ResolverListAdapter { CharSequence extendedInfo = info.getExtendedInfo(); String contentDescription = String.join(" ", info.getDisplayLabel(), extendedInfo != null ? extendedInfo : "", appName); + if (info.isPinned()) { + contentDescription = String.join( + ". ", + contentDescription, + mContext.getResources().getString(R.string.pinned)); + } holder.updateContentDescription(contentDescription); if (!info.hasDisplayIcon()) { loadDirectShareIcon((SelectableTargetInfo) info); } } else if (info.isDisplayResolveInfo()) { + if (info.isPinned()) { + holder.updateContentDescription(String.join( + ". ", + info.getDisplayLabel(), + mContext.getResources().getString(R.string.pinned))); + } DisplayResolveInfo dri = (DisplayResolveInfo) info; if (!dri.hasDisplayIcon()) { loadIcon(dri); @@ -384,18 +396,20 @@ public class ChooserListAdapter extends ResolverListAdapter { .stream() .collect(Collectors.groupingBy(target -> target.getResolvedComponentName().getPackageName() - + "#" + target.getDisplayLabel() - + '#' + target.getResolveInfo().userHandle.getIdentifier() + + "#" + target.getDisplayLabel() + + '#' + target.getResolveInfo().userHandle.getIdentifier() )) .values() .stream() .map(appTargets -> (appTargets.size() == 1) - ? appTargets.get(0) - : MultiDisplayResolveInfo.newMultiDisplayResolveInfo(appTargets)) + ? appTargets.get(0) + : MultiDisplayResolveInfo.newMultiDisplayResolveInfo( + appTargets)) .sorted(new ChooserActivity.AzInfoComparator(mContext)) .collect(Collectors.toList()); } + @Override protected void onPostExecute(List<DisplayResolveInfo> newList) { mSortedList = newList; @@ -645,8 +659,8 @@ public class ChooserListAdapter extends ResolverListAdapter { */ @Override AsyncTask<List<ResolvedComponentInfo>, - Void, - List<ResolvedComponentInfo>> createSortingTask(boolean doPostProcessing) { + Void, + List<ResolvedComponentInfo>> createSortingTask(boolean doPostProcessing) { return new AsyncTask<List<ResolvedComponentInfo>, Void, List<ResolvedComponentInfo>>() { @@ -658,6 +672,7 @@ public class ChooserListAdapter extends ResolverListAdapter { Trace.endSection(); return params[0]; } + @Override protected void onPostExecute(List<ResolvedComponentInfo> sortedComponents) { processSortedList(sortedComponents, doPostProcessing); diff --git a/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt b/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt index c8cb4b9b..9b5e2d1c 100644 --- a/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt +++ b/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt @@ -20,6 +20,7 @@ import android.content.ComponentName import android.content.Intent import android.content.pm.PackageManager import android.content.pm.PackageManager.ResolveInfoFlags +import android.content.pm.ShortcutInfo import android.os.UserHandle import android.view.View import android.widget.FrameLayout @@ -33,6 +34,7 @@ import com.android.intentresolver.chooser.TargetInfo import com.android.intentresolver.icons.TargetDataLoader import com.android.intentresolver.logging.EventLog import com.android.internal.R +import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -50,6 +52,8 @@ class ChooserListAdapterTest { } private val context = InstrumentationRegistry.getInstrumentation().context private val resolverListController = mock<ResolverListController>() + private val appLabel = "App" + private val targetLabel = "Target" private val mEventLog = mock<EventLog>() private val mTargetDataLoader = mock<TargetDataLoader>() @@ -132,29 +136,77 @@ class ChooserListAdapterTest { verify(mTargetDataLoader, times(1)).loadAppTargetIcon(any(), any(), any()) } - private fun createSelectableTargetInfo(): TargetInfo = - SelectableTargetInfo.newSelectableTargetInfo( - /* sourceInfo = */ DisplayResolveInfo.newDisplayResolveInfo( - Intent(), - ResolverDataProvider.createResolveInfo(2, 0, userHandle), - "label", - "extended info", - Intent(), - /* resolveInfoPresentationGetter= */ null - ), + @Test + fun onBindView_contentDescription() { + val view = createView() + val viewHolder = ResolverListAdapter.ViewHolder(view) + view.tag = viewHolder + val targetInfo = createSelectableTargetInfo() + testSubject.onBindView(view, targetInfo, 0) + + assertThat(view.contentDescription).isEqualTo("$targetLabel $appLabel") + } + + @Test + fun onBindView_contentDescriptionPinned() { + val view = createView() + val viewHolder = ResolverListAdapter.ViewHolder(view) + view.tag = viewHolder + val targetInfo = createSelectableTargetInfo(true) + testSubject.onBindView(view, targetInfo, 0) + + assertThat(view.contentDescription).isEqualTo("$targetLabel $appLabel. Pinned") + } + + @Test + fun onBindView_displayInfoContentDescriptionPinned() { + val view = createView() + val viewHolder = ResolverListAdapter.ViewHolder(view) + view.tag = viewHolder + val targetInfo = createDisplayResolveInfo(isPinned = true) + testSubject.onBindView(view, targetInfo, 0) + + assertThat(view.contentDescription).isEqualTo("$appLabel. Pinned") + } + + private fun createSelectableTargetInfo(isPinned: Boolean = false): TargetInfo { + val shortcutInfo = + createShortcutInfo("id-1", ComponentName("pkg", "Class"), 1).apply { + if (isPinned) { + addFlags(ShortcutInfo.FLAG_PINNED) + } + } + return SelectableTargetInfo.newSelectableTargetInfo( + /* sourceInfo = */ createDisplayResolveInfo(isPinned), /* backupResolveInfo = */ mock(), /* resolvedIntent = */ Intent(), /* chooserTarget = */ createChooserTarget( - "Target", + targetLabel, 0.5f, ComponentName("pkg", "Class"), "id-1" ), /* modifiedScore = */ 1f, - /* shortcutInfo = */ createShortcutInfo("id-1", ComponentName("pkg", "Class"), 1), + shortcutInfo, /* appTarget */ null, /* referrerFillInIntent = */ Intent() ) + } + + private fun createDisplayResolveInfo(isPinned: Boolean = false): DisplayResolveInfo = + DisplayResolveInfo.newDisplayResolveInfo( + Intent(), + ResolverDataProvider.createResolveInfo(2, 0, userHandle), + appLabel, + "extended info", + Intent(), + /* resolveInfoPresentationGetter= */ null + ) + .apply { + if (isPinned) { + setPinned(true) + } + } private fun createView(): View { val view = FrameLayout(context) |