summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
author Matt Casey <mrcasey@google.com> 2023-09-06 14:30:51 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-09-06 14:30:51 +0000
commit4139803cc70b96ef321d25cdabf0de074d0b6a14 (patch)
treee06220629d5f4298d13c7a9967aac4f6f66bdab7 /java
parent87868f08dc662013308aba277fd7737d59dffd67 (diff)
parentc9fbc2e62505d8192a353e9322231d870c7cb923 (diff)
Merge "Append "Pinned" to content description for pinned targets" into main
Diffstat (limited to 'java')
-rw-r--r--java/res/values/strings.xml4
-rw-r--r--java/src/com/android/intentresolver/ChooserListAdapter.java27
-rw-r--r--java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt76
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)