summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/aidl/com/android/intentresolver/IChooserController.aidl8
-rw-r--r--java/aidl/com/android/intentresolver/IChooserInteractiveSessionCallback.aidl9
-rw-r--r--java/res/color/resolver_profile_tab_text.xml2
-rw-r--r--java/res/drawable/ic_drag_handle.xml2
-rw-r--r--java/res/drawable/resolver_profile_tab_bg.xml2
-rw-r--r--java/res/layout/chooser_grid_item.xml2
-rw-r--r--java/res/layout/chooser_grid_item_hover.xml2
-rw-r--r--java/res/layout/chooser_row.xml1
-rw-r--r--java/res/layout/chooser_row_direct_share.xml1
-rw-r--r--java/res/layout/resolver_profile_tab_button.xml1
-rw-r--r--java/res/values-af/strings.xml6
-rw-r--r--java/res/values-am/strings.xml6
-rw-r--r--java/res/values-ar/strings.xml6
-rw-r--r--java/res/values-as/strings.xml6
-rw-r--r--java/res/values-az/strings.xml6
-rw-r--r--java/res/values-b+sr+Latn/strings.xml8
-rw-r--r--java/res/values-be/strings.xml6
-rw-r--r--java/res/values-bg/strings.xml6
-rw-r--r--java/res/values-bn/strings.xml6
-rw-r--r--java/res/values-bs/strings.xml10
-rw-r--r--java/res/values-ca/strings.xml8
-rw-r--r--java/res/values-cs/strings.xml6
-rw-r--r--java/res/values-da/strings.xml6
-rw-r--r--java/res/values-de/strings.xml10
-rw-r--r--java/res/values-el/strings.xml6
-rw-r--r--java/res/values-en-rAU/strings.xml6
-rw-r--r--java/res/values-en-rCA/strings.xml6
-rw-r--r--java/res/values-en-rGB/strings.xml6
-rw-r--r--java/res/values-en-rIN/strings.xml6
-rw-r--r--java/res/values-es-rUS/strings.xml6
-rw-r--r--java/res/values-es/strings.xml8
-rw-r--r--java/res/values-et/strings.xml6
-rw-r--r--java/res/values-eu/strings.xml10
-rw-r--r--java/res/values-fa/strings.xml6
-rw-r--r--java/res/values-fi/strings.xml6
-rw-r--r--java/res/values-fr-rCA/strings.xml6
-rw-r--r--java/res/values-fr/strings.xml6
-rw-r--r--java/res/values-gl/strings.xml6
-rw-r--r--java/res/values-gu/strings.xml6
-rw-r--r--java/res/values-hi/strings.xml6
-rw-r--r--java/res/values-hr/strings.xml6
-rw-r--r--java/res/values-hu/strings.xml6
-rw-r--r--java/res/values-hy/strings.xml6
-rw-r--r--java/res/values-in/strings.xml6
-rw-r--r--java/res/values-is/strings.xml8
-rw-r--r--java/res/values-it/strings.xml10
-rw-r--r--java/res/values-iw/strings.xml8
-rw-r--r--java/res/values-ja/strings.xml10
-rw-r--r--java/res/values-ka/strings.xml6
-rw-r--r--java/res/values-kk/strings.xml10
-rw-r--r--java/res/values-km/strings.xml6
-rw-r--r--java/res/values-kn/strings.xml6
-rw-r--r--java/res/values-ko/strings.xml6
-rw-r--r--java/res/values-ky/strings.xml6
-rw-r--r--java/res/values-lo/strings.xml6
-rw-r--r--java/res/values-lt/strings.xml6
-rw-r--r--java/res/values-lv/strings.xml6
-rw-r--r--java/res/values-mk/strings.xml8
-rw-r--r--java/res/values-ml/strings.xml6
-rw-r--r--java/res/values-mn/strings.xml6
-rw-r--r--java/res/values-mr/strings.xml6
-rw-r--r--java/res/values-ms/strings.xml6
-rw-r--r--java/res/values-my/strings.xml6
-rw-r--r--java/res/values-nb/strings.xml6
-rw-r--r--java/res/values-ne/strings.xml8
-rw-r--r--java/res/values-nl/strings.xml6
-rw-r--r--java/res/values-or/strings.xml6
-rw-r--r--java/res/values-pa/strings.xml6
-rw-r--r--java/res/values-pl/strings.xml6
-rw-r--r--java/res/values-pt-rBR/strings.xml6
-rw-r--r--java/res/values-pt-rPT/strings.xml6
-rw-r--r--java/res/values-pt/strings.xml6
-rw-r--r--java/res/values-ro/strings.xml6
-rw-r--r--java/res/values-ru/strings.xml8
-rw-r--r--java/res/values-si/strings.xml6
-rw-r--r--java/res/values-sk/strings.xml16
-rw-r--r--java/res/values-sl/strings.xml6
-rw-r--r--java/res/values-sq/strings.xml6
-rw-r--r--java/res/values-sr/strings.xml8
-rw-r--r--java/res/values-sv/strings.xml6
-rw-r--r--java/res/values-sw/strings.xml10
-rw-r--r--java/res/values-ta/strings.xml6
-rw-r--r--java/res/values-te/strings.xml10
-rw-r--r--java/res/values-th/strings.xml8
-rw-r--r--java/res/values-tl/strings.xml6
-rw-r--r--java/res/values-tr/strings.xml8
-rw-r--r--java/res/values-uk/strings.xml6
-rw-r--r--java/res/values-ur/strings.xml6
-rw-r--r--java/res/values-uz/strings.xml6
-rw-r--r--java/res/values-vi/strings.xml10
-rw-r--r--java/res/values-zh-rCN/strings.xml6
-rw-r--r--java/res/values-zh-rHK/strings.xml6
-rw-r--r--java/res/values-zh-rTW/strings.xml6
-rw-r--r--java/res/values-zu/strings.xml6
-rw-r--r--java/res/values/strings.xml20
-rw-r--r--java/src/android/service/chooser/ChooserSession.kt39
-rw-r--r--java/src/com/android/intentresolver/ChooserActivity.java178
-rw-r--r--java/src/com/android/intentresolver/ChooserGridLayoutManager.java131
-rw-r--r--java/src/com/android/intentresolver/ChooserHelper.kt9
-rw-r--r--java/src/com/android/intentresolver/ChooserListAdapter.java7
-rw-r--r--java/src/com/android/intentresolver/ChooserSelector.kt52
-rw-r--r--java/src/com/android/intentresolver/IntentForwarderActivity.java32
-rw-r--r--java/src/com/android/intentresolver/ProfileHelper.kt9
-rw-r--r--java/src/com/android/intentresolver/ResolverActivity.java5
-rw-r--r--java/src/com/android/intentresolver/contentpreview/CachingImagePreviewImageLoader.kt110
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java3
-rw-r--r--java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java9
-rw-r--r--java/src/com/android/intentresolver/contentpreview/HeadlineGenerator.kt2
-rw-r--r--java/src/com/android/intentresolver/contentpreview/HeadlineGeneratorImpl.kt29
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ImageLoaderModule.kt15
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt178
-rw-r--r--java/src/com/android/intentresolver/contentpreview/PreviewImageLoader.kt19
-rw-r--r--java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java2
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ModifierExt.kt118
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt330
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselPreviewViewModel.kt2
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt31
-rw-r--r--java/src/com/android/intentresolver/data/model/ChooserRequest.kt6
-rw-r--r--java/src/com/android/intentresolver/data/repository/ChooserRequestRepository.kt5
-rw-r--r--java/src/com/android/intentresolver/grid/ChooserGridAdapter.java6
-rw-r--r--java/src/com/android/intentresolver/inject/FeatureFlagsModule.kt41
-rw-r--r--java/src/com/android/intentresolver/interactive/data/repository/InteractiveSessionCallbackRepository.kt54
-rw-r--r--java/src/com/android/intentresolver/interactive/domain/interactor/InteractiveSessionInteractor.kt139
-rw-r--r--java/src/com/android/intentresolver/interactive/domain/interactor/SafeChooserInteractiveSessionCallback.kt43
-rw-r--r--java/src/com/android/intentresolver/interactive/domain/model/ChooserIntentUpdater.kt36
-rw-r--r--java/src/com/android/intentresolver/shared/model/ActivityModel.kt5
-rw-r--r--java/src/com/android/intentresolver/shortcuts/ShortcutLoader.kt12
-rw-r--r--java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt25
-rw-r--r--java/src/com/android/intentresolver/ui/viewmodel/ChooserViewModel.kt9
-rw-r--r--java/src/com/android/intentresolver/widget/ChooserTargetItemView.kt17
-rw-r--r--java/src/com/android/intentresolver/widget/ResolverDrawerLayout.java4
-rw-r--r--java/src/com/android/intentresolver/widget/ResolverDrawerLayoutExt.kt51
132 files changed, 1680 insertions, 705 deletions
diff --git a/java/aidl/com/android/intentresolver/IChooserController.aidl b/java/aidl/com/android/intentresolver/IChooserController.aidl
new file mode 100644
index 00000000..a4ce718d
--- /dev/null
+++ b/java/aidl/com/android/intentresolver/IChooserController.aidl
@@ -0,0 +1,8 @@
+
+package com.android.intentresolver;
+
+import android.content.Intent;
+
+interface IChooserController {
+ oneway void updateIntent(in Intent intent);
+}
diff --git a/java/aidl/com/android/intentresolver/IChooserInteractiveSessionCallback.aidl b/java/aidl/com/android/intentresolver/IChooserInteractiveSessionCallback.aidl
new file mode 100644
index 00000000..4a6179d9
--- /dev/null
+++ b/java/aidl/com/android/intentresolver/IChooserInteractiveSessionCallback.aidl
@@ -0,0 +1,9 @@
+
+package com.android.intentresolver;
+
+import com.android.intentresolver.IChooserController;
+
+interface IChooserInteractiveSessionCallback {
+ oneway void registerChooserController(in IChooserController updater);
+ oneway void onDrawerVerticalOffsetChanged(in int offset);
+}
diff --git a/java/res/color/resolver_profile_tab_text.xml b/java/res/color/resolver_profile_tab_text.xml
index ffeba854..f6a4eadf 100644
--- a/java/res/color/resolver_profile_tab_text.xml
+++ b/java/res/color/resolver_profile_tab_text.xml
@@ -16,5 +16,5 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:color="@androidprv:color/materialColorOnPrimary" android:state_selected="true"/>
- <item android:color="@androidprv:color/materialColorOnSurfaceVariant"/>
+ <item android:color="@androidprv:color/materialColorOnSurface"/>
</selector>
diff --git a/java/res/drawable/ic_drag_handle.xml b/java/res/drawable/ic_drag_handle.xml
index d6965209..96297a2e 100644
--- a/java/res/drawable/ic_drag_handle.xml
+++ b/java/res/drawable/ic_drag_handle.xml
@@ -17,6 +17,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle" >
- <solid android:color="@androidprv:color/materialColorOutlineVariant" />
+ <solid android:color="@androidprv:color/materialColorOutline" />
<corners android:radius="2dp" />
</shape>
diff --git a/java/res/drawable/resolver_profile_tab_bg.xml b/java/res/drawable/resolver_profile_tab_bg.xml
index 20f0be92..392f7e30 100644
--- a/java/res/drawable/resolver_profile_tab_bg.xml
+++ b/java/res/drawable/resolver_profile_tab_bg.xml
@@ -29,7 +29,7 @@
<item android:state_selected="false">
<shape android:shape="rectangle">
<corners android:radius="12dp" />
- <solid android:color="@androidprv:color/materialColorSurfaceContainerHighest" />
+ <solid android:color="@androidprv:color/materialColorSurfaceBright" />
</shape>
</item>
diff --git a/java/res/layout/chooser_grid_item.xml b/java/res/layout/chooser_grid_item.xml
index 76d2e60f..b06cf1c9 100644
--- a/java/res/layout/chooser_grid_item.xml
+++ b/java/res/layout/chooser_grid_item.xml
@@ -18,7 +18,7 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
- android:id="@androidprv:id/item"
+ android:id="@+id/item"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/java/res/layout/chooser_grid_item_hover.xml b/java/res/layout/chooser_grid_item_hover.xml
index 5e49c9fd..4f4cd38c 100644
--- a/java/res/layout/chooser_grid_item_hover.xml
+++ b/java/res/layout/chooser_grid_item_hover.xml
@@ -20,7 +20,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@androidprv:id/item"
+ android:id="@+id/item"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/java/res/layout/chooser_row.xml b/java/res/layout/chooser_row.xml
index bbe65a85..3fe1ee7d 100644
--- a/java/res/layout/chooser_row.xml
+++ b/java/res/layout/chooser_row.xml
@@ -18,6 +18,7 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ android:id="@+id/suggested_apps_container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="100dp"
diff --git a/java/res/layout/chooser_row_direct_share.xml b/java/res/layout/chooser_row_direct_share.xml
index d7e36eed..53e666a6 100644
--- a/java/res/layout/chooser_row_direct_share.xml
+++ b/java/res/layout/chooser_row_direct_share.xml
@@ -17,6 +17,7 @@
*/
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/shortcuts_container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="200dp">
diff --git a/java/res/layout/resolver_profile_tab_button.xml b/java/res/layout/resolver_profile_tab_button.xml
index 52a1aacf..7404dc33 100644
--- a/java/res/layout/resolver_profile_tab_button.xml
+++ b/java/res/layout/resolver_profile_tab_button.xml
@@ -17,7 +17,6 @@
<Button
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index a0b78850..12a44b0e 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Sluit skakel uit"</string>
<string name="include_link" msgid="827855767220339802">"Sluit skakel in"</string>
<string name="pinned" msgid="7623664001331394139">"Vasgespeld"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Kiesbare prent"</string>
<string name="selectable_video" msgid="1271768647699300826">"Kiesbare video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Kiesbare item"</string>
<string name="role_description_button" msgid="4537198530568333649">"Knoppie"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Direktedelingteikens"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Appvoorstelle"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Applys"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopieer teks"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopieer skakel"</string>
</resources>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
index d46f88d1..64cea88a 100644
--- a/java/res/values-am/strings.xml
+++ b/java/res/values-am/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"አገናኝን አታካትት"</string>
<string name="include_link" msgid="827855767220339802">"አገናኝ አካትት"</string>
<string name="pinned" msgid="7623664001331394139">"ፒን ተደርጓል"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"ንጥል <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"ሊመረጥ የሚችል ምስል"</string>
<string name="selectable_video" msgid="1271768647699300826">"ሊመረጥ የሚችል ቪድዮ"</string>
<string name="selectable_item" msgid="7557320816744205280">"ሊመረጥ የሚችል ንጥል"</string>
<string name="role_description_button" msgid="4537198530568333649">"አዝራር"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"የቀጥታ ማጋራት ዒላማዎች"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"የመተግበሪያ አስተያየቶች"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"የመተግበሪያ ዝርዝር"</string>
+ <string name="copy_text" msgid="1341801611046464360">"ጽሑፍ ቅዳ"</string>
+ <string name="copy_link" msgid="3822142723771306592">"አገናኝ ቅዳ"</string>
</resources>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index 278e03f2..b170e7f9 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"استثناء الرابط"</string>
<string name="include_link" msgid="827855767220339802">"تضمين الرابط"</string>
<string name="pinned" msgid="7623664001331394139">"مثبَّت"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"العنصر رقم <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"صورة يمكن اختيارها"</string>
<string name="selectable_video" msgid="1271768647699300826">"فيديو يمكن اختياره"</string>
<string name="selectable_item" msgid="7557320816744205280">"عنصر يمكن اختياره"</string>
<string name="role_description_button" msgid="4537198530568333649">"زرّ"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"أهداف المشاركة المباشرة"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"التطبيقات المقترَحة"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"قائمة التطبيقات"</string>
+ <string name="copy_text" msgid="1341801611046464360">"نسخ النص"</string>
+ <string name="copy_link" msgid="3822142723771306592">"نسخ الرابط"</string>
</resources>
diff --git a/java/res/values-as/strings.xml b/java/res/values-as/strings.xml
index 2177c527..fd0a407e 100644
--- a/java/res/values-as/strings.xml
+++ b/java/res/values-as/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"লিংক বহিৰ্ভূত কৰক"</string>
<string name="include_link" msgid="827855767220339802">"লিংক অন্তৰ্ভুক্ত কৰক"</string>
<string name="pinned" msgid="7623664001331394139">"পিন কৰা আছে"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"বস্তু <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"বাছনি কৰিব পৰা প্ৰতিচ্ছবি"</string>
<string name="selectable_video" msgid="1271768647699300826">"বাছনি কৰিব পৰা ভিডিঅ’"</string>
<string name="selectable_item" msgid="7557320816744205280">"বাছনি কৰিব পৰা বস্তু"</string>
<string name="role_description_button" msgid="4537198530568333649">"বুটাম"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"পোনপটীয়াকৈ কৰা শ্বেয়াৰৰ লক্ষ্য"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"এপৰ পৰামৰ্শ"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"এপৰ সূচী"</string>
+ <string name="copy_text" msgid="1341801611046464360">"পাঠ প্ৰতিলিপি কৰক"</string>
+ <string name="copy_link" msgid="3822142723771306592">"লিংক প্ৰতিলিপি কৰক"</string>
</resources>
diff --git a/java/res/values-az/strings.xml b/java/res/values-az/strings.xml
index 93086938..46baccee 100644
--- a/java/res/values-az/strings.xml
+++ b/java/res/values-az/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Keçidi istisna edin"</string>
<string name="include_link" msgid="827855767220339802">"Keçid daxil edin"</string>
<string name="pinned" msgid="7623664001331394139">"Bərkidilib"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Element <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Seçilə bilən şəkil"</string>
<string name="selectable_video" msgid="1271768647699300826">"Seçilə bilən video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Seçilə bilən element"</string>
<string name="role_description_button" msgid="4537198530568333649">"Düymə"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Birbaşa paylaşım hədəfləri"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Tətbiq təklifləri"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Tətbiq siyahısı"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Mətni kopyalayın"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Keçidi kopyalayın"</string>
</resources>
diff --git a/java/res/values-b+sr+Latn/strings.xml b/java/res/values-b+sr+Latn/strings.xml
index 86fc1854..64ae817b 100644
--- a/java/res/values-b+sr+Latn/strings.xml
+++ b/java/res/values-b+sr+Latn/strings.xml
@@ -56,7 +56,7 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{i još # fajl}one{i još # fajl}few{i još # fajla}other{i još # fajlova}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{+ još # fajl}one{+ još # fajl}few{+ još # fajla}other{+ još # fajlova}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"Deli se tekst"</string>
- <string name="sharing_link" msgid="2307694372813942916">"Deli se link"</string>
+ <string name="sharing_link" msgid="2307694372813942916">"Deljenje linka"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Deljenje slike}one{Deljenje # slike}few{Deljenje # slike}other{Deljenje # slika}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Deli se video}one{Deli se # video}few{Dele se # video snimka}other{Deli se # videa}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Deli se # fajl}one{Deli se # fajl}few{Dele se # fajla}other{Deli se # fajlova}}"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Izuzmi link"</string>
<string name="include_link" msgid="827855767220339802">"Uvrsti link"</string>
<string name="pinned" msgid="7623664001331394139">"Zakačeno"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Stavka <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Slika koja može da se izabere"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video koji može da se izabere"</string>
<string name="selectable_item" msgid="7557320816744205280">"Stavka koja može da se izabere"</string>
<string name="role_description_button" msgid="4537198530568333649">"Dugme"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Ciljevi direktnog deljenja"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Predlozi aplikacija"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista aplikacija"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopiraj tekst"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopiraj link"</string>
</resources>
diff --git a/java/res/values-be/strings.xml b/java/res/values-be/strings.xml
index 97ca27d3..b51e0922 100644
--- a/java/res/values-be/strings.xml
+++ b/java/res/values-be/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Выдаліць спасылку"</string>
<string name="include_link" msgid="827855767220339802">"Дадаць спасылку"</string>
<string name="pinned" msgid="7623664001331394139">"Замацавана"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Элемент <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Відарыс, які можна выбраць"</string>
<string name="selectable_video" msgid="1271768647699300826">"Відэа, якое можна выбраць"</string>
<string name="selectable_item" msgid="7557320816744205280">"Элемент, які можна выбраць"</string>
<string name="role_description_button" msgid="4537198530568333649">"Кнопка"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Адрасаты для прамога абагульвання"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Прапановы праграм"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Спіс праграм"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Скапіраваць тэкст"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Скапіраваць спасылку"</string>
</resources>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index 3cec0cdf..0fcb751e 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Изключване на връзката"</string>
<string name="include_link" msgid="827855767220339802">"Включване на връзката"</string>
<string name="pinned" msgid="7623664001331394139">"Фиксирано"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Елемент <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Избираемо изображение"</string>
<string name="selectable_video" msgid="1271768647699300826">"Избираем видеоклип"</string>
<string name="selectable_item" msgid="7557320816744205280">"Избираем елемент"</string>
<string name="role_description_button" msgid="4537198530568333649">"Бутон"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Цели за директно споделяне"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Предложения за приложения"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Списък с приложения"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Копиране на текста"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Копиране на връзката"</string>
</resources>
diff --git a/java/res/values-bn/strings.xml b/java/res/values-bn/strings.xml
index ea524006..544f57de 100644
--- a/java/res/values-bn/strings.xml
+++ b/java/res/values-bn/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"লিঙ্ক বাদ দিন"</string>
<string name="include_link" msgid="827855767220339802">"লিঙ্ক যোগ করুন"</string>
<string name="pinned" msgid="7623664001331394139">"পিন করা হয়েছে"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"আইটেম <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"বেছে নেওয়া যাবে এমন ছবি"</string>
<string name="selectable_video" msgid="1271768647699300826">"বেছে নেওয়া যাবে এমন ভিডিও"</string>
<string name="selectable_item" msgid="7557320816744205280">"বেছে নেওয়া যাবে এমন আইটেম"</string>
<string name="role_description_button" msgid="4537198530568333649">"বোতাম"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"সরাসরি টার্গেট শেয়ার করুন"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"অ্যাপ সাজেশন"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"অ্যাপ তালিকা"</string>
+ <string name="copy_text" msgid="1341801611046464360">"টেক্সট কপি করুন"</string>
+ <string name="copy_link" msgid="3822142723771306592">"লিঙ্ক কপি করুন"</string>
</resources>
diff --git a/java/res/values-bs/strings.xml b/java/res/values-bs/strings.xml
index ddf3119b..52b9f191 100644
--- a/java/res/values-bs/strings.xml
+++ b/java/res/values-bs/strings.xml
@@ -56,7 +56,7 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{i još # fajl}one{i još # fajl}few{i još # fajla}other{i još # fajlova}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{i još # fajl}one{i još # fajl}few{i još # fajla}other{i još # fajlova}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"Dijeljenje teksta"</string>
- <string name="sharing_link" msgid="2307694372813942916">"Dijeljenje linka"</string>
+ <string name="sharing_link" msgid="2307694372813942916">"Podijelite link"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Podijelite sliku}one{Podijelite # sliku}few{Podijelite # slike}other{Podijelite # slika}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Dijeljenje videozapisa}one{Dijeljenje # videozapisa}few{Dijeljenje # videozapisa}other{Dijeljenje # videozapisa}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Dijeljenje # fajla}one{Dijeljenje # fajla}few{Dijeljenje # fajla}other{Dijeljenje # fajlova}}"</string>
@@ -85,7 +85,7 @@
<string name="resolver_cross_profile_blocked" msgid="3515194063758605377">"Blokirao je vaš IT administrator"</string>
<string name="resolver_cant_share_with_work_apps_explanation" msgid="2984105853145456723">"Ovaj sadržaj nije moguće dijeliti pomoću poslovnih aplikacija"</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1463093773348988122">"Ovaj sadržaj nije moguće otvoriti pomoću poslovnih aplikacija"</string>
- <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"Ovaj sadržaj nije moguće dijeliti pomoću ličnih aplikacija"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"Ovaj sadržaj nije moguće dijeliti s ličnim aplikacijama"</string>
<string name="resolver_cant_access_personal_apps_explanation" msgid="6209543716289792706">"Ovaj sadržaj nije moguće otvoriti pomoću ličnih aplikacija"</string>
<string name="resolver_cant_share_with_private_apps_explanation" msgid="1781980997411434697">"Sadržaj se ne može dijeliti pomoću privatnih aplikacija"</string>
<string name="resolver_cant_access_private_apps_explanation" msgid="5978609934961648342">"Sadržaj se ne može otvoriti pomoću privatnih aplikacija"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Izuzmi link"</string>
<string name="include_link" msgid="827855767220339802">"Uključi link"</string>
<string name="pinned" msgid="7623664001331394139">"Zakačeno"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g>. stavka"</string>
<string name="selectable_image" msgid="3157858923437182271">"Slika koju je moguće odabrati"</string>
<string name="selectable_video" msgid="1271768647699300826">"Videozapis koji je moguće odabrati"</string>
<string name="selectable_item" msgid="7557320816744205280">"Stavka koju je moguće odabrati"</string>
<string name="role_description_button" msgid="4537198530568333649">"Dugme"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Ciljevi direktnog dijeljenja"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Prijedlozi aplikacija"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista aplikacija"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopiranje teksta"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopiranje linka"</string>
</resources>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index 48d7138f..23ae264b 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -57,7 +57,7 @@
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{# fitxer més}many{# de fitxers més}other{# fitxers més}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"S\'està compartint text"</string>
<string name="sharing_link" msgid="2307694372813942916">"S\'està compartint un enllaç"</string>
- <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Comparteix una imatge}many{Comparteix # d\'imatges}other{Comparteix # imatges}}"</string>
+ <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{]S\'està compartint una imatge}many{S\'estan compartint # d\'imatges}other{S\'estan compartint # imatges}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{S\'està compartint un vídeo}many{S\'estan compartint # de vídeos}other{S\'estan compartint # vídeos}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{S\'està compartint # fitxer}many{S\'estan compartint # de fitxers}other{S\'estan compartint # fitxers}}"</string>
<string name="select_items_to_share" msgid="1026071777275022579">"Selecciona els elements que vols compartir"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Exclou l\'enllaç"</string>
<string name="include_link" msgid="827855767220339802">"Inclou l\'enllaç"</string>
<string name="pinned" msgid="7623664001331394139">"Fixat"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Element <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Imatge seleccionable"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vídeo seleccionable"</string>
<string name="selectable_item" msgid="7557320816744205280">"Element seleccionable"</string>
<string name="role_description_button" msgid="4537198530568333649">"Botó"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Destinataris de la compartició directa"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Suggeriments d\'aplicacions"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Llista d\'aplicacions"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copia el text"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copia l\'enllaç"</string>
</resources>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index 151e2147..41fec051 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Vyloučit odkaz"</string>
<string name="include_link" msgid="827855767220339802">"Zahrnout odkaz"</string>
<string name="pinned" msgid="7623664001331394139">"Připnuto"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Položka <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Vybratelný obrázek"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vybratelné video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Vybratelná položka"</string>
<string name="role_description_button" msgid="4537198530568333649">"Tlačítko"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Přímé sdílení cílů"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Návrhy aplikací"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Seznam aplikací"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopírovat text"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopírovat odkaz"</string>
</resources>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index e9d952fe..1fe8da30 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Ekskluder link"</string>
<string name="include_link" msgid="827855767220339802">"Inkluder link"</string>
<string name="pinned" msgid="7623664001331394139">"Fastgjort"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Element <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Billede, der kan vælges"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video, der kan vælges"</string>
<string name="selectable_item" msgid="7557320816744205280">"Element, der kan vælges"</string>
<string name="role_description_button" msgid="4537198530568333649">"Knap"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Personer/grupper, der skal deles direkte med"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Appforslag"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Appliste"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopiér tekst"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopiér link"</string>
</resources>
diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml
index 911dd273..497f1e71 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -83,9 +83,9 @@
<string name="resolver_work_tab_accessibility" msgid="7581878836587799920">"Geschäftliche Ansicht"</string>
<string name="resolver_private_tab_accessibility" msgid="2513122834337197252">"Private Ansicht"</string>
<string name="resolver_cross_profile_blocked" msgid="3515194063758605377">"Vom IT‑Administrator blockiert"</string>
- <string name="resolver_cant_share_with_work_apps_explanation" msgid="2984105853145456723">"Diese Art von Inhalt kann nicht über geschäftliche Apps geteilt werden"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="2984105853145456723">"Dieser Inhalt kann nicht über geschäftliche Apps geteilt werden"</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1463093773348988122">"Diese Art von Inhalt kann nicht mit geschäftlichen Apps geöffnet werden"</string>
- <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"Diese Art von Inhalt kann nicht über private Apps geteilt werden"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"Dieser Inhalt kann nicht über private Apps geteilt werden"</string>
<string name="resolver_cant_access_personal_apps_explanation" msgid="6209543716289792706">"Diese Art von Inhalt kann nicht mit privaten Apps geöffnet werden"</string>
<string name="resolver_cant_share_with_private_apps_explanation" msgid="1781980997411434697">"Diese Art von Inhalt kann nicht über interne Apps geteilt werden"</string>
<string name="resolver_cant_access_private_apps_explanation" msgid="5978609934961648342">"Diese Art von Inhalt kann nicht mit internen Apps geöffnet werden"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Link ausschließen"</string>
<string name="include_link" msgid="827855767220339802">"Link einschließen"</string>
<string name="pinned" msgid="7623664001331394139">"Angepinnt"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Element <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Auswählbares Bild"</string>
<string name="selectable_video" msgid="1271768647699300826">"Auswählbares Video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Auswählbares Element"</string>
<string name="role_description_button" msgid="4537198530568333649">"Schaltfläche"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"„Direct Share“-Ziele"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"App-Vorschläge"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"App-Liste"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Text kopieren"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Link kopieren"</string>
</resources>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index 319a3e2c..d84f7621 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Εξαίρεση συνδέσμου"</string>
<string name="include_link" msgid="827855767220339802">"Συμπερίληψη συνδέσμου"</string>
<string name="pinned" msgid="7623664001331394139">"Καρφιτσωμένο"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Στοιχείο <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Εικόνα με δυνατότητα επιλογής"</string>
<string name="selectable_video" msgid="1271768647699300826">"Βίντεο με δυνατότητα επιλογής"</string>
<string name="selectable_item" msgid="7557320816744205280">"Στοιχείο με δυνατότητα επιλογής"</string>
<string name="role_description_button" msgid="4537198530568333649">"Κουμπί"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Στοχευόμενοι χρήστες για Άμεση κοινή χρήση"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Προτεινόμενες εφαρμογές"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Λίστα εφαρμογών"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Αντιγραφή κειμένου"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Αντιγραφή συνδέσμου"</string>
</resources>
diff --git a/java/res/values-en-rAU/strings.xml b/java/res/values-en-rAU/strings.xml
index 4d16a6f4..d4fb97e0 100644
--- a/java/res/values-en-rAU/strings.xml
+++ b/java/res/values-en-rAU/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Exclude link"</string>
<string name="include_link" msgid="827855767220339802">"Include link"</string>
<string name="pinned" msgid="7623664001331394139">"Pinned"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Selectable image"</string>
<string name="selectable_video" msgid="1271768647699300826">"Selectable video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Selectable item"</string>
<string name="role_description_button" msgid="4537198530568333649">"Button"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Direct share targets"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"App suggestions"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"App list"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copy text"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copy link"</string>
</resources>
diff --git a/java/res/values-en-rCA/strings.xml b/java/res/values-en-rCA/strings.xml
index 9f6d20c3..eca4abcc 100644
--- a/java/res/values-en-rCA/strings.xml
+++ b/java/res/values-en-rCA/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Exclude link"</string>
<string name="include_link" msgid="827855767220339802">"Include link"</string>
<string name="pinned" msgid="7623664001331394139">"Pinned"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Selectable image"</string>
<string name="selectable_video" msgid="1271768647699300826">"Selectable video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Selectable item"</string>
<string name="role_description_button" msgid="4537198530568333649">"Button"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Direct share targets"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"App suggestions"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"App list"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copy text"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copy link"</string>
</resources>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index 4d16a6f4..d4fb97e0 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Exclude link"</string>
<string name="include_link" msgid="827855767220339802">"Include link"</string>
<string name="pinned" msgid="7623664001331394139">"Pinned"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Selectable image"</string>
<string name="selectable_video" msgid="1271768647699300826">"Selectable video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Selectable item"</string>
<string name="role_description_button" msgid="4537198530568333649">"Button"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Direct share targets"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"App suggestions"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"App list"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copy text"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copy link"</string>
</resources>
diff --git a/java/res/values-en-rIN/strings.xml b/java/res/values-en-rIN/strings.xml
index 4d16a6f4..d4fb97e0 100644
--- a/java/res/values-en-rIN/strings.xml
+++ b/java/res/values-en-rIN/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Exclude link"</string>
<string name="include_link" msgid="827855767220339802">"Include link"</string>
<string name="pinned" msgid="7623664001331394139">"Pinned"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Selectable image"</string>
<string name="selectable_video" msgid="1271768647699300826">"Selectable video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Selectable item"</string>
<string name="role_description_button" msgid="4537198530568333649">"Button"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Direct share targets"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"App suggestions"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"App list"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copy text"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copy link"</string>
</resources>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index 923e9d36..fa61afab 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Excluir vínculo"</string>
<string name="include_link" msgid="827855767220339802">"Incluir vínculo"</string>
<string name="pinned" msgid="7623664001331394139">"Fijado"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Elemento <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Imagen seleccionable"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video seleccionable"</string>
<string name="selectable_item" msgid="7557320816744205280">"Elemento seleccionable"</string>
<string name="role_description_button" msgid="4537198530568333649">"Botón"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Objetivos de uso compartido directo"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Sugerencias de aplicaciones"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista de apps"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copiar texto"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copiar vínculo"</string>
</resources>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index 7cb07c61..a7fa6a14 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -56,7 +56,7 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # archivo}many{+ # archivos}other{+ # archivos}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{y # archivo más}many{y # archivos más}other{y # archivos más}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"Compartir texto"</string>
- <string name="sharing_link" msgid="2307694372813942916">"Compartiendo enlace"</string>
+ <string name="sharing_link" msgid="2307694372813942916">"Compartir enlace"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Compartiendo imagen}many{Compartiendo # imágenes}other{Compartiendo # imágenes}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Compartiendo vídeo}many{Compartiendo # vídeos}other{Compartiendo # vídeos}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Compartiendo # archivo}many{Compartiendo # archivos}other{Compartiendo # archivos}}"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Excluir enlace"</string>
<string name="include_link" msgid="827855767220339802">"Incluir enlace"</string>
<string name="pinned" msgid="7623664001331394139">"Fijado"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Elemento <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Imagen seleccionable"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vídeo seleccionable"</string>
<string name="selectable_item" msgid="7557320816744205280">"Elemento seleccionable"</string>
<string name="role_description_button" msgid="4537198530568333649">"Botón"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Objetivos de compartición directa"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Sugerencias de aplicaciones"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista de aplicaciones"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copiar texto"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copiar enlace"</string>
</resources>
diff --git a/java/res/values-et/strings.xml b/java/res/values-et/strings.xml
index 6a17f5b3..67584bec 100644
--- a/java/res/values-et/strings.xml
+++ b/java/res/values-et/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Välista link"</string>
<string name="include_link" msgid="827855767220339802">"Kaasa link"</string>
<string name="pinned" msgid="7623664001331394139">"Kinnitatud"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Üksus <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Valitav pilt"</string>
<string name="selectable_video" msgid="1271768647699300826">"Valitav video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Valitav üksus"</string>
<string name="role_description_button" msgid="4537198530568333649">"Nupp"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Otsejagamise sihtmärgid"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Rakenduste soovitused"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Rakenduste loend"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopeeri tekst"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopeeri link"</string>
</resources>
diff --git a/java/res/values-eu/strings.xml b/java/res/values-eu/strings.xml
index e80edad4..03e617ee 100644
--- a/java/res/values-eu/strings.xml
+++ b/java/res/values-eu/strings.xml
@@ -57,7 +57,7 @@
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{eta beste # fitxategi}other{eta beste # fitxategi}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"Partekatuko den testua"</string>
<string name="sharing_link" msgid="2307694372813942916">"Esteka partekatzen"</string>
- <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Irudia partekatuko da}other{# irudi partekatuko dira}}"</string>
+ <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Irudia partekatzen}other{# irudi partekatzen}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Bideoa partekatzen}other{# bideo partekatzen}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{# fitxategi partekatuko da}other{# fitxategi partekatuko dira}}"</string>
<string name="select_items_to_share" msgid="1026071777275022579">"Hautatu partekatu beharreko elementuak"</string>
@@ -103,8 +103,16 @@
<string name="exclude_link" msgid="1332778255031992228">"Utzi kanpoan esteka"</string>
<string name="include_link" msgid="827855767220339802">"Sartu esteka"</string>
<string name="pinned" msgid="7623664001331394139">"Ainguratuta"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g>garren elementua"</string>
<string name="selectable_image" msgid="3157858923437182271">"Hauta daitekeen irudia"</string>
<string name="selectable_video" msgid="1271768647699300826">"Hauta daitekeen bideoa"</string>
<string name="selectable_item" msgid="7557320816744205280">"Hauta daitekeen elementua"</string>
<string name="role_description_button" msgid="4537198530568333649">"Botoia"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Partekatze zuzenen helburuak"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Aplikazioen iradokizunak"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Aplikazioen zerrenda"</string>
+ <!-- no translation found for copy_text (1341801611046464360) -->
+ <skip />
+ <!-- no translation found for copy_link (3822142723771306592) -->
+ <skip />
</resources>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index 71386d35..597546b3 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"مستثنی کردن پیوند"</string>
<string name="include_link" msgid="827855767220339802">"گنجاندن پیوند"</string>
<string name="pinned" msgid="7623664001331394139">"سنجاق‌شده"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"مورد <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"تصویر قابل‌انتخاب"</string>
<string name="selectable_video" msgid="1271768647699300826">"ویدیو قابل‌انتخاب"</string>
<string name="selectable_item" msgid="7557320816744205280">"مورد قابل‌انتخاب"</string>
<string name="role_description_button" msgid="4537198530568333649">"دکمه"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"هدف‌های هم‌رسانی مستقیم"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"پیشنهادهای برنامه"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"فهرست برنامه"</string>
+ <string name="copy_text" msgid="1341801611046464360">"کپی کردن نوشتار"</string>
+ <string name="copy_link" msgid="3822142723771306592">"کپی کردن پیوند"</string>
</resources>
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
index 6938d4fa..12003636 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Jätä linkki pois"</string>
<string name="include_link" msgid="827855767220339802">"Liitä linkki mukaan"</string>
<string name="pinned" msgid="7623664001331394139">"Kiinnitetty"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Kohde <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Valittava kuva"</string>
<string name="selectable_video" msgid="1271768647699300826">"Valittava video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Valittava kohde"</string>
<string name="role_description_button" msgid="4537198530568333649">"Painike"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Suorajaon vastaanottajat"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Sovellusehdotukset"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Sovelluslista"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopioi teksti"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopioi linkki"</string>
</resources>
diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml
index 7fdda598..aa710ce8 100644
--- a/java/res/values-fr-rCA/strings.xml
+++ b/java/res/values-fr-rCA/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Exclure le lien"</string>
<string name="include_link" msgid="827855767220339802">"Inclure le lien"</string>
<string name="pinned" msgid="7623664001331394139">"Épinglée"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Élément <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Image sélectionnable"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vidéo sélectionnable"</string>
<string name="selectable_item" msgid="7557320816744205280">"Élément sélectionnable"</string>
<string name="role_description_button" msgid="4537198530568333649">"Bouton"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Cibles du partage direct"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Applis suggérées"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Liste d\'applis"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copier le texte"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copier le lien"</string>
</resources>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index 39d436a7..393ba10c 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Exclure le lien"</string>
<string name="include_link" msgid="827855767220339802">"Inclure le lien"</string>
<string name="pinned" msgid="7623664001331394139">"Épinglée"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Élément <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Image sélectionnable"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vidéo sélectionnable"</string>
<string name="selectable_item" msgid="7557320816744205280">"Élément sélectionnable"</string>
<string name="role_description_button" msgid="4537198530568333649">"Bouton"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Cibles de partage direct"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Suggestions d\'applications"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Liste des applications"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copier le texte"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copier le lien"</string>
</resources>
diff --git a/java/res/values-gl/strings.xml b/java/res/values-gl/strings.xml
index d45e982e..b173db33 100644
--- a/java/res/values-gl/strings.xml
+++ b/java/res/values-gl/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Excluír ligazón"</string>
<string name="include_link" msgid="827855767220339802">"Incluír ligazón"</string>
<string name="pinned" msgid="7623664001331394139">"Elemento fixado"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Elemento <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Imaxe seleccionable"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vídeo seleccionable"</string>
<string name="selectable_item" msgid="7557320816744205280">"Elemento seleccionable"</string>
<string name="role_description_button" msgid="4537198530568333649">"Botón"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Destinatarios da función de compartir directamente"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Suxestións de aplicacións"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista de aplicacións"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copiar o texto"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copiar a ligazón"</string>
</resources>
diff --git a/java/res/values-gu/strings.xml b/java/res/values-gu/strings.xml
index d0e65a18..945486eb 100644
--- a/java/res/values-gu/strings.xml
+++ b/java/res/values-gu/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"લિંકને બાકાત કરો"</string>
<string name="include_link" msgid="827855767220339802">"લિંક શામેલ કરો"</string>
<string name="pinned" msgid="7623664001331394139">"પિન કરેલી"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"આઇટમ <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"પસંદ કરી શકાય તેવી છબી"</string>
<string name="selectable_video" msgid="1271768647699300826">"પસંદ કરી શકાય તેવો વીડિયો"</string>
<string name="selectable_item" msgid="7557320816744205280">"પસંદ કરી શકાય તેવી આઇટમ"</string>
<string name="role_description_button" msgid="4537198530568333649">"બટન"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"સીધા શેર કરવાના લક્ષ્યો"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"ઍપના સૂચનો"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"ઍપની સૂચિ"</string>
+ <string name="copy_text" msgid="1341801611046464360">"ટેક્સ્ટ કૉપિ કરો"</string>
+ <string name="copy_link" msgid="3822142723771306592">"લિંક કૉપિ કરો"</string>
</resources>
diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml
index 70da0c22..06e2030d 100644
--- a/java/res/values-hi/strings.xml
+++ b/java/res/values-hi/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"लिंक हटाएं"</string>
<string name="include_link" msgid="827855767220339802">"लिंक जोड़ें"</string>
<string name="pinned" msgid="7623664001331394139">"पिन किया गया"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"आइटम <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"ऐसी इमेज जिसे चुना जा सकता है"</string>
<string name="selectable_video" msgid="1271768647699300826">"ऐसा वीडियो जिसे चुना जा सकता है"</string>
<string name="selectable_item" msgid="7557320816744205280">"ऐसा आइटम जिसे चुना जा सकता है"</string>
<string name="role_description_button" msgid="4537198530568333649">"बटन"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"सीधे तौर पर कॉन्टेंट शेयर करने के लिए चुने गए लोग या ग्रुप"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"सुझाए गए ऐप्लिकेशन"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"ऐप्लिकेशन की सूची"</string>
+ <string name="copy_text" msgid="1341801611046464360">"टेक्स्ट कॉपी करें"</string>
+ <string name="copy_link" msgid="3822142723771306592">"लिंक कॉपी करें"</string>
</resources>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index c8f8c90d..1dbbef0a 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Isključi vezu"</string>
<string name="include_link" msgid="827855767220339802">"Uključi vezu"</string>
<string name="pinned" msgid="7623664001331394139">"Prikvačeno"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Stavka <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Slika koja se može odabrati"</string>
<string name="selectable_video" msgid="1271768647699300826">"Videozapis koji se može odabrati"</string>
<string name="selectable_item" msgid="7557320816744205280">"Stavka koja se može odabrati"</string>
<string name="role_description_button" msgid="4537198530568333649">"Gumb"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Osoba/skupina za izravno dijeljenje"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Prijedlozi aplikacija"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Popis aplikacija"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopiraj tekst"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopiraj vezu"</string>
</resources>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index a9e5e820..e719ef29 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Link eltávolítása"</string>
<string name="include_link" msgid="827855767220339802">"Linkkel együtt"</string>
<string name="pinned" msgid="7623664001331394139">"Kitűzve"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g>. elem"</string>
<string name="selectable_image" msgid="3157858923437182271">"Kijelölhető kép"</string>
<string name="selectable_video" msgid="1271768647699300826">"Kijelölhető videó"</string>
<string name="selectable_item" msgid="7557320816744205280">"Kijelölhető elem"</string>
<string name="role_description_button" msgid="4537198530568333649">"Gomb"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Közvetlen megosztási lehetőségek"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Alkalmazásjavaslatok"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Alkalmazáslista"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Szöveg másolása"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Link másolása"</string>
</resources>
diff --git a/java/res/values-hy/strings.xml b/java/res/values-hy/strings.xml
index b0b0b235..751542b9 100644
--- a/java/res/values-hy/strings.xml
+++ b/java/res/values-hy/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Բացառել հղումը"</string>
<string name="include_link" msgid="827855767220339802">"Ներառել հղումը"</string>
<string name="pinned" msgid="7623664001331394139">"Ամրացված է"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Տարր <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Ընտրելու հնարավորությամբ պատկեր"</string>
<string name="selectable_video" msgid="1271768647699300826">"Ընտրելու հնարավորությամբ տեսանյութ"</string>
<string name="selectable_item" msgid="7557320816744205280">"Ընտրելու հնարավորությամբ տարր"</string>
<string name="role_description_button" msgid="4537198530568333649">"Կոճակ"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Direct Share-ի ստացողներ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Առաջարկվող հավելվածներ"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Հավելվածների ցուցակ"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Պատճենել տեքստ"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Պատճենել հղումը"</string>
</resources>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 86828b7c..059b583e 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Kecualikan link"</string>
<string name="include_link" msgid="827855767220339802">"Sertakan link"</string>
<string name="pinned" msgid="7623664001331394139">"Disematkan"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Gambar yang dapat dipilih"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video yang dapat dipilih"</string>
<string name="selectable_item" msgid="7557320816744205280">"Item yang dapat dipilih"</string>
<string name="role_description_button" msgid="4537198530568333649">"Tombol"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Target berbagi langsung"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Saran aplikasi"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Daftar aplikasi"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Salin teks"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Salin link"</string>
</resources>
diff --git a/java/res/values-is/strings.xml b/java/res/values-is/strings.xml
index 9125bae9..a53635d1 100644
--- a/java/res/values-is/strings.xml
+++ b/java/res/values-is/strings.xml
@@ -56,7 +56,7 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # skrá}one{+ # skrá}other{+ # skrár}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{+ # skrá í viðbót}one{+ # skrá í viðbót}other{+ # skrár í viðbót}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"Deilir texta"</string>
- <string name="sharing_link" msgid="2307694372813942916">"Deilir tengli"</string>
+ <string name="sharing_link" msgid="2307694372813942916">"Deila tengli"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Deilir mynd}one{Deilir # mynd}other{Deilir # myndum}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Deilir myndskeiði}one{Deilir # myndskeiði}other{Deilir # myndskeiðum}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Deilir # skrá}one{Deilir # skrá}other{Deilir # skrám}}"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Útiloka tengil"</string>
<string name="include_link" msgid="827855767220339802">"Hafa tengil með"</string>
<string name="pinned" msgid="7623664001331394139">"Fest"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Atriði <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Mynd sem hægt er að velja"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vídeó sem hægt er að velja"</string>
<string name="selectable_item" msgid="7557320816744205280">"Atriði sem hægt er að velja"</string>
<string name="role_description_button" msgid="4537198530568333649">"Hnappur"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Deila beint með"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Tillögð forrit"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Forritalisti"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Afrita texta"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Afrita tengil"</string>
</resources>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index 7d0a7fa7..b97e10f7 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -59,7 +59,7 @@
<string name="sharing_link" msgid="2307694372813942916">"Condivisione del link"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Condivisione dell\'immagine}many{Condivisione di # immagini}other{Condivisione di # immagini}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Condivisione del video…}many{Condivisione di # video…}other{Condivisione di # video…}}"</string>
- <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Condivisione di # file in corso…}many{Condivisione di # file in corso…}other{Condivisione di # file in corso…}}"</string>
+ <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Condivisione di # file}many{Condivisione di # di file}other{Condivisione di # file}}"</string>
<string name="select_items_to_share" msgid="1026071777275022579">"Seleziona gli elementi da condividere"</string>
<string name="sharing_images_with_text" msgid="9005717434461730242">"{count,plural, =1{Condivisione immagine con testo in corso…}many{Condivisione # immagini con testo in corso…}other{Condivisione # immagini con testo in corso…}}"</string>
<string name="sharing_images_with_link" msgid="8907893266387877733">"{count,plural, =1{Condivisione immagine con link}many{Condivisione # immagini con link}other{Condivisione # immagini con link}}"</string>
@@ -76,7 +76,7 @@
<string name="file_preview_a11y_description" msgid="7397224827802410602">"Miniatura di anteprima del file"</string>
<string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"Nessuna persona consigliata per la condivisione"</string>
<string name="usb_device_resolve_prompt_warn" msgid="4254493957548169620">"A questa app non è stata concessa l\'autorizzazione di registrazione, ma l\'app potrebbe acquisire l\'audio tramite questo dispositivo USB."</string>
- <string name="resolver_personal_tab" msgid="1381052735324320565">"Personale"</string>
+ <string name="resolver_personal_tab" msgid="1381052735324320565">"Personali"</string>
<string name="resolver_work_tab" msgid="3588325717455216412">"Lavoro"</string>
<string name="resolver_private_tab" msgid="3707548826254095157">"Privato"</string>
<string name="resolver_personal_tab_accessibility" msgid="4467784352232582574">"Visualizzazione personale"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Escludi link"</string>
<string name="include_link" msgid="827855767220339802">"Includi link"</string>
<string name="pinned" msgid="7623664001331394139">"Elemento fissato"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Elemento <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Immagine selezionabile"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video selezionabile"</string>
<string name="selectable_item" msgid="7557320816744205280">"Elemento selezionabile"</string>
<string name="role_description_button" msgid="4537198530568333649">"Pulsante"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Target di condivisione diretta"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"App suggerite"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Elenco di app"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copia testo"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copia link"</string>
</resources>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 43921c78..e1971138 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -56,7 +56,7 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ קובץ אחד}one{+ # קבצים}two{+ # קבצים}other{+ # קבצים}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{קובץ אחד נוסף}one{# קבצים נוספים}two{# קבצים נוספים}other{# קבצים נוספים}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"שיתוף טקסט"</string>
- <string name="sharing_link" msgid="2307694372813942916">"שיתוף קישור"</string>
+ <string name="sharing_link" msgid="2307694372813942916">"קישור לשיתוף"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{שיתוף של תמונה}one{שיתוף של # תמונות}two{שיתוף של # תמונות}other{שיתוף של # תמונות}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{מתבצע שיתוף של סרטון}one{מתבצע שיתוף של # סרטונים}two{מתבצע שיתוף של # סרטונים}other{מתבצע שיתוף של # סרטונים}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{מתבצע שיתוף של קובץ אחד}one{מתבצע שיתוף של # קבצים}two{מתבצע שיתוף של # קבצים}other{מתבצע שיתוף של # קבצים}}"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"החרגת הקישור"</string>
<string name="include_link" msgid="827855767220339802">"הכללת הקישור"</string>
<string name="pinned" msgid="7623664001331394139">"מוצמד"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"פריט <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"תמונה שניתן לבחור"</string>
<string name="selectable_video" msgid="1271768647699300826">"סרטון שניתן לבחור"</string>
<string name="selectable_item" msgid="7557320816744205280">"פריט שניתן לבחור"</string>
<string name="role_description_button" msgid="4537198530568333649">"כפתור"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"יעדים לשיתוף ישיר"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"הצעות לאפליקציות"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"רשימת האפליקציות"</string>
+ <string name="copy_text" msgid="1341801611046464360">"העתקת הטקסט"</string>
+ <string name="copy_link" msgid="3822142723771306592">"העתקת הקישור"</string>
</resources>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index 094106c3..47926d4f 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -56,8 +56,8 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{他 # 件のファイル}other{他 # 件のファイル}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{その他 # ファイル}other{その他 # ファイル}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"テキストの共有"</string>
- <string name="sharing_link" msgid="2307694372813942916">"リンクを共有中"</string>
- <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{1 枚の画像を共有します}other{# 枚の画像を共有します}}"</string>
+ <string name="sharing_link" msgid="2307694372813942916">"リンクを共有"</string>
+ <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{1 枚の画像を共有中}other{# 枚の画像を共有中}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{動画を共有中}other{# 個の動画を共有中}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{# 個のファイルを共有中}other{# 個のファイルを共有中}}"</string>
<string name="select_items_to_share" msgid="1026071777275022579">"共有するアイテムの選択"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"リンクを除外"</string>
<string name="include_link" msgid="827855767220339802">"リンクを含める"</string>
<string name="pinned" msgid="7623664001331394139">"固定されています"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"アイテム <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"選択可能な画像"</string>
<string name="selectable_video" msgid="1271768647699300826">"選択可能な動画"</string>
<string name="selectable_item" msgid="7557320816744205280">"選択可能なアイテム"</string>
<string name="role_description_button" msgid="4537198530568333649">"ボタン"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"ダイレクト シェア ターゲット"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"アプリの候補"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"アプリリスト"</string>
+ <string name="copy_text" msgid="1341801611046464360">"テキストをコピー"</string>
+ <string name="copy_link" msgid="3822142723771306592">"リンクをコピー"</string>
</resources>
diff --git a/java/res/values-ka/strings.xml b/java/res/values-ka/strings.xml
index e0951e39..ef11a5d4 100644
--- a/java/res/values-ka/strings.xml
+++ b/java/res/values-ka/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"ბმულის ამოღება"</string>
<string name="include_link" msgid="827855767220339802">"ბმულის დართვა"</string>
<string name="pinned" msgid="7623664001331394139">"ჩამაგრებული"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"ერთეული <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"არჩევადი სურათი"</string>
<string name="selectable_video" msgid="1271768647699300826">"არჩევადი ვიდეო"</string>
<string name="selectable_item" msgid="7557320816744205280">"არჩევადი ერთეული"</string>
<string name="role_description_button" msgid="4537198530568333649">"ღილაკი"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"პირდაპირი გაზიარების მიზნები"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"აპის შეთავაზებები"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"აპების სია"</string>
+ <string name="copy_text" msgid="1341801611046464360">"ტექსტის კოპირება"</string>
+ <string name="copy_link" msgid="3822142723771306592">"ბმულის კოპირება"</string>
</resources>
diff --git a/java/res/values-kk/strings.xml b/java/res/values-kk/strings.xml
index 99357ef6..b7f47e72 100644
--- a/java/res/values-kk/strings.xml
+++ b/java/res/values-kk/strings.xml
@@ -59,7 +59,7 @@
<string name="sharing_link" msgid="2307694372813942916">"Сілтемені бөлісіп жатыр"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Сурет бөлісіп жатырсыз}other{# сурет бөлісіп жатырсыз}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Бейне бөлісіліп жатыр}other{# бейне бөлісіліп жатыр}}"</string>
- <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{# файлды бөлісіп жатыр}other{# файлды бөлісіп жатыр}}"</string>
+ <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{# файлды бөлісіп жатырсыз}other{# файлды бөлісіп жатырсыз}}"</string>
<string name="select_items_to_share" msgid="1026071777275022579">"Бөлісетін элементтерді таңдау"</string>
<string name="sharing_images_with_text" msgid="9005717434461730242">"{count,plural, =1{Мәтіні бар сурет жіберу}other{Мәтіні бар # сурет жіберу}}"</string>
<string name="sharing_images_with_link" msgid="8907893266387877733">"{count,plural, =1{Сілтемесі бар сурет жіберу}other{Сілтемесі бар # сурет жіберу}}"</string>
@@ -82,7 +82,7 @@
<string name="resolver_personal_tab_accessibility" msgid="4467784352232582574">"Жеке көру"</string>
<string name="resolver_work_tab_accessibility" msgid="7581878836587799920">"Жұмыс деректерін көру"</string>
<string name="resolver_private_tab_accessibility" msgid="2513122834337197252">"Құпия көрініс"</string>
- <string name="resolver_cross_profile_blocked" msgid="3515194063758605377">"Әкімшіңіз бөгеген"</string>
+ <string name="resolver_cross_profile_blocked" msgid="3515194063758605377">"Әкімшіңіз блоктаған"</string>
<string name="resolver_cant_share_with_work_apps_explanation" msgid="2984105853145456723">"Бұл контентті жұмыс қолданбаларымен бөлісу мүмкін емес."</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1463093773348988122">"Бұл контентті жұмыс қолданбаларымен ашу мүмкін емес."</string>
<string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"Бұл контентті жеке қолданбалармен бөлісу мүмкін емес."</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Сілтемені шығару"</string>
<string name="include_link" msgid="827855767220339802">"Сілтеме қосу"</string>
<string name="pinned" msgid="7623664001331394139">"Бекітілген"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g>-элемент"</string>
<string name="selectable_image" msgid="3157858923437182271">"Таңдауға болатын сурет"</string>
<string name="selectable_video" msgid="1271768647699300826">"Таңдауға болатын бейне"</string>
<string name="selectable_item" msgid="7557320816744205280">"Таңдауға болатын элемент"</string>
<string name="role_description_button" msgid="4537198530568333649">"Түйме"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Тікелей бөлісу опциялары"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Қолданба ұсыныстары"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Қолданбалар тізімі"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Мәтінді көшіру"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Сілтемені көшіру"</string>
</resources>
diff --git a/java/res/values-km/strings.xml b/java/res/values-km/strings.xml
index 29d80e96..81f2c1d2 100644
--- a/java/res/values-km/strings.xml
+++ b/java/res/values-km/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"មិនរួមបញ្ចូលតំណ"</string>
<string name="include_link" msgid="827855767220339802">"រួមបញ្ចូល​តំណ"</string>
<string name="pinned" msgid="7623664001331394139">"បាន​ខ្ទាស់"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"ធាតុទី <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"រូបភាពដែល​អាចជ្រើសរើសបាន"</string>
<string name="selectable_video" msgid="1271768647699300826">"វីដេអូដែល​អាចជ្រើសរើសបាន"</string>
<string name="selectable_item" msgid="7557320816744205280">"ធាតុដែល​អាចជ្រើសរើសបាន"</string>
<string name="role_description_button" msgid="4537198530568333649">"ប៊ូតុង"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"គោលដៅចែករំលែកដោយផ្ទាល់"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"ការណែនាំកម្មវិធី"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"បញ្ជីកម្មវិធី"</string>
+ <string name="copy_text" msgid="1341801611046464360">"ចម្លងអក្សរ"</string>
+ <string name="copy_link" msgid="3822142723771306592">"ចម្លង​តំណ"</string>
</resources>
diff --git a/java/res/values-kn/strings.xml b/java/res/values-kn/strings.xml
index d777b6fa..4e6d1007 100644
--- a/java/res/values-kn/strings.xml
+++ b/java/res/values-kn/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"ಲಿಂಕ್ ಹೊರತುಪಡಿಸಿ"</string>
<string name="include_link" msgid="827855767220339802">"ಲಿಂಕ್ ಸೇರಿಸಿ"</string>
<string name="pinned" msgid="7623664001331394139">"ಪಿನ್‌ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g> ಐಟಂ"</string>
<string name="selectable_image" msgid="3157858923437182271">"ಆಯ್ಕೆಮಾಡಬಹುದಾದ ಚಿತ್ರ"</string>
<string name="selectable_video" msgid="1271768647699300826">"ಆಯ್ಕೆ ಮಾಡಬಹುದಾದ ವೀಡಿಯೊ"</string>
<string name="selectable_item" msgid="7557320816744205280">"ಆಯ್ಕೆ ಮಾಡಬಹುದಾದ ಐಟಂ"</string>
<string name="role_description_button" msgid="4537198530568333649">"ಬಟನ್"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"ನೇರ ಹಂಚಿಕೊಳ್ಳುವಿಕೆ ಟಾರ್ಗೆಟ್‌ಗಳು"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"ಆ್ಯಪ್ ಸಲಹೆಗಳು"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"ಆ್ಯಪ್ ಪಟ್ಟಿ"</string>
+ <string name="copy_text" msgid="1341801611046464360">"ಪಠ್ಯವನ್ನು ಕಾಪಿ ಮಾಡಿ"</string>
+ <string name="copy_link" msgid="3822142723771306592">"ಲಿಂಕ್ ಅನ್ನು ಕಾಪಿ ಮಾಡಿ"</string>
</resources>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index 0ab0cefb..590baa66 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"링크 제외"</string>
<string name="include_link" msgid="827855767220339802">"링크 포함"</string>
<string name="pinned" msgid="7623664001331394139">"고정됨"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"항목 <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"선택 가능한 이미지"</string>
<string name="selectable_video" msgid="1271768647699300826">"선택 가능한 동영상"</string>
<string name="selectable_item" msgid="7557320816744205280">"선택 가능한 항목"</string>
<string name="role_description_button" msgid="4537198530568333649">"버튼"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"직접 공유 타겟"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"앱 제안"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"앱 목록"</string>
+ <string name="copy_text" msgid="1341801611046464360">"텍스트 복사"</string>
+ <string name="copy_link" msgid="3822142723771306592">"링크 복사"</string>
</resources>
diff --git a/java/res/values-ky/strings.xml b/java/res/values-ky/strings.xml
index 7de1593d..0f69ebe9 100644
--- a/java/res/values-ky/strings.xml
+++ b/java/res/values-ky/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Шилтемени чыгарып салуу"</string>
<string name="include_link" msgid="827855767220339802">"Шилтеме кошуу"</string>
<string name="pinned" msgid="7623664001331394139">"Кадалган"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g>-нерсе"</string>
<string name="selectable_image" msgid="3157858923437182271">"Тандала турган сүрөт"</string>
<string name="selectable_video" msgid="1271768647699300826">"Тандала турган видео"</string>
<string name="selectable_item" msgid="7557320816744205280">"Тандала турган нерсе"</string>
<string name="role_description_button" msgid="4537198530568333649">"Баскыч"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Түздөн-түз бөлүшүлгөндөрдү алуучулар"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Сунушталган колдонмолор"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Колдонмолордун тизмеси"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Текстти көчүрүү"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Шилтемени көчүрүү"</string>
</resources>
diff --git a/java/res/values-lo/strings.xml b/java/res/values-lo/strings.xml
index 9481a9ae..f8fcbfcc 100644
--- a/java/res/values-lo/strings.xml
+++ b/java/res/values-lo/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"ບໍ່ຮວມລິ້ງ"</string>
<string name="include_link" msgid="827855767220339802">"ຮວມລິ້ງ"</string>
<string name="pinned" msgid="7623664001331394139">"ປັກໝຸດແລ້ວ"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"ລາຍການ <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"ຮູບທີ່ເລືອກໄດ້"</string>
<string name="selectable_video" msgid="1271768647699300826">"ວິດີໂອທີ່ເລືອກໄດ້"</string>
<string name="selectable_item" msgid="7557320816744205280">"ລາຍການທີ່ເລືອກໄດ້"</string>
<string name="role_description_button" msgid="4537198530568333649">"ປຸ່ມ"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"ເປົ້າໝາຍແບ່ງປັນໂດຍກົງ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"ການແນະນຳແອັບ"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"ລາຍການແອັບ"</string>
+ <string name="copy_text" msgid="1341801611046464360">"ສຳເນົາຂໍ້ຄວາມ"</string>
+ <string name="copy_link" msgid="3822142723771306592">"ສຳເນົາລິ້ງ"</string>
</resources>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index f1a0494d..f46f88e5 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Išskirti nuorodą"</string>
<string name="include_link" msgid="827855767220339802">"Įtraukti nuorodą"</string>
<string name="pinned" msgid="7623664001331394139">"Prisegta"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g> elementas"</string>
<string name="selectable_image" msgid="3157858923437182271">"Pasirenkamas vaizdas"</string>
<string name="selectable_video" msgid="1271768647699300826">"Pasirenkamas vaizdo įrašas"</string>
<string name="selectable_item" msgid="7557320816744205280">"Pasirenkamas elementas"</string>
<string name="role_description_button" msgid="4537198530568333649">"Mygtukas"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Tiesioginio bendrinimo paskirties vietos"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Siūlomos programos"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Programų sąrašas"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopijuoti tekstą"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopijuoti nuorodą"</string>
</resources>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
index 5fed4d43..649533ab 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Izslēgt saiti"</string>
<string name="include_link" msgid="827855767220339802">"Iekļaut saiti"</string>
<string name="pinned" msgid="7623664001331394139">"Piespraustās"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g>. vienums"</string>
<string name="selectable_image" msgid="3157858923437182271">"Atlasāms attēls"</string>
<string name="selectable_video" msgid="1271768647699300826">"Atlasāms video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Atlasāms vienums"</string>
<string name="role_description_button" msgid="4537198530568333649">"Poga"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Tiešās kopīgošanas adresāti"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Ieteicamās lietotnes"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lietotņu saraksts"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopēt tekstu"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopēt saiti"</string>
</resources>
diff --git a/java/res/values-mk/strings.xml b/java/res/values-mk/strings.xml
index 2ab3c072..3204ff91 100644
--- a/java/res/values-mk/strings.xml
+++ b/java/res/values-mk/strings.xml
@@ -85,7 +85,7 @@
<string name="resolver_cross_profile_blocked" msgid="3515194063758605377">"Блокирано од IT-администраторот"</string>
<string name="resolver_cant_share_with_work_apps_explanation" msgid="2984105853145456723">"Овие содржини не може да се споделуваат со работни апликации"</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1463093773348988122">"Овие содржини не може да се отвораат со работни апликации"</string>
- <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"Овие содржини не може да се споделуваат со лични апликации"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"Содржиниве не може да се споделуваат со лични апликации"</string>
<string name="resolver_cant_access_personal_apps_explanation" msgid="6209543716289792706">"Овие содржини не може да се отвораат со лични апликации"</string>
<string name="resolver_cant_share_with_private_apps_explanation" msgid="1781980997411434697">"Овие содржини не може да се споделуваат со приватни апликации"</string>
<string name="resolver_cant_access_private_apps_explanation" msgid="5978609934961648342">"Овие содржини не може да се отвораат со лични апликации"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Исклучи линк"</string>
<string name="include_link" msgid="827855767220339802">"Вклучи линк"</string>
<string name="pinned" msgid="7623664001331394139">"Закачено"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Ставка <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Слика што може да се избере"</string>
<string name="selectable_video" msgid="1271768647699300826">"Видео што може да се избере"</string>
<string name="selectable_item" msgid="7557320816744205280">"Ставка што може да се избере"</string>
<string name="role_description_button" msgid="4537198530568333649">"Копче"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Директни цели на споделување"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Предлози за апликации"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Список со апликации"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Копирај го текстот"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Копирај го линкот"</string>
</resources>
diff --git a/java/res/values-ml/strings.xml b/java/res/values-ml/strings.xml
index 6318a101..63ddb262 100644
--- a/java/res/values-ml/strings.xml
+++ b/java/res/values-ml/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"ലിങ്ക് ഒഴിവാക്കുക"</string>
<string name="include_link" msgid="827855767220339802">"ലിങ്ക് ഉൾപ്പെടുത്തുക"</string>
<string name="pinned" msgid="7623664001331394139">"പിൻ ചെയ്‌തത്"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"ഇനം <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"തിരഞ്ഞെടുക്കാവുന്ന ചിത്രം"</string>
<string name="selectable_video" msgid="1271768647699300826">"തിരഞ്ഞെടുക്കാവുന്ന വീഡിയോ"</string>
<string name="selectable_item" msgid="7557320816744205280">"തിരഞ്ഞെടുക്കാവുന്ന ഇനം"</string>
<string name="role_description_button" msgid="4537198530568333649">"ബട്ടൺ"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"നേരിട്ടുള്ള പങ്കിടൽ ടാർഗെറ്റുകൾ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"ആപ്പ് നിർദ്ദേശങ്ങൾ"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"ആപ്പ് ലിസ്റ്റ്"</string>
+ <string name="copy_text" msgid="1341801611046464360">"ടെക്‌സ്റ്റ് പകർത്തുക"</string>
+ <string name="copy_link" msgid="3822142723771306592">"ലിങ്ക് പകർത്തുക"</string>
</resources>
diff --git a/java/res/values-mn/strings.xml b/java/res/values-mn/strings.xml
index 8dc3cd58..4ce3b15e 100644
--- a/java/res/values-mn/strings.xml
+++ b/java/res/values-mn/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Холбоосыг хасах"</string>
<string name="include_link" msgid="827855767220339802">"Холбоосыг оруулах"</string>
<string name="pinned" msgid="7623664001331394139">"Бэхэлсэн"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g> зүйл"</string>
<string name="selectable_image" msgid="3157858923437182271">"Сонгох боломжтой зураг"</string>
<string name="selectable_video" msgid="1271768647699300826">"Сонгох боломжтой видео"</string>
<string name="selectable_item" msgid="7557320816744205280">"Сонгох боломжтой зүйл"</string>
<string name="role_description_button" msgid="4537198530568333649">"Товч"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Шууд хуваалцах сонголтууд"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Санал болгож буй аппууд"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Аппын жагсаалт"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Текстийг хуулах"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Холбоосыг хуулах"</string>
</resources>
diff --git a/java/res/values-mr/strings.xml b/java/res/values-mr/strings.xml
index 5e54a61a..dce1241b 100644
--- a/java/res/values-mr/strings.xml
+++ b/java/res/values-mr/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"लिंक वगळा"</string>
<string name="include_link" msgid="827855767220339802">"लिंक समाविष्ट करा"</string>
<string name="pinned" msgid="7623664001331394139">"पिन केलेली"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"आयटम <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"निवडण्यायोग्य इमेज"</string>
<string name="selectable_video" msgid="1271768647699300826">"निवडण्यायोग्य व्हिडिओ"</string>
<string name="selectable_item" msgid="7557320816744205280">"निवडण्यायोग्य आयटम"</string>
<string name="role_description_button" msgid="4537198530568333649">"बटण"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"थेट शेअर करा लक्ष्ये"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"अ‍ॅप सूचना"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"अ‍ॅप सूची"</string>
+ <string name="copy_text" msgid="1341801611046464360">"मजकूर कॉपी करा"</string>
+ <string name="copy_link" msgid="3822142723771306592">"लिंक कॉपी करा"</string>
</resources>
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
index b6dca50f..300a763f 100644
--- a/java/res/values-ms/strings.xml
+++ b/java/res/values-ms/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Kecualikan pautan"</string>
<string name="include_link" msgid="827855767220339802">"Sertakan pautan"</string>
<string name="pinned" msgid="7623664001331394139">"Disemat"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Imej yang boleh dipilih"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video yang boleh dipilih"</string>
<string name="selectable_item" msgid="7557320816744205280">"Item yang boleh dipilih"</string>
<string name="role_description_button" msgid="4537198530568333649">"Butang"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Sasaran perkongsian langsung"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Cadangan apl"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Senarai apl"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Salin teks"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Salin pautan"</string>
</resources>
diff --git a/java/res/values-my/strings.xml b/java/res/values-my/strings.xml
index af596656..6a5f559b 100644
--- a/java/res/values-my/strings.xml
+++ b/java/res/values-my/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"လင့်ခ် ဖယ်ထုတ်ရန်"</string>
<string name="include_link" msgid="827855767220339802">"လင့်ခ်ထည့်သွင်းရန်"</string>
<string name="pinned" msgid="7623664001331394139">"ပင်ထိုးထားသည်"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"အကြောင်းအရာ <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"ရွေးချယ်နိုင်သောပုံ"</string>
<string name="selectable_video" msgid="1271768647699300826">"ရွေးချယ်နိုင်သော ဗီဒီယို"</string>
<string name="selectable_item" msgid="7557320816744205280">"ရွေးချယ်နိုင်သောအရာ"</string>
<string name="role_description_button" msgid="4537198530568333649">"ခလုတ်"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"တိုက်ရိုက်မျှဝေသည့် ပစ်မှတ်များ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"အက်ပ်အကြံပြုချက်များ"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"အက်ပ်စာရင်း"</string>
+ <string name="copy_text" msgid="1341801611046464360">"စာသားကူးရန်"</string>
+ <string name="copy_link" msgid="3822142723771306592">"လင့်ခ်ကူးရန်"</string>
</resources>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index bd31a926..7381eaa8 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Ekskluder linken"</string>
<string name="include_link" msgid="827855767220339802">"Inkluder linken"</string>
<string name="pinned" msgid="7623664001331394139">"Festet"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Element <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Bilde som kan velges"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video som kan velges"</string>
<string name="selectable_item" msgid="7557320816744205280">"Element som kan velges"</string>
<string name="role_description_button" msgid="4537198530568333649">"Knapp"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Direkte delingsmål"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Appforslag"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Appliste"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopier teksten"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopier linken"</string>
</resources>
diff --git a/java/res/values-ne/strings.xml b/java/res/values-ne/strings.xml
index 620e402c..18744d21 100644
--- a/java/res/values-ne/strings.xml
+++ b/java/res/values-ne/strings.xml
@@ -59,7 +59,7 @@
<string name="sharing_link" msgid="2307694372813942916">"लिंक सेयर गरिँदै छ"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{फोटो सेयर गरिँदै छ}other{# वटा फोटो सेयर गरिँदै छ}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{भिडियो सेयर गरिँदै छ}other{# वटा भिडियो सेयर गरिँदै छ}}"</string>
- <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{# वटा फाइल सेयर गरिँदै छ}other{# वटा फाइल सेयर गरिँदै छ}}"</string>
+ <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{# फाइल सेयर गरिँदै छ}other{# वटा फाइल सेयर गरिँदै छन्}}"</string>
<string name="select_items_to_share" msgid="1026071777275022579">"आफूले सेयर गर्न चाहेका सामग्री चयन गर्नुहोस्"</string>
<string name="sharing_images_with_text" msgid="9005717434461730242">"{count,plural, =1{टेक्स्ट भएको फोटो सेयर गरिँदै छ}other{टेक्स्ट भएका # वटा फोटो सेयर गरिँदै छन्}}"</string>
<string name="sharing_images_with_link" msgid="8907893266387877733">"{count,plural, =1{लिंक भएको फोटो सेयर गरिँदै छ}other{लिंक भएका # वटा फोटो सेयर गरिँदै छन्}}"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"लिंक हटाउनुहोस्"</string>
<string name="include_link" msgid="827855767220339802">"लिंक समावेश गर्नुहोस्"</string>
<string name="pinned" msgid="7623664001331394139">"पिन गरिएको"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"वस्तु <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"चयन गर्न मिल्ने फोटो"</string>
<string name="selectable_video" msgid="1271768647699300826">"चयन गर्न मिल्ने भिडियो"</string>
<string name="selectable_item" msgid="7557320816744205280">"चयन गर्न मिल्ने वस्तु"</string>
<string name="role_description_button" msgid="4537198530568333649">"बटन"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"सामग्री सीधै सेयर गर्नका निम्ति चयन गरिएका व्यक्ति वा समूहहरू"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"सिफारिस गरिएका एपहरू"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"एपहरूको सूची"</string>
+ <string name="copy_text" msgid="1341801611046464360">"टेक्स्ट कपी गर्नुहोस्"</string>
+ <string name="copy_link" msgid="3822142723771306592">"लिंक कपी गर्नुहोस्"</string>
</resources>
diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
index 54123bef..de8050b9 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Link uitsluiten"</string>
<string name="include_link" msgid="827855767220339802">"Link opnemen"</string>
<string name="pinned" msgid="7623664001331394139">"Vastgezet"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Selecteerbare afbeelding"</string>
<string name="selectable_video" msgid="1271768647699300826">"Selecteerbare video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Selecteerbaar item"</string>
<string name="role_description_button" msgid="4537198530568333649">"Knop"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Doelen voor direct delen"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"App-suggesties"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"App-lijst"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Tekst kopiëren"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Link kopiëren"</string>
</resources>
diff --git a/java/res/values-or/strings.xml b/java/res/values-or/strings.xml
index 785acbe1..c724f896 100644
--- a/java/res/values-or/strings.xml
+++ b/java/res/values-or/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"ଲିଙ୍କକୁ ବାଦ ଦିଅନ୍ତୁ"</string>
<string name="include_link" msgid="827855767220339802">"ଲିଙ୍କକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରନ୍ତୁ"</string>
<string name="pinned" msgid="7623664001331394139">"ପିନ କରାଯାଇଛି"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"ଆଇଟମ <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"ଚୟନ କରାଯାଇପାରୁଥିବା ଇମେଜ"</string>
<string name="selectable_video" msgid="1271768647699300826">"ଚୟନ କରାଯାଇପାରୁଥିବା ଭିଡିଓ"</string>
<string name="selectable_item" msgid="7557320816744205280">"ଚୟନ କରାଯାଇପାରୁଥିବା ଆଇଟମ"</string>
<string name="role_description_button" msgid="4537198530568333649">"ବଟନ"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"ଡାଇରେକ୍ଟ ସେୟାର ଟାର୍ଗେଟ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"ଆପ ପରାମର୍ଶ"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"ଆପ ତାଲିକା"</string>
+ <string name="copy_text" msgid="1341801611046464360">"ଟେକ୍ସଟ କପି କରନ୍ତୁ"</string>
+ <string name="copy_link" msgid="3822142723771306592">"ଲିଙ୍କ କପି କରନ୍ତୁ"</string>
</resources>
diff --git a/java/res/values-pa/strings.xml b/java/res/values-pa/strings.xml
index 8b9f528c..32dc39de 100644
--- a/java/res/values-pa/strings.xml
+++ b/java/res/values-pa/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"ਲਿੰਕ ਨੂੰ ਸ਼ਾਮਲ ਨਾ ਕਰੋ"</string>
<string name="include_link" msgid="827855767220339802">"ਲਿੰਕ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="pinned" msgid="7623664001331394139">"ਪਿੰਨ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"ਆਈਟਮ <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"ਚੁਣਨਯੋਗ ਚਿੱਤਰ"</string>
<string name="selectable_video" msgid="1271768647699300826">"ਚੁਣਨਯੋਗ ਵੀਡੀਓ"</string>
<string name="selectable_item" msgid="7557320816744205280">"ਚੁਣਨਯੋਗ ਆਈਟਮ"</string>
<string name="role_description_button" msgid="4537198530568333649">"ਬਟਨ"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"ਸਿੱਧੇ ਤੌਰ \'ਤੇ ਸਾਂਝਾ ਕਰਨ ਲਈ ਟਾਰਗੇਟ ਗਰੁੱਪ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"ਐਪ ਸੁਝਾਅ"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"ਐਪ ਸੂਚੀ"</string>
+ <string name="copy_text" msgid="1341801611046464360">"ਲਿਖਤ ਕਾਪੀ ਕਰੋ"</string>
+ <string name="copy_link" msgid="3822142723771306592">"ਲਿੰਕ ਕਾਪੀ ਕਰੋ"</string>
</resources>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index 3de2b1f4..e11ffb35 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Wyklucz link"</string>
<string name="include_link" msgid="827855767220339802">"Dołącz link"</string>
<string name="pinned" msgid="7623664001331394139">"Przypięte"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Element <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Obraz do wyboru"</string>
<string name="selectable_video" msgid="1271768647699300826">"Film do wyboru"</string>
<string name="selectable_item" msgid="7557320816744205280">"Element do wyboru"</string>
<string name="role_description_button" msgid="4537198530568333649">"Przycisk"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Odbiorcy udostępniania bezpośredniego"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Sugestie aplikacji"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista aplikacji"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Skopiuj tekst"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Skopiuj link"</string>
</resources>
diff --git a/java/res/values-pt-rBR/strings.xml b/java/res/values-pt-rBR/strings.xml
index 5ed57493..fd1f1863 100644
--- a/java/res/values-pt-rBR/strings.xml
+++ b/java/res/values-pt-rBR/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Excluir link"</string>
<string name="include_link" msgid="827855767220339802">"Incluir link"</string>
<string name="pinned" msgid="7623664001331394139">"Fixada"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Imagem selecionável"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vídeo selecionável"</string>
<string name="selectable_item" msgid="7557320816744205280">"Item selecionável"</string>
<string name="role_description_button" msgid="4537198530568333649">"Botão"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Destinos de compartilhamento direto"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Sugestões de apps"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista de apps"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copiar texto"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copiar link"</string>
</resources>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 73d12957..c4be78e4 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Excluir link"</string>
<string name="include_link" msgid="827855767220339802">"Incluir link"</string>
<string name="pinned" msgid="7623664001331394139">"Afixada"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Imagem selecionável"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vídeo selecionável"</string>
<string name="selectable_item" msgid="7557320816744205280">"Item selecionável"</string>
<string name="role_description_button" msgid="4537198530568333649">"Botão"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Segmentações de partilha direta"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Sugestões de apps"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista de apps"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copiar texto"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copiar link"</string>
</resources>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index 5ed57493..fd1f1863 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Excluir link"</string>
<string name="include_link" msgid="827855767220339802">"Incluir link"</string>
<string name="pinned" msgid="7623664001331394139">"Fixada"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Imagem selecionável"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vídeo selecionável"</string>
<string name="selectable_item" msgid="7557320816744205280">"Item selecionável"</string>
<string name="role_description_button" msgid="4537198530568333649">"Botão"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Destinos de compartilhamento direto"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Sugestões de apps"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista de apps"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copiar texto"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copiar link"</string>
</resources>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index 7c8816b6..faa360f4 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Exclude linkul"</string>
<string name="include_link" msgid="827855767220339802">"Include linkul"</string>
<string name="pinned" msgid="7623664001331394139">"Fixat"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Elementul <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Imagine care poate fi selectată"</string>
<string name="selectable_video" msgid="1271768647699300826">"Videoclip care poate fi selectat"</string>
<string name="selectable_item" msgid="7557320816744205280">"Articol care poate fi selectat"</string>
<string name="role_description_button" msgid="4537198530568333649">"Buton"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Destinații de distribuire directă"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Sugestii de aplicații"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista cu aplicații"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Copiază textul"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Copiază linkul"</string>
</resources>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index 7a05c9d0..637a6bf8 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -59,7 +59,7 @@
<string name="sharing_link" msgid="2307694372813942916">"Отправка ссылки"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Отправка изображения}one{Отправка # изображения}few{Отправка # изображений}many{Отправка # изображений}other{Отправка # изображения}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Отправка видео}one{Отправка # видео}few{Отправка # видео}many{Отправка # видео}other{Отправка # видео}}"</string>
- <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Предоставляется доступ к # файлу}one{Предоставляется доступ к # файлу}few{Предоставляется доступ к # файлам}many{Предоставляется доступ к # файлам}other{Предоставляется доступ к # файла}}"</string>
+ <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Поделиться # файлом}one{Поделиться # файлом}few{Поделиться # файлами}many{Поделиться # файлом}other{Поделиться # файла}}"</string>
<string name="select_items_to_share" msgid="1026071777275022579">"Выберите объекты для отправки"</string>
<string name="sharing_images_with_text" msgid="9005717434461730242">"{count,plural, =1{Отправка изображения с текстом}one{Отправка # изображения с текстом}few{Отправка # изображений с текстом}many{Отправка # изображений с текстом}other{Отправка # изображения с текстом}}"</string>
<string name="sharing_images_with_link" msgid="8907893266387877733">"{count,plural, =1{Отправка изображения со ссылкой}one{Отправка # изображения со ссылкой}few{Отправка # изображений со ссылкой}many{Отправка # изображений со ссылкой}other{Отправка # изображения со ссылкой}}"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Исключить ссылку"</string>
<string name="include_link" msgid="827855767220339802">"Вернуть ссылку"</string>
<string name="pinned" msgid="7623664001331394139">"Закреплено"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Элемент <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Изображение, которое можно выбрать"</string>
<string name="selectable_video" msgid="1271768647699300826">"Видео, которое можно выбрать"</string>
<string name="selectable_item" msgid="7557320816744205280">"Объект, который можно выбрать"</string>
<string name="role_description_button" msgid="4537198530568333649">"Кнопка"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Получатели Direct Share"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Рекомендуемые приложения"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Список приложений"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Копировать текст"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Копировать ссылку"</string>
</resources>
diff --git a/java/res/values-si/strings.xml b/java/res/values-si/strings.xml
index 19af7794..482f0510 100644
--- a/java/res/values-si/strings.xml
+++ b/java/res/values-si/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"සබැඳිය බැහැර කරන්න"</string>
<string name="include_link" msgid="827855767220339802">"සබැඳිය ඇතුළත් කරන්න"</string>
<string name="pinned" msgid="7623664001331394139">"අමුණා ඇත"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"අයිතම <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"තෝරා ගත හැකි රූපය"</string>
<string name="selectable_video" msgid="1271768647699300826">"තෝරා ගත හැකි වීඩියෝව"</string>
<string name="selectable_item" msgid="7557320816744205280">"තෝරා ගත හැකි අයිතමය"</string>
<string name="role_description_button" msgid="4537198530568333649">"බොත්තම"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"සෘජු බෙදා ගැනීමේ ඉලක්ක"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"යෙදුම් යෝජනා"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"යෙදුම් ලැයිස්තුව"</string>
+ <string name="copy_text" msgid="1341801611046464360">"පෙළ පිටපත් කරන්න"</string>
+ <string name="copy_link" msgid="3822142723771306592">"සබැඳිය පිටපත් කරන්න"</string>
</resources>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index 36898690..c3a08830 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -56,13 +56,13 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # súbor}few{+ # súbory}many{+ # files}other{+ # súborov}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{a # ďalší súbor}few{a # ďalšie súbory}many{+ # more files}other{a # ďalších súborov}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"Zdieľanie textu"</string>
- <string name="sharing_link" msgid="2307694372813942916">"Zdieľa sa odkaz"</string>
- <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Zdieľanie obrázku}few{Zdieľanie # obrázkov}many{Sharing # images}other{Zdieľanie # obrázkov}}"</string>
+ <string name="sharing_link" msgid="2307694372813942916">"Zdieľanie odkazu"</string>
+ <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Zdieľanie obrázka}few{Zdieľanie # obrázkov}many{Sharing # images}other{Zdieľanie # obrázkov}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Zdieľa sa video}few{Zdieľajú sa # videá}many{Sharing # videos}other{Zdieľa sa # videí}}"</string>
- <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Zdieľa sa # súbor}few{Zdieľajú sa # súbory}many{Sharing # files}other{Zdieľa sa # súborov}}"</string>
+ <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Zdieľanie # súboru}few{Zdieľanie # súborov}many{Sharing # files}other{Zdieľanie # súborov}}"</string>
<string name="select_items_to_share" msgid="1026071777275022579">"Vyberte položky na zdieľanie"</string>
- <string name="sharing_images_with_text" msgid="9005717434461730242">"{count,plural, =1{Zdieľa sa obrázok s textom}few{Zdieľajú sa # obrázky s textom}many{Sharing # images with text}other{Zdieľa sa # obrázkov s textom}}"</string>
- <string name="sharing_images_with_link" msgid="8907893266387877733">"{count,plural, =1{Zdieľa sa obrázok s odkazom}few{Zdieľajú sa # obrázky s odkazom}many{Sharing # images with link}other{Zdieľa sa # obrázkov s odkazom}}"</string>
+ <string name="sharing_images_with_text" msgid="9005717434461730242">"{count,plural, =1{Zdieľanie obrázka s textom}few{Zdieľanie # obrázkov s textom}many{Sharing # images with text}other{Zdieľanie # obrázkov s textom}}"</string>
+ <string name="sharing_images_with_link" msgid="8907893266387877733">"{count,plural, =1{Zdieľanie obrázka s odkazom}few{Zdieľanie # obrázkov s odkazom}many{Sharing # images with link}other{Zdieľanie # obrázkov s odkazom}}"</string>
<string name="sharing_videos_with_text" msgid="4169898442482118146">"{count,plural, =1{Zdieľa sa video s textom}few{Zdieľajú sa # videá s textom}many{Sharing # videos with text}other{Zdieľa sa # videí s textom}}"</string>
<string name="sharing_videos_with_link" msgid="6383290441403042321">"{count,plural, =1{Zdieľa sa video s odkazom}few{Zdieľajú sa # videá s odkazom}many{Sharing # videos with link}other{Zdieľa sa # videí s odkazom}}"</string>
<string name="sharing_files_with_text" msgid="7331187260405018080">"{count,plural, =1{Zdieľa sa súbor s textom}few{Zdieľajú sa # súbory s textom}many{Sharing # files with text}other{Zdieľa sa # súborov s textom}}"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Vylúčiť odkaz"</string>
<string name="include_link" msgid="827855767220339802">"Zahrnúť odkaz"</string>
<string name="pinned" msgid="7623664001331394139">"Pripnuté"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g>. položka"</string>
<string name="selectable_image" msgid="3157858923437182271">"Vybrateľný obrázok"</string>
<string name="selectable_video" msgid="1271768647699300826">"Vybrateľné video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Vybrateľná položka"</string>
<string name="role_description_button" msgid="4537198530568333649">"Tlačidlo"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Ciele priameho zdieľania"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Návrhy aplikácií"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Zoznam aplikácií"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopírovať text"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopírovať odkaz"</string>
</resources>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
index 714ba171..f5f77a1f 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Izloči povezavo"</string>
<string name="include_link" msgid="827855767220339802">"Vključi povezavo"</string>
<string name="pinned" msgid="7623664001331394139">"Pripeto"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Element <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Slika, ki jo je mogoče izbrati."</string>
<string name="selectable_video" msgid="1271768647699300826">"Videoposnetek, ki ga je mogoče izbrati."</string>
<string name="selectable_item" msgid="7557320816744205280">"Element, ki ga je mogoče izbrati."</string>
<string name="role_description_button" msgid="4537198530568333649">"Gumb"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Naslovniki neposrednega deljenja"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Predlagane aplikacije"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Seznam aplikacij"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopiraj besedilo"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopiraj povezavo"</string>
</resources>
diff --git a/java/res/values-sq/strings.xml b/java/res/values-sq/strings.xml
index db24392a..b5383962 100644
--- a/java/res/values-sq/strings.xml
+++ b/java/res/values-sq/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Përjashto lidhjen"</string>
<string name="include_link" msgid="827855767220339802">"Përfshi lidhjen"</string>
<string name="pinned" msgid="7623664001331394139">"U gozhdua"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Artikulli <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Imazh që mund të zgjidhet"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video që mund të zgjidhet"</string>
<string name="selectable_item" msgid="7557320816744205280">"Artikull që mund të zgjidhet"</string>
<string name="role_description_button" msgid="4537198530568333649">"Buton"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Objektivat e ndarjes së drejtpërdrejtë"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Aplikacionet e sugjeruara"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Lista e aplikacioneve"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopjo tekstin"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopjo lidhjen"</string>
</resources>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index 8591ef7d..7a45c4eb 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -56,7 +56,7 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{и још # фајл}one{и још # фајл}few{и још # фајла}other{и још # фајлова}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{+ још # фајл}one{+ још # фајл}few{+ још # фајла}other{+ још # фајлова}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"Дели се текст"</string>
- <string name="sharing_link" msgid="2307694372813942916">"Дели се линк"</string>
+ <string name="sharing_link" msgid="2307694372813942916">"Дељење линка"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Дељење слике}one{Дељење # слике}few{Дељење # слике}other{Дељење # слика}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Дели се видео}one{Дели се # видео}few{Деле се # видео снимка}other{Дели се # видеа}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Дели се # фајл}one{Дели се # фајл}few{Деле се # фајла}other{Дели се # фајлова}}"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Изузми линк"</string>
<string name="include_link" msgid="827855767220339802">"Уврсти линк"</string>
<string name="pinned" msgid="7623664001331394139">"Закачено"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Ставка <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Слика која може да се изабере"</string>
<string name="selectable_video" msgid="1271768647699300826">"Видео који може да се изабере"</string>
<string name="selectable_item" msgid="7557320816744205280">"Ставка која може да се изабере"</string>
<string name="role_description_button" msgid="4537198530568333649">"Дугме"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Циљеви директног дељења"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Предлози апликација"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Листа апликација"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Копирај текст"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Копирај линк"</string>
</resources>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index 6810faa7..ec838aee 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Uteslut länk"</string>
<string name="include_link" msgid="827855767220339802">"Inkludera länk"</string>
<string name="pinned" msgid="7623664001331394139">"Fäst"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Objekt <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Bild som kan markeras"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video som kan markeras"</string>
<string name="selectable_item" msgid="7557320816744205280">"Objekt som kan markeras"</string>
<string name="role_description_button" msgid="4537198530568333649">"Knapp"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Personer/grupper att dela direkt med"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Appförslag"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Applista"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopiera text"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopiera länk"</string>
</resources>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
index 77b83e99..f6f2c63a 100644
--- a/java/res/values-sw/strings.xml
+++ b/java/res/values-sw/strings.xml
@@ -57,9 +57,9 @@
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{Faili nyingine #}other{Faili zingine #}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"Kutuma maandishi"</string>
<string name="sharing_link" msgid="2307694372813942916">"Inatuma kiungo"</string>
- <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Kutuma picha}other{Kutuma picha #}}"</string>
+ <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Inatuma picha}other{Inatuma picha #}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Inatuma video}other{Inatuma video #}}"</string>
- <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Inashiriki faili #}other{Inashiriki faili #}}"</string>
+ <string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{Inatuma faili #}other{Inatuma faili #}}"</string>
<string name="select_items_to_share" msgid="1026071777275022579">"Chagua vipengee vya kutuma"</string>
<string name="sharing_images_with_text" msgid="9005717434461730242">"{count,plural, =1{Inashiriki picha na maandishi}other{Inashiriki picha # na maandishi}}"</string>
<string name="sharing_images_with_link" msgid="8907893266387877733">"{count,plural, =1{Inashiriki picha na kiungo}other{Inashiriki picha # na kiungo}}"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Usijumuishe kiungo"</string>
<string name="include_link" msgid="827855767220339802">"Jumuisha kiungo"</string>
<string name="pinned" msgid="7623664001331394139">"Imebandikwa"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Kipengee cha <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Picha inayoweza kuchaguliwa"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video inayoweza kuchaguliwa"</string>
<string name="selectable_item" msgid="7557320816744205280">"Kipengee kinachoweza kuchaguliwa"</string>
<string name="role_description_button" msgid="4537198530568333649">"Kitufe"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Chaguo za kutuma maudhui moja kwa moja"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Mapendekezo ya programu"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Orodha ya programu"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Nakili maandishi"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Nakili kiungo"</string>
</resources>
diff --git a/java/res/values-ta/strings.xml b/java/res/values-ta/strings.xml
index f53e5b29..fa40446f 100644
--- a/java/res/values-ta/strings.xml
+++ b/java/res/values-ta/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"இணைப்பைத் தவிர்"</string>
<string name="include_link" msgid="827855767220339802">"இணைப்பைச் சேர்"</string>
<string name="pinned" msgid="7623664001331394139">"பின் செய்யப்பட்டுள்ளது"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"ஆவணம் <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"தேர்ந்தெடுக்கக்கூடிய படம்"</string>
<string name="selectable_video" msgid="1271768647699300826">"தேர்ந்தெடுக்கக்கூடிய வீடியோ"</string>
<string name="selectable_item" msgid="7557320816744205280">"தேர்ந்தெடுக்கக்கூடியது"</string>
<string name="role_description_button" msgid="4537198530568333649">"பட்டன்"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"நேரடிப் பகிர்வு இலக்குகள்"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"ஆப்ஸ் பரிந்துரைகள்"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"ஆப்ஸ் பட்டியல்"</string>
+ <string name="copy_text" msgid="1341801611046464360">"வார்த்தைகளை நகலெடுக்கும்"</string>
+ <string name="copy_link" msgid="3822142723771306592">"இணைப்பை நகலெடுக்கும்"</string>
</resources>
diff --git a/java/res/values-te/strings.xml b/java/res/values-te/strings.xml
index 5003d8eb..267978b8 100644
--- a/java/res/values-te/strings.xml
+++ b/java/res/values-te/strings.xml
@@ -56,7 +56,7 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # ఫైల్}other{+ # ఫైల్స్}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{+ మరో # ఫైల్}other{+ మరో # ఫైల్స్}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"టెక్స్ట్‌ను షేర్ చేయడం"</string>
- <string name="sharing_link" msgid="2307694372813942916">"లింక్‌ను షేర్ చేయడం"</string>
+ <string name="sharing_link" msgid="2307694372813942916">"షేరింగ్ లింక్"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{ఈ ఇమేజ్‌ను షేర్ చేస్తున్నారు}other{ఈ # ఇమేజ్‌లను షేర్ చేస్తున్నారు}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{వీడియోను షేర్ చేయడం}other{# వీడియోలను షేర్ చేయడం}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{# ఫైల్‌ను షేర్ చేస్తోంది}other{# ఫైళ్లను షేర్ చేస్తోంది}}"</string>
@@ -85,7 +85,7 @@
<string name="resolver_cross_profile_blocked" msgid="3515194063758605377">"మీ IT అడ్మిన్ ద్వారా బ్లాక్ చేయబడింది"</string>
<string name="resolver_cant_share_with_work_apps_explanation" msgid="2984105853145456723">"ఈ కంటెంట్ వర్క్ యాప్‌తో షేర్ చేయడం సాధ్యం కాదు"</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1463093773348988122">"ఈ కంటెంట్ వర్క్ యాప్‌తో తెరవడం సాధ్యం కాదు"</string>
- <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"ఈ కంటెంట్‌ను వ్యక్తిగత యాప్స్ లోకి షేర్ చేయడం సాధ్యం కాదు"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"ఈ కంటెంట్‌ను వ్యక్తిగత (పర్సనల్) యాప్స్‌కు షేర్ చేయడం సాధ్యపడదు"</string>
<string name="resolver_cant_access_personal_apps_explanation" msgid="6209543716289792706">"ఈ కంటెంట్ వ్యక్తిగత యాప్‌తో తెరవడం సాధ్యం కాదు"</string>
<string name="resolver_cant_share_with_private_apps_explanation" msgid="1781980997411434697">"ఈ కంటెంట్‌ను ప్రైవేట్ యాప్‌లతో షేర్ చేయడం సాధ్యం కాదు"</string>
<string name="resolver_cant_access_private_apps_explanation" msgid="5978609934961648342">"ఈ కంటెంట్‌ను ప్రైవేట్ యాప్‌లతో తెరవడం సాధ్యం కాదు"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"లింక్‌ను మినహాయించండి"</string>
<string name="include_link" msgid="827855767220339802">"లింక్‌ను చేర్చండి"</string>
<string name="pinned" msgid="7623664001331394139">"పిన్ చేయబడింది"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"ఐటెమ్ <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"ఎంచుకోదగిన ఇమేజ్"</string>
<string name="selectable_video" msgid="1271768647699300826">"ఎంచుకోదగిన వీడియో"</string>
<string name="selectable_item" msgid="7557320816744205280">"ఎంచుకోదగిన ఐటెమ్"</string>
<string name="role_description_button" msgid="4537198530568333649">"బటన్"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"టార్గెట్‌లను నేరుగా షేర్ చేయడం"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"యాప్ సూచనలు"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"యాప్ లిస్ట్"</string>
+ <string name="copy_text" msgid="1341801611046464360">"టెక్స్ట్‌ను కాపీ చేయండి"</string>
+ <string name="copy_link" msgid="3822142723771306592">"లింక్‌ను కాపీ చేయండి"</string>
</resources>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index 8bb9408f..d20d8189 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -85,7 +85,7 @@
<string name="resolver_cross_profile_blocked" msgid="3515194063758605377">"ผู้ดูแลระบบไอทีบล็อกไว้"</string>
<string name="resolver_cant_share_with_work_apps_explanation" msgid="2984105853145456723">"แชร์เนื้อหานี้โดยใช้แอปงานไม่ได้"</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1463093773348988122">"เปิดเนื้อหานี้โดยใช้แอปงานไม่ได้"</string>
- <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"แชร์เนื้อหานี้โดยใช้แอปส่วนตัวไม่ได้"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"แชร์เนื้อหานี้กับแอปส่วนตัวไม่ได้"</string>
<string name="resolver_cant_access_personal_apps_explanation" msgid="6209543716289792706">"เปิดเนื้อหานี้โดยใช้แอปส่วนตัวไม่ได้"</string>
<string name="resolver_cant_share_with_private_apps_explanation" msgid="1781980997411434697">"แชร์เนื้อหานี้โดยใช้แอปส่วนตัวไม่ได้"</string>
<string name="resolver_cant_access_private_apps_explanation" msgid="5978609934961648342">"เปิดเนื้อหานี้โดยใช้แอปส่วนตัวไม่ได้"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"ไม่รวมลิงก์"</string>
<string name="include_link" msgid="827855767220339802">"รวมลิงก์"</string>
<string name="pinned" msgid="7623664001331394139">"ปักหมุดไว้"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"รายการ <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"รูปภาพที่เลือกได้"</string>
<string name="selectable_video" msgid="1271768647699300826">"วิดีโอที่เลือกได้"</string>
<string name="selectable_item" msgid="7557320816744205280">"รายการที่เลือกได้"</string>
<string name="role_description_button" msgid="4537198530568333649">"ปุ่ม"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"เป้าหมายการแชร์โดยตรง"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"คำแนะนำเกี่ยวกับแอป"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"รายการแอป"</string>
+ <string name="copy_text" msgid="1341801611046464360">"คัดลอกข้อความ"</string>
+ <string name="copy_link" msgid="3822142723771306592">"คัดลอกลิงก์"</string>
</resources>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index e98c06bf..13bf4863 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Huwag isama ang link"</string>
<string name="include_link" msgid="827855767220339802">"Isama ang link"</string>
<string name="pinned" msgid="7623664001331394139">"Naka-pin"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Item <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Napipiling larawan"</string>
<string name="selectable_video" msgid="1271768647699300826">"Napipiling video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Napipiling item"</string>
<string name="role_description_button" msgid="4537198530568333649">"Button"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Mga target ng direktang pagbabahagi"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Mga iminumungkahing app"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Listahan ng app"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopyahin ang text"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopyahin ang link"</string>
</resources>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index 25b7e860..4bfe38b1 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -56,7 +56,7 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # dosya}other{+ # dosya}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{+ # dosya daha}other{+ # dosya daha}}"</string>
<string name="sharing_text" msgid="8137537443603304062">"Metin paylaşılıyor"</string>
- <string name="sharing_link" msgid="2307694372813942916">"Paylaşım bağlantısı"</string>
+ <string name="sharing_link" msgid="2307694372813942916">"Bağlantı paylaşılıyor"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Resim paylaşılıyor}other{# resim paylaşılıyor}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Video paylaşılıyor}other{# video paylaşılıyor}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{# dosya paylaşılıyor}other{# dosya paylaşılıyor}}"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Bağlantıyı hariç tut"</string>
<string name="include_link" msgid="827855767220339802">"Bağlantıyı dahil et"</string>
<string name="pinned" msgid="7623664001331394139">"Sabitlendi"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g>. öğe"</string>
<string name="selectable_image" msgid="3157858923437182271">"Seçilebilir resim"</string>
<string name="selectable_video" msgid="1271768647699300826">"Seçilebilir video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Seçilebilir öğe"</string>
<string name="role_description_button" msgid="4537198530568333649">"Düğme"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Doğrudan paylaşım hedefleri"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Önerilen uygulamalar"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Uygulama listesi"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Metni kopyala"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Bağlantıyı kopyala"</string>
</resources>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 33f9e350..db252f2e 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Вилучити посилання"</string>
<string name="include_link" msgid="827855767220339802">"Додати посилання"</string>
<string name="pinned" msgid="7623664001331394139">"Закріплено"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Об’єкт <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Зображення, яке можна вибрати"</string>
<string name="selectable_video" msgid="1271768647699300826">"Відео, яке можна вибрати"</string>
<string name="selectable_item" msgid="7557320816744205280">"Об’єкт, який можна вибрати"</string>
<string name="role_description_button" msgid="4537198530568333649">"Кнопка"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Цілі прямого надання доступу"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Рекомендовані додатки"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Список додатків"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Копіювати текст"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Копіювати посилання"</string>
</resources>
diff --git a/java/res/values-ur/strings.xml b/java/res/values-ur/strings.xml
index 950041e7..6d52881c 100644
--- a/java/res/values-ur/strings.xml
+++ b/java/res/values-ur/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"لنک خارج کریں"</string>
<string name="include_link" msgid="827855767220339802">"لنک شامل کریں"</string>
<string name="pinned" msgid="7623664001331394139">"پن کردہ"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"آئٹم <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"قابل انتخاب تصویر"</string>
<string name="selectable_video" msgid="1271768647699300826">"قابل انتخاب ویڈیو"</string>
<string name="selectable_item" msgid="7557320816744205280">"قابل انتخاب آئٹم"</string>
<string name="role_description_button" msgid="4537198530568333649">"بٹن"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"براہ راست اشتراک کے اہداف"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"ایپ کی تجاویز"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"ایپ کی فہرست"</string>
+ <string name="copy_text" msgid="1341801611046464360">"ٹیکسٹ کاپی کریں"</string>
+ <string name="copy_link" msgid="3822142723771306592">"لنک کاپی کریں"</string>
</resources>
diff --git a/java/res/values-uz/strings.xml b/java/res/values-uz/strings.xml
index 1792e0d2..90c1008b 100644
--- a/java/res/values-uz/strings.xml
+++ b/java/res/values-uz/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Havolani chiqarib tashlash"</string>
<string name="include_link" msgid="827855767220339802">"Havolani kiritish"</string>
<string name="pinned" msgid="7623664001331394139">"Mahkamlangan"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"<xliff:g id="ITEM_POSITION">%1$d</xliff:g>-element"</string>
<string name="selectable_image" msgid="3157858923437182271">"Tanlanadigan rasm"</string>
<string name="selectable_video" msgid="1271768647699300826">"Tanlanadigan video"</string>
<string name="selectable_item" msgid="7557320816744205280">"Tanlanadigan fayl"</string>
<string name="role_description_button" msgid="4537198530568333649">"Tugma"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Direct Share nishonlari"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Ilova takliflari"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Ilovalar roʻyxati"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Matnni nusxalash"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Havoladan nusxa olish"</string>
</resources>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index a32bacc1..a3ad15fa 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -82,10 +82,10 @@
<string name="resolver_personal_tab_accessibility" msgid="4467784352232582574">"Chế độ xem cá nhân"</string>
<string name="resolver_work_tab_accessibility" msgid="7581878836587799920">"Chế độ xem công việc"</string>
<string name="resolver_private_tab_accessibility" msgid="2513122834337197252">"Chế độ xem riêng tư"</string>
- <string name="resolver_cross_profile_blocked" msgid="3515194063758605377">"Bị quản trị viên CNTT chặn"</string>
+ <string name="resolver_cross_profile_blocked" msgid="3515194063758605377">"Quản trị viên CNTT của bạn đã chặn thao tác này"</string>
<string name="resolver_cant_share_with_work_apps_explanation" msgid="2984105853145456723">"Bạn không thể chia sẻ nội dung này bằng ứng dụng công việc"</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1463093773348988122">"Bạn không thể mở nội dung này bằng ứng dụng công việc"</string>
- <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"Bạn không thể chia sẻ nội dung này bằng ứng dụng cá nhân"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6406971348929464569">"Bạn không thể chia sẻ nội dung này với các ứng dụng cá nhân"</string>
<string name="resolver_cant_access_personal_apps_explanation" msgid="6209543716289792706">"Bạn không thể mở nội dung này bằng ứng dụng cá nhân"</string>
<string name="resolver_cant_share_with_private_apps_explanation" msgid="1781980997411434697">"Không chia sẻ được nội dung này bằng ứng dụng riêng tư"</string>
<string name="resolver_cant_access_private_apps_explanation" msgid="5978609934961648342">"Không mở được nội dung này bằng ứng dụng riêng tư"</string>
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Không kèm đường liên kết"</string>
<string name="include_link" msgid="827855767220339802">"Thêm đường liên kết"</string>
<string name="pinned" msgid="7623664001331394139">"Đã ghim"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Mục <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Hình ảnh có thể chọn"</string>
<string name="selectable_video" msgid="1271768647699300826">"Video có thể chọn"</string>
<string name="selectable_item" msgid="7557320816744205280">"Mục có thể chọn"</string>
<string name="role_description_button" msgid="4537198530568333649">"Nút"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Mục tiêu chia sẻ trực tiếp"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Ứng dụng đề xuất"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Danh sách ứng dụng"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Sao chép văn bản"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Sao chép đường liên kết"</string>
</resources>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index 603a4e5e..761fa8e3 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"排除链接"</string>
<string name="include_link" msgid="827855767220339802">"包括链接"</string>
<string name="pinned" msgid="7623664001331394139">"已固定"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"第 <xliff:g id="ITEM_POSITION">%1$d</xliff:g> 项"</string>
<string name="selectable_image" msgid="3157858923437182271">"可选择的图片"</string>
<string name="selectable_video" msgid="1271768647699300826">"可选择的视频"</string>
<string name="selectable_item" msgid="7557320816744205280">"可选择的内容"</string>
<string name="role_description_button" msgid="4537198530568333649">"按钮"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"直接分享目标"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"应用建议"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"应用列表"</string>
+ <string name="copy_text" msgid="1341801611046464360">"复制文字"</string>
+ <string name="copy_link" msgid="3822142723771306592">"复制链接"</string>
</resources>
diff --git a/java/res/values-zh-rHK/strings.xml b/java/res/values-zh-rHK/strings.xml
index b3aed885..6a4a37bf 100644
--- a/java/res/values-zh-rHK/strings.xml
+++ b/java/res/values-zh-rHK/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"不包括連結"</string>
<string name="include_link" msgid="827855767220339802">"加入連結"</string>
<string name="pinned" msgid="7623664001331394139">"固定咗"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"項目 <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"可以揀嘅圖片"</string>
<string name="selectable_video" msgid="1271768647699300826">"可以揀嘅影片"</string>
<string name="selectable_item" msgid="7557320816744205280">"可以揀嘅項目"</string>
<string name="role_description_button" msgid="4537198530568333649">"按鈕"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"直接分享對象"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"應用程式建議"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"應用程式清單"</string>
+ <string name="copy_text" msgid="1341801611046464360">"複製文字"</string>
+ <string name="copy_link" msgid="3822142723771306592">"複製連結"</string>
</resources>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index 97770baf..9e8342d8 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"排除連結"</string>
<string name="include_link" msgid="827855767220339802">"加回連結"</string>
<string name="pinned" msgid="7623664001331394139">"已固定"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"項目 <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"可選取的圖片"</string>
<string name="selectable_video" msgid="1271768647699300826">"可選取的影片"</string>
<string name="selectable_item" msgid="7557320816744205280">"可選取的項目"</string>
<string name="role_description_button" msgid="4537198530568333649">"按鈕"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"直接分享目標"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"應用程式建議"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"應用程式清單"</string>
+ <string name="copy_text" msgid="1341801611046464360">"複製文字"</string>
+ <string name="copy_link" msgid="3822142723771306592">"複製連結"</string>
</resources>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index bdf42d69..f1644127 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -103,8 +103,14 @@
<string name="exclude_link" msgid="1332778255031992228">"Ungafaki ilinki"</string>
<string name="include_link" msgid="827855767220339802">"Faka ilinki"</string>
<string name="pinned" msgid="7623664001331394139">"Kuphiniwe"</string>
+ <string name="item_position_label" msgid="5112465518086817859">"Into <xliff:g id="ITEM_POSITION">%1$d</xliff:g>"</string>
<string name="selectable_image" msgid="3157858923437182271">"Umfanekiso okhethekayo"</string>
<string name="selectable_video" msgid="1271768647699300826">"Ividiyo ekhethekayo"</string>
<string name="selectable_item" msgid="7557320816744205280">"Into ekhethekayo"</string>
<string name="role_description_button" msgid="4537198530568333649">"Inkinobho"</string>
+ <string name="shortcut_group_a11y_title" msgid="3097624986281770746">"Qondisa ofuna ukwabelana nabo"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2394561651436551139">"Iziphakamiso ze-app"</string>
+ <string name="all_apps_group_a11y_title" msgid="2646382370571120047">"Uhlu lwama-app"</string>
+ <string name="copy_text" msgid="1341801611046464360">"Kopisha umbhalo"</string>
+ <string name="copy_link" msgid="3822142723771306592">"Kopisha ilinki"</string>
</resources>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 2261a4a8..c9ee9d80 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -329,6 +329,9 @@
front of the list by the user. [CHAR LIMIT=NONE] -->
<string name="pinned">Pinned</string>
+ <!-- Accessibility content description, item position label e.g. "Item 1" or "Item 345".
+ [CHAR LIMIT=NONE] -->
+ <string name="item_position_label">Item <xliff:g id="item_position" example="123">%1$d</xliff:g></string>
<!-- Accessibility content description for an image that the user may select for sharing.
[CHAR LIMIT=NONE] -->
<string name="selectable_image">Selectable image</string>
@@ -340,4 +343,21 @@
<string name="selectable_item">Selectable item</string>
<!-- Accessibility role description for a11y on button. [CHAR LIMIT=NONE] -->
<string name="role_description_button">Button</string>
+
+ <!-- Accessibility announcement for the shortcut group (https://developer.android.com/training/sharing/direct-share-targets)
+ in the list of targets. [CHAR LIMIT=NONE]-->
+ <string name="shortcut_group_a11y_title">Direct share targets</string>
+ <!-- Accessibility announcement for the suggested application group in the list of targets.
+ [CHAR LIMIT=NONE] -->
+ <string name="suggested_apps_group_a11y_title">App suggestions</string>
+ <!-- Accessibility announcement for the all-applications group in the list of targets.
+ [CHAR LIMIT=NONE] -->
+ <string name="all_apps_group_a11y_title">App list</string>
+
+ <!-- Content description for an action chip button in the content preview UI when a text is
+ shared. The button is used to copy the text into the clipboard. [CHAR_LIMIT=NONE] -->
+ <string name="copy_text">Copy text</string>
+ <!-- Content description for an action chip button in the content preview UI when a link is
+ shared. The button is used to copy the text into the clipboard. [CHAR_LIMIT=NONE] -->
+ <string name="copy_link">Copy link</string>
</resources>
diff --git a/java/src/android/service/chooser/ChooserSession.kt b/java/src/android/service/chooser/ChooserSession.kt
new file mode 100644
index 00000000..3bbe23a4
--- /dev/null
+++ b/java/src/android/service/chooser/ChooserSession.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.chooser
+
+import android.os.Parcel
+import android.os.Parcelable
+import com.android.intentresolver.IChooserInteractiveSessionCallback
+
+/** A stub for the potential future API class. */
+class ChooserSession(val sessionCallbackBinder: IChooserInteractiveSessionCallback) : Parcelable {
+ override fun describeContents() = 0
+
+ override fun writeToParcel(dest: Parcel, flags: Int) {
+ TODO("Not yet implemented")
+ }
+
+ companion object CREATOR : Parcelable.Creator<ChooserSession> {
+ override fun createFromParcel(source: Parcel): ChooserSession? =
+ ChooserSession(
+ IChooserInteractiveSessionCallback.Stub.asInterface(source.readStrongBinder())
+ )
+
+ override fun newArray(size: Int): Array<out ChooserSession?> = arrayOfNulls(size)
+ }
+}
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java
index 54f575d7..d4cf82ff 100644
--- a/java/src/com/android/intentresolver/ChooserActivity.java
+++ b/java/src/com/android/intentresolver/ChooserActivity.java
@@ -23,9 +23,11 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE
import static androidx.lifecycle.LifecycleKt.getCoroutineScope;
import static com.android.intentresolver.ChooserActionFactory.EDIT_SOURCE;
-import static com.android.intentresolver.Flags.fixShortcutsFlashing;
+import static com.android.intentresolver.Flags.fixShortcutsFlashingFixed;
+import static com.android.intentresolver.Flags.interactiveSession;
import static com.android.intentresolver.Flags.keyboardNavigationFix;
import static com.android.intentresolver.Flags.rebuildAdaptersOnTargetPinning;
+import static com.android.intentresolver.Flags.refineSystemActions;
import static com.android.intentresolver.Flags.shareouselUpdateExcludeComponentsExtra;
import static com.android.intentresolver.Flags.unselectFinalItem;
import static com.android.intentresolver.ext.CreationExtrasExtKt.replaceDefaultArgs;
@@ -59,6 +61,7 @@ import android.content.pm.ShortcutInfo;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Insets;
+import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.os.StrictMode;
@@ -142,6 +145,7 @@ import com.android.intentresolver.widget.ActionRow;
import com.android.intentresolver.widget.ChooserNestedScrollView;
import com.android.intentresolver.widget.ImagePreviewView;
import com.android.intentresolver.widget.ResolverDrawerLayout;
+import com.android.intentresolver.widget.ResolverDrawerLayoutExt;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.content.PackageMonitor;
import com.android.internal.logging.MetricsLogger;
@@ -256,7 +260,6 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
@Inject public UserInteractor mUserInteractor;
@Inject @Background public CoroutineDispatcher mBackgroundDispatcher;
@Inject public ChooserHelper mChooserHelper;
- @Inject public FeatureFlags mFeatureFlags;
@Inject public EventLog mEventLog;
@Inject @AppPredictionAvailable public boolean mAppPredictionAvailable;
@Inject @ImageEditor public Optional<ComponentName> mImageEditor;
@@ -422,13 +425,11 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
@Override
protected final void onRestart() {
super.onRestart();
- if (mFeatureFlags.fixPrivateSpaceLockedOnRestart()) {
- if (mChooserMultiProfilePagerAdapter.hasPageForProfile(Profile.Type.PRIVATE.ordinal())
- && !mProfileAvailability.isAvailable(mProfiles.getPrivateProfile())) {
- Log.d(TAG, "Exiting due to unavailable profile");
- finish();
- return;
- }
+ if (mChooserMultiProfilePagerAdapter.hasPageForProfile(Profile.Type.PRIVATE.ordinal())
+ && !mProfileAvailability.isAvailable(mProfiles.getPrivateProfile())) {
+ Log.d(TAG, "Exiting due to unavailable profile");
+ finish();
+ return;
}
if (!mRegistered) {
@@ -465,6 +466,9 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
if (isFinishing()) {
mLatencyTracker.onActionCancel(ACTION_LOAD_SHARE_SHEET);
+ if (interactiveSession() && mViewModel != null) {
+ mViewModel.getInteractiveSessionInteractor().endSession();
+ }
}
mBackgroundThreadPoolExecutor.shutdownNow();
@@ -481,9 +485,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mProfiles = new ProfileHelper(
mUserInteractor,
- getCoroutineScope(getLifecycle()),
- mBackgroundDispatcher,
- mFeatureFlags);
+ mBackgroundDispatcher);
mProfileAvailability = new ProfileAvailability(
mUserInteractor,
@@ -686,6 +688,11 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mEnterTransitionAnimationDelegate.postponeTransition();
mInitialProfile = findSelectedProfile();
Tracer.INSTANCE.markLaunched();
+
+ if (isInteractiveSession()) {
+ configureInteractiveSessionWindow();
+ updateInteractiveArea();
+ }
}
private void maybeDisableRecentsScreenshot(
@@ -725,6 +732,45 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mChooserMultiProfilePagerAdapter.setTargetsEnabled(hasSelections);
}
+ private void configureInteractiveSessionWindow() {
+ if (!isInteractiveSession()) {
+ Log.wtf(TAG, "Unexpected user of the method; should be an interactive session");
+ return;
+ }
+ final Window window = getWindow();
+ if (window == null) {
+ return;
+ }
+ window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+ window.addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY);
+ }
+
+ private void updateInteractiveArea() {
+ if (!isInteractiveSession()) {
+ Log.wtf(TAG, "Unexpected user of the method; should be an interactive session");
+ return;
+ }
+ final View contentView = findViewById(android.R.id.content);
+ final ResolverDrawerLayout rdl = mResolverDrawerLayout;
+ if (contentView == null || rdl == null) {
+ return;
+ }
+ final Rect rect = new Rect();
+ contentView.getViewTreeObserver().addOnComputeInternalInsetsListener((info) -> {
+ int oldTop = rect.top;
+ rdl.getBoundsInWindow(rect, true);
+ int left = rect.left;
+ int top = rect.top;
+ ResolverDrawerLayoutExt.getVisibleDrawerRect(rdl, rect);
+ rect.offset(left, top);
+ if (oldTop != rect.top) {
+ mViewModel.getInteractiveSessionInteractor().sendTopDrawerTopOffsetChange(rect.top);
+ }
+ info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
+ info.touchableRegion.set(new Rect(rect));
+ });
+ }
+
private void onAppTargetsLoaded(ResolverListAdapter listAdapter) {
Log.d(TAG, "onAppTargetsLoaded("
+ "listAdapter.userHandle=" + listAdapter.getUserHandle() + ")");
@@ -825,7 +871,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
postRebuildList(
mChooserMultiProfilePagerAdapter.rebuildTabs(
mProfiles.getWorkProfilePresent() || mProfiles.getPrivateProfilePresent()));
- if (fixShortcutsFlashing() && oldPagerAdapter != null) {
+ if (fixShortcutsFlashingFixed() && oldPagerAdapter != null) {
for (int i = 0, count = mChooserMultiProfilePagerAdapter.getCount(); i < count; i++) {
ChooserListAdapter listAdapter =
mChooserMultiProfilePagerAdapter.getPageAdapterForIndex(i)
@@ -968,6 +1014,9 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
* @return {@code true} if a resolved target is autolaunched, otherwise {@code false}
*/
private boolean maybeAutolaunchActivity() {
+ if (isInteractiveSession()) {
+ return false;
+ }
int numberOfProfiles = mChooserMultiProfilePagerAdapter.getItemCount();
// TODO(b/280988288): If the ChooserActivity is shown we should consider showing the
// correct intent-picker UIs (e.g., mini-resolver) if it was launched without
@@ -1566,8 +1615,12 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mChooserMultiProfilePagerAdapter.getActiveListAdapter().handlePackagesChanged();
if (mSystemWindowInsets != null) {
- mResolverDrawerLayout.setPadding(mSystemWindowInsets.left, mSystemWindowInsets.top,
- mSystemWindowInsets.right, 0);
+ int topSpacing = isInteractiveSession() ? getInteractiveSessionTopSpacing() : 0;
+ mResolverDrawerLayout.setPadding(
+ mSystemWindowInsets.left,
+ mSystemWindowInsets.top + topSpacing,
+ mSystemWindowInsets.right,
+ 0);
}
if (mViewPager.isLayoutRtl()) {
mChooserMultiProfilePagerAdapter.setupViewPager(mViewPager);
@@ -2073,8 +2126,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
},
chooserListAdapter,
shouldShowContentPreview(),
- mMaxTargetsPerRow,
- mFeatureFlags);
+ mMaxTargetsPerRow);
}
@VisibleForTesting
@@ -2168,7 +2220,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
private ChooserContentPreviewUi.ActionFactory decorateActionFactoryWithRefinement(
ChooserContentPreviewUi.ActionFactory originalFactory) {
- if (!mFeatureFlags.refineSystemActions()) {
+ if (!refineSystemActions()) {
return originalFactory;
}
@@ -2312,47 +2364,31 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
|| recyclerView.getAdapter() == null
|| availableWidth != mCurrAvailableWidth;
- boolean insetsChanged = !Objects.equals(mLastAppliedInsets, mSystemWindowInsets);
-
- if (isLayoutUpdated
- || insetsChanged
- || mLastNumberOfChildren != recyclerView.getChildCount()
- || mFeatureFlags.fixMissingDrawerOffsetCalculation()) {
- mCurrAvailableWidth = availableWidth;
- if (isLayoutUpdated) {
- // It is very important we call setAdapter from here. Otherwise in some cases
- // the resolver list doesn't get populated, such as b/150922090, b/150918223
- // and b/150936654
- recyclerView.setAdapter(gridAdapter);
- ((GridLayoutManager) recyclerView.getLayoutManager()).setSpanCount(
- mMaxTargetsPerRow);
-
- updateTabPadding();
- }
+ mCurrAvailableWidth = availableWidth;
+ if (isLayoutUpdated) {
+ // It is very important we call setAdapter from here. Otherwise in some cases
+ // the resolver list doesn't get populated, such as b/150922090, b/150918223
+ // and b/150936654
+ recyclerView.setAdapter(gridAdapter);
+ ((GridLayoutManager) recyclerView.getLayoutManager()).setSpanCount(
+ mMaxTargetsPerRow);
- int currentProfile = mChooserMultiProfilePagerAdapter.getActiveProfile();
- int initialProfile = Flags.fixDrawerOffsetOnConfigChange()
- ? mInitialProfile
- : findSelectedProfile();
- if (currentProfile != initialProfile) {
- return;
- }
+ updateTabPadding();
+ }
+
+ if (mChooserMultiProfilePagerAdapter.getActiveProfile() != mInitialProfile) {
+ return;
+ }
- if (mLastNumberOfChildren == recyclerView.getChildCount() && !insetsChanged
- && !mFeatureFlags.fixMissingDrawerOffsetCalculation()) {
+ getMainThreadHandler().post(() -> {
+ if (mResolverDrawerLayout == null || gridAdapter == null) {
return;
}
-
- getMainThreadHandler().post(() -> {
- if (mResolverDrawerLayout == null || gridAdapter == null) {
- return;
- }
- int offset = calculateDrawerOffset(top, bottom, recyclerView, gridAdapter);
- mResolverDrawerLayout.setCollapsibleHeightReserved(offset);
- mEnterTransitionAnimationDelegate.markOffsetCalculated();
- mLastAppliedInsets = mSystemWindowInsets;
- });
- }
+ int offset = calculateDrawerOffset(top, bottom, recyclerView, gridAdapter);
+ mResolverDrawerLayout.setCollapsibleHeightReserved(offset);
+ mEnterTransitionAnimationDelegate.markOffsetCalculated();
+ mLastAppliedInsets = mSystemWindowInsets;
+ });
}
private int calculateDrawerOffset(
@@ -2461,7 +2497,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
if (duration >= 0) {
Log.d(TAG, "app target loading time " + duration + " ms");
}
- if (!fixShortcutsFlashing()) {
+ if (!fixShortcutsFlashingFixed()) {
addCallerChooserTargets(chooserListAdapter);
}
getEventLog().logSharesheetAppLoadComplete();
@@ -2493,8 +2529,9 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
ChooserListAdapter adapter =
mChooserMultiProfilePagerAdapter.getListAdapterForUserHandle(userHandle);
if (adapter != null) {
- if (fixShortcutsFlashing()) {
+ if (fixShortcutsFlashingFixed()) {
adapter.setDirectTargetsEnabled(true);
+ adapter.resetDirectTargets();
addCallerChooserTargets(adapter);
}
for (ShortcutLoader.ShortcutResultInfo resultInfo : result.getShortcutsByApp()) {
@@ -2595,7 +2632,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
}
private boolean shouldShowStickyContentPreviewNoOrientationCheck() {
- if (!shouldShowContentPreview()) {
+ if (isInteractiveSession() || !shouldShowContentPreview()) {
return false;
}
ResolverListAdapter adapter = mChooserMultiProfilePagerAdapter.getListAdapterForUserHandle(
@@ -2688,15 +2725,26 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
}
}
+ private int getInteractiveSessionTopSpacing() {
+ return getResources().getDimensionPixelSize(R.dimen.chooser_preview_image_height_tall);
+ }
+
+ private boolean isInteractiveSession() {
+ return interactiveSession() && mRequest.getInteractiveSessionCallback() != null
+ && !isTaskRoot();
+ }
+
protected WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
mSystemWindowInsets = insets.getInsets(WindowInsets.Type.systemBars());
- if (mFeatureFlags.fixEmptyStatePaddingBug() || mProfiles.getWorkProfilePresent()) {
- mChooserMultiProfilePagerAdapter
- .setEmptyStateBottomOffset(mSystemWindowInsets.bottom);
- }
-
- mResolverDrawerLayout.setPadding(mSystemWindowInsets.left, mSystemWindowInsets.top,
- mSystemWindowInsets.right, 0);
+ mChooserMultiProfilePagerAdapter
+ .setEmptyStateBottomOffset(mSystemWindowInsets.bottom);
+
+ final int topSpacing = isInteractiveSession() ? getInteractiveSessionTopSpacing() : 0;
+ mResolverDrawerLayout.setPadding(
+ mSystemWindowInsets.left,
+ mSystemWindowInsets.top + topSpacing,
+ mSystemWindowInsets.right,
+ 0);
// Need extra padding so the list can fully scroll up
// To accommodate for window insets
diff --git a/java/src/com/android/intentresolver/ChooserGridLayoutManager.java b/java/src/com/android/intentresolver/ChooserGridLayoutManager.java
index aaa7554c..5bbb6c24 100644
--- a/java/src/com/android/intentresolver/ChooserGridLayoutManager.java
+++ b/java/src/com/android/intentresolver/ChooserGridLayoutManager.java
@@ -16,18 +16,35 @@
package com.android.intentresolver;
+import static com.android.intentresolver.Flags.announceShortcutsAndSuggestedApps;
+
import android.content.Context;
import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.GridView;
+import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
+import com.android.intentresolver.grid.ChooserGridAdapter;
+
/**
* For a11y and per {@link RecyclerView#onInitializeAccessibilityNodeInfo}, override
* methods to ensure proper row counts.
*/
public class ChooserGridLayoutManager extends GridLayoutManager {
+ private CharSequence mShortcutGroupTitle = "";
+ private CharSequence mSuggestedAppsGroupTitle = "";
+ private CharSequence mAllAppListGroupTitle = "";
+ @Nullable
+ private RecyclerView mRecyclerView;
private boolean mVerticalScrollEnabled = true;
/**
@@ -39,6 +56,9 @@ public class ChooserGridLayoutManager extends GridLayoutManager {
public ChooserGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
+ if (announceShortcutsAndSuggestedApps()) {
+ readGroupTitles(context);
+ }
}
/**
@@ -49,6 +69,9 @@ public class ChooserGridLayoutManager extends GridLayoutManager {
*/
public ChooserGridLayoutManager(Context context, int spanCount) {
super(context, spanCount);
+ if (announceShortcutsAndSuggestedApps()) {
+ readGroupTitles(context);
+ }
}
/**
@@ -61,6 +84,27 @@ public class ChooserGridLayoutManager extends GridLayoutManager {
public ChooserGridLayoutManager(Context context, int spanCount, int orientation,
boolean reverseLayout) {
super(context, spanCount, orientation, reverseLayout);
+ if (announceShortcutsAndSuggestedApps()) {
+ readGroupTitles(context);
+ }
+ }
+
+ private void readGroupTitles(Context context) {
+ mShortcutGroupTitle = context.getString(R.string.shortcut_group_a11y_title);
+ mSuggestedAppsGroupTitle = context.getString(R.string.suggested_apps_group_a11y_title);
+ mAllAppListGroupTitle = context.getString(R.string.all_apps_group_a11y_title);
+ }
+
+ @Override
+ public void onAttachedToWindow(RecyclerView view) {
+ super.onAttachedToWindow(view);
+ mRecyclerView = view;
+ }
+
+ @Override
+ public void onDetachedFromWindow(RecyclerView view, RecyclerView.Recycler recycler) {
+ super.onDetachedFromWindow(view, recycler);
+ mRecyclerView = null;
}
@Override
@@ -78,4 +122,91 @@ public class ChooserGridLayoutManager extends GridLayoutManager {
public boolean canScrollVertically() {
return mVerticalScrollEnabled && super.canScrollVertically();
}
+
+ @Override
+ public void onInitializeAccessibilityNodeInfoForItem(
+ RecyclerView.Recycler recycler,
+ RecyclerView.State state,
+ View host,
+ AccessibilityNodeInfoCompat info) {
+ super.onInitializeAccessibilityNodeInfoForItem(recycler, state, host, info);
+ if (announceShortcutsAndSuggestedApps() && host instanceof ViewGroup) {
+ if (host.getId() == R.id.shortcuts_container) {
+ info.setClassName(GridView.class.getName());
+ info.setContainerTitle(mShortcutGroupTitle);
+ info.setCollectionInfo(createShortcutsA11yCollectionInfo((ViewGroup) host));
+ } else if (host.getId() == R.id.suggested_apps_container) {
+ RecyclerView.Adapter adapter =
+ mRecyclerView == null ? null : mRecyclerView.getAdapter();
+ ChooserListAdapter gridAdapter = adapter instanceof ChooserGridAdapter
+ ? ((ChooserGridAdapter) adapter).getListAdapter()
+ : null;
+ info.setClassName(GridView.class.getName());
+ info.setCollectionInfo(createSuggestedAppsA11yCollectionInfo((ViewGroup) host));
+ if (gridAdapter == null || gridAdapter.getAlphaTargetCount() > 0) {
+ info.setContainerTitle(mSuggestedAppsGroupTitle);
+ } else {
+ // if all applications fit into one row, they will be put into the suggested
+ // applications group.
+ info.setContainerTitle(mAllAppListGroupTitle);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(@NonNull RecyclerView.Recycler recycler,
+ @NonNull RecyclerView.State state, @NonNull AccessibilityNodeInfoCompat info) {
+ super.onInitializeAccessibilityNodeInfo(recycler, state, info);
+ if (announceShortcutsAndSuggestedApps()) {
+ info.setContainerTitle(mAllAppListGroupTitle);
+ }
+ }
+
+ @Override
+ public boolean isLayoutHierarchical(
+ @NonNull RecyclerView.Recycler recycler, @NonNull RecyclerView.State state) {
+ return announceShortcutsAndSuggestedApps() || super.isLayoutHierarchical(recycler, state);
+ }
+
+ private CollectionInfoCompat createShortcutsA11yCollectionInfo(ViewGroup container) {
+ // TODO: create a custom view for the shortcuts row and move this logic there.
+ int rowCount = 0;
+ int columnCount = 0;
+ for (int i = 0; i < container.getChildCount(); i++) {
+ View row = container.getChildAt(i);
+ int rowColumnCount = 0;
+ if (row instanceof ViewGroup rowGroup && row.getVisibility() == View.VISIBLE) {
+ for (int j = 0; j < rowGroup.getChildCount(); j++) {
+ View v = rowGroup.getChildAt(j);
+ if (v != null && v.getVisibility() == View.VISIBLE) {
+ rowColumnCount++;
+ if (v instanceof TextView) {
+ // A special case of the no-targets message that also contains an
+ // off-screen item (which looks like a bug).
+ rowColumnCount = 1;
+ break;
+ }
+ }
+ }
+ }
+ if (rowColumnCount > 0) {
+ rowCount++;
+ columnCount = Math.max(columnCount, rowColumnCount);
+ }
+ }
+ return CollectionInfoCompat.obtain(rowCount, columnCount, false);
+ }
+
+ private CollectionInfoCompat createSuggestedAppsA11yCollectionInfo(ViewGroup container) {
+ // TODO: create a custom view for the suggested apps row and move this logic there.
+ int columnCount = 0;
+ for (int i = 0; i < container.getChildCount(); i++) {
+ View v = container.getChildAt(i);
+ if (v.getVisibility() == View.VISIBLE) {
+ columnCount++;
+ }
+ }
+ return CollectionInfoCompat.obtain(1, columnCount, false);
+ }
}
diff --git a/java/src/com/android/intentresolver/ChooserHelper.kt b/java/src/com/android/intentresolver/ChooserHelper.kt
index c26dd77c..2d015128 100644
--- a/java/src/com/android/intentresolver/ChooserHelper.kt
+++ b/java/src/com/android/intentresolver/ChooserHelper.kt
@@ -27,6 +27,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
+import com.android.intentresolver.Flags.interactiveSession
import com.android.intentresolver.Flags.unselectFinalItem
import com.android.intentresolver.annotation.JavaInterop
import com.android.intentresolver.contentpreview.ContentPreviewType.CONTENT_PREVIEW_PAYLOAD_SELECTION
@@ -188,6 +189,14 @@ constructor(
.collect { onChooserRequestChanged.accept(it) }
}
}
+
+ if (interactiveSession()) {
+ activity.lifecycleScope.launch {
+ viewModel.interactiveSessionInteractor.isSessionActive
+ .filter { !it }
+ .collect { activity.finish() }
+ }
+ }
}
override fun onStart(owner: LifecycleOwner) {
diff --git a/java/src/com/android/intentresolver/ChooserListAdapter.java b/java/src/com/android/intentresolver/ChooserListAdapter.java
index 563d7d1a..d743f859 100644
--- a/java/src/com/android/intentresolver/ChooserListAdapter.java
+++ b/java/src/com/android/intentresolver/ChooserListAdapter.java
@@ -811,6 +811,13 @@ public class ChooserListAdapter extends ResolverListAdapter {
mServiceTargets.addAll(adapter.mServiceTargets);
}
+ /**
+ * Reset direct targets
+ */
+ public void resetDirectTargets() {
+ createPlaceHolders();
+ }
+
private boolean isDirectTargetRowEmptyState() {
return (mServiceTargets.size() == 1) && mServiceTargets.get(0).isEmptyTargetInfo();
}
diff --git a/java/src/com/android/intentresolver/ChooserSelector.kt b/java/src/com/android/intentresolver/ChooserSelector.kt
deleted file mode 100644
index c1174e95..00000000
--- a/java/src/com/android/intentresolver/ChooserSelector.kt
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.intentresolver.v2
-
-import android.content.BroadcastReceiver
-import android.content.ComponentName
-import android.content.Context
-import android.content.Intent
-import android.content.pm.PackageManager
-import com.android.intentresolver.FeatureFlags
-import dagger.hilt.android.AndroidEntryPoint
-import javax.inject.Inject
-
-@AndroidEntryPoint(BroadcastReceiver::class)
-class ChooserSelector : Hilt_ChooserSelector() {
-
- @Inject lateinit var featureFlags: FeatureFlags
-
- override fun onReceive(context: Context, intent: Intent) {
- super.onReceive(context, intent)
- if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
- context.packageManager.setComponentEnabledSetting(
- ComponentName(CHOOSER_PACKAGE, CHOOSER_PACKAGE + CHOOSER_CLASS),
- if (featureFlags.modularFramework()) {
- PackageManager.COMPONENT_ENABLED_STATE_ENABLED
- } else {
- PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
- },
- /* flags = */ 0,
- )
- }
- }
-
- companion object {
- private const val CHOOSER_PACKAGE = "com.android.intentresolver"
- private const val CHOOSER_CLASS = ".v2.ChooserActivity"
- }
-}
diff --git a/java/src/com/android/intentresolver/IntentForwarderActivity.java b/java/src/com/android/intentresolver/IntentForwarderActivity.java
index db94c918..30e518fa 100644
--- a/java/src/com/android/intentresolver/IntentForwarderActivity.java
+++ b/java/src/com/android/intentresolver/IntentForwarderActivity.java
@@ -312,30 +312,44 @@ public class IntentForwarderActivity extends Activity {
* forwarding if it can be forwarded, {@code null} otherwise.
*/
public static Intent canForward(Intent incomingIntent, int sourceUserId, int targetUserId,
- IPackageManager packageManager, ContentResolver contentResolver) {
+ IPackageManager packageManager, ContentResolver contentResolver) {
Intent forwardIntent = new Intent(incomingIntent);
forwardIntent.addFlags(
Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
sanitizeIntent(forwardIntent);
- Intent intentToCheck = forwardIntent;
- if (Intent.ACTION_CHOOSER.equals(forwardIntent.getAction())) {
+ if (!canForwardInner(forwardIntent, sourceUserId, targetUserId, packageManager,
+ contentResolver)) {
return null;
}
+
if (forwardIntent.getSelector() != null) {
- intentToCheck = forwardIntent.getSelector();
+ sanitizeIntent(forwardIntent.getSelector());
+
+ if (!canForwardInner(forwardIntent.getSelector(), sourceUserId, targetUserId,
+ packageManager, contentResolver)) {
+ return null;
+ }
+ }
+ return forwardIntent;
+ }
+
+ private static boolean canForwardInner(Intent intent, int sourceUserId, int targetUserId,
+ IPackageManager packageManager, ContentResolver contentResolver) {
+ if (Intent.ACTION_CHOOSER.equals(intent.getAction())) {
+ return false;
}
- String resolvedType = intentToCheck.resolveTypeIfNeeded(contentResolver);
- sanitizeIntent(intentToCheck);
+
+ String resolvedType = intent.resolveTypeIfNeeded(contentResolver);
try {
if (packageManager.canForwardTo(
- intentToCheck, resolvedType, sourceUserId, targetUserId)) {
- return forwardIntent;
+ intent, resolvedType, sourceUserId, targetUserId)) {
+ return true;
}
} catch (RemoteException e) {
Slog.e(TAG, "PackageManagerService is dead?");
}
- return null;
+ return false;
}
/**
diff --git a/java/src/com/android/intentresolver/ProfileHelper.kt b/java/src/com/android/intentresolver/ProfileHelper.kt
index 53a873a3..b87f7e3f 100644
--- a/java/src/com/android/intentresolver/ProfileHelper.kt
+++ b/java/src/com/android/intentresolver/ProfileHelper.kt
@@ -20,12 +20,10 @@ import android.os.UserHandle
import androidx.annotation.MainThread
import com.android.intentresolver.annotation.JavaInterop
import com.android.intentresolver.domain.interactor.UserInteractor
-import com.android.intentresolver.inject.IntentResolverFlags
import com.android.intentresolver.shared.model.Profile
import com.android.intentresolver.shared.model.User
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
@@ -33,12 +31,7 @@ import kotlinx.coroutines.runBlocking
@MainThread
class ProfileHelper
@Inject
-constructor(
- interactor: UserInteractor,
- private val scope: CoroutineScope,
- private val background: CoroutineDispatcher,
- private val flags: IntentResolverFlags,
-) {
+constructor(interactor: UserInteractor, private val background: CoroutineDispatcher) {
private val launchedByHandle: UserHandle = interactor.launchedAs
val launchedAsProfile by lazy {
diff --git a/java/src/com/android/intentresolver/ResolverActivity.java b/java/src/com/android/intentresolver/ResolverActivity.java
index 38259281..a63b3a98 100644
--- a/java/src/com/android/intentresolver/ResolverActivity.java
+++ b/java/src/com/android/intentresolver/ResolverActivity.java
@@ -148,7 +148,6 @@ public class ResolverActivity extends Hilt_ResolverActivity implements
@Inject public DevicePolicyResources mDevicePolicyResources;
@Inject public ProfilePagerResources mProfilePagerResources;
@Inject public IntentForwarding mIntentForwarding;
- @Inject public FeatureFlags mFeatureFlags;
@Inject public ActivityModelRepository mActivityModelRepository;
@Inject public DefaultTargetDataLoader.Factory mTargetDataLoaderFactory;
@@ -323,9 +322,7 @@ public class ResolverActivity extends Hilt_ResolverActivity implements
mProfiles = new ProfileHelper(
mUserInteractor,
- getCoroutineScope(getLifecycle()),
- mBackgroundDispatcher,
- mFeatureFlags);
+ mBackgroundDispatcher);
mProfileAvailability = new ProfileAvailability(
mUserInteractor,
diff --git a/java/src/com/android/intentresolver/contentpreview/CachingImagePreviewImageLoader.kt b/java/src/com/android/intentresolver/contentpreview/CachingImagePreviewImageLoader.kt
deleted file mode 100644
index 847fcc82..00000000
--- a/java/src/com/android/intentresolver/contentpreview/CachingImagePreviewImageLoader.kt
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.intentresolver.contentpreview
-
-import android.graphics.Bitmap
-import android.net.Uri
-import android.util.Log
-import android.util.Size
-import androidx.core.util.lruCache
-import com.android.intentresolver.inject.Background
-import com.android.intentresolver.inject.ViewModelOwned
-import javax.inject.Inject
-import javax.inject.Qualifier
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Deferred
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.async
-import kotlinx.coroutines.ensureActive
-import kotlinx.coroutines.sync.Semaphore
-import kotlinx.coroutines.sync.withPermit
-import kotlinx.coroutines.withContext
-
-@Qualifier
-@MustBeDocumented
-@Retention(AnnotationRetention.BINARY)
-annotation class PreviewMaxConcurrency
-
-/**
- * Implementation of [ImageLoader].
- *
- * Allows for cached or uncached loading of images and limits the number of concurrent requests.
- * Requests are automatically cancelled when they are evicted from the cache. If image loading fails
- * or the request is cancelled (e.g. by eviction), the returned [Bitmap] will be null.
- */
-class CachingImagePreviewImageLoader
-@Inject
-constructor(
- @ViewModelOwned private val scope: CoroutineScope,
- @Background private val bgDispatcher: CoroutineDispatcher,
- private val thumbnailLoader: ThumbnailLoader,
- @PreviewCacheSize cacheSize: Int,
- @PreviewMaxConcurrency maxConcurrency: Int,
-) : ImageLoader {
-
- private val semaphore = Semaphore(maxConcurrency)
-
- private val cache =
- lruCache(
- maxSize = cacheSize,
- create = { uri: Uri -> scope.async { loadUncachedImage(uri) } },
- onEntryRemoved = { evicted: Boolean, _, oldValue: Deferred<Bitmap?>, _ ->
- // If removed due to eviction, cancel the coroutine, otherwise it is the
- // responsibility
- // of the caller of [cache.remove] to cancel the removed entry when done with it.
- if (evicted) {
- oldValue.cancel()
- }
- }
- )
-
- override fun prePopulate(uriSizePairs: List<Pair<Uri, Size>>) {
- uriSizePairs.take(cache.maxSize()).map { cache[it.first] }
- }
-
- override suspend fun invoke(uri: Uri, size: Size, caching: Boolean): Bitmap? {
- return if (caching) {
- loadCachedImage(uri)
- } else {
- loadUncachedImage(uri)
- }
- }
-
- private suspend fun loadUncachedImage(uri: Uri): Bitmap? =
- withContext(bgDispatcher) {
- runCatching { semaphore.withPermit { thumbnailLoader.loadThumbnail(uri) } }
- .onFailure {
- ensureActive()
- Log.d(TAG, "Failed to load preview for $uri", it)
- }
- .getOrNull()
- }
-
- private suspend fun loadCachedImage(uri: Uri): Bitmap? =
- // [Deferred#await] is called in a [runCatching] block to catch
- // [CancellationExceptions]s so that they don't cancel the calling coroutine/scope.
- runCatching { cache[uri].await() }.getOrNull()
-
- @OptIn(ExperimentalCoroutinesApi::class)
- override fun getCachedBitmap(uri: Uri): Bitmap? =
- kotlin.runCatching { cache[uri].getCompleted() }.getOrNull()
-
- companion object {
- private const val TAG = "CachingImgPrevLoader"
- }
-}
diff --git a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
index 4166e5ae..2af5881f 100644
--- a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
@@ -184,7 +184,8 @@ public final class ChooserContentPreviewUi {
imageLoader,
typeClassifier,
headlineGenerator,
- metadata
+ metadata,
+ chooserRequest.getCallerAllowsTextToggle()
);
if (previewData.getUriCount() > 0) {
JavaFlowHelper.collectToList(
diff --git a/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java
index 30161cfb..da701ec4 100644
--- a/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java
@@ -62,6 +62,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi {
private final CharSequence mMetadata;
private final boolean mIsSingleImage;
private final int mFileCount;
+ private final boolean mAllowTextToggle;
private ViewGroup mContentPreviewView;
private View mHeadliveView;
private boolean mIsMetadataUpdated = false;
@@ -70,8 +71,6 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi {
private boolean mAllImages;
private boolean mAllVideos;
private int mPreviewSize;
- // TODO(b/285309527): make this a flag
- private static final boolean SHOW_TOGGLE_CHECKMARK = false;
FilesPlusTextContentPreviewUi(
CoroutineScope scope,
@@ -83,7 +82,8 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi {
ImageLoader imageLoader,
MimeTypeClassifier typeClassifier,
HeadlineGenerator headlineGenerator,
- @Nullable CharSequence metadata) {
+ @Nullable CharSequence metadata,
+ boolean allowTextToggle) {
if (isSingleImage && fileCount != 1) {
throw new IllegalArgumentException(
"fileCount = " + fileCount + " and isSingleImage = true");
@@ -98,6 +98,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi {
mTypeClassifier = typeClassifier;
mHeadlineGenerator = headlineGenerator;
mMetadata = metadata;
+ mAllowTextToggle = allowTextToggle;
}
@Override
@@ -234,7 +235,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi {
shareTextAction.accept(!isChecked);
updateHeadline(headlineView, mFileCount, mAllImages, mAllVideos);
});
- if (SHOW_TOGGLE_CHECKMARK) {
+ if (mAllowTextToggle) {
includeText.setVisibility(View.VISIBLE);
}
}
diff --git a/java/src/com/android/intentresolver/contentpreview/HeadlineGenerator.kt b/java/src/com/android/intentresolver/contentpreview/HeadlineGenerator.kt
index 059ee083..9c4122bb 100644
--- a/java/src/com/android/intentresolver/contentpreview/HeadlineGenerator.kt
+++ b/java/src/com/android/intentresolver/contentpreview/HeadlineGenerator.kt
@@ -38,4 +38,6 @@ interface HeadlineGenerator {
fun getFilesHeadline(count: Int): String
fun getNotItemsSelectedHeadline(): String
+
+ fun getCopyButtonContentDescription(sharedText: CharSequence): String
}
diff --git a/java/src/com/android/intentresolver/contentpreview/HeadlineGeneratorImpl.kt b/java/src/com/android/intentresolver/contentpreview/HeadlineGeneratorImpl.kt
index 822d3097..ca01875b 100644
--- a/java/src/com/android/intentresolver/contentpreview/HeadlineGeneratorImpl.kt
+++ b/java/src/com/android/intentresolver/contentpreview/HeadlineGeneratorImpl.kt
@@ -33,11 +33,8 @@ private const val PLURALS_COUNT = "count"
* HeadlineGenerator generates the text to show at the top of the sharesheet as a brief description
* of the content being shared.
*/
-class HeadlineGeneratorImpl
-@Inject
-constructor(
- @ApplicationContext private val context: Context,
-) : HeadlineGenerator {
+class HeadlineGeneratorImpl @Inject constructor(@ApplicationContext private val context: Context) :
+ HeadlineGenerator {
override fun getTextHeadline(text: CharSequence): String {
return context.getString(
getTemplateResource(text, R.string.sharing_link, R.string.sharing_text)
@@ -53,9 +50,9 @@ constructor(
getTemplateResource(
text,
R.string.sharing_images_with_link,
- R.string.sharing_images_with_text
+ R.string.sharing_images_with_text,
),
- count
+ count,
)
}
@@ -64,9 +61,9 @@ constructor(
getTemplateResource(
text,
R.string.sharing_videos_with_link,
- R.string.sharing_videos_with_text
+ R.string.sharing_videos_with_text,
),
- count
+ count,
)
}
@@ -75,9 +72,9 @@ constructor(
getTemplateResource(
text,
R.string.sharing_files_with_link,
- R.string.sharing_files_with_text
+ R.string.sharing_files_with_text,
),
- count
+ count,
)
}
@@ -96,11 +93,17 @@ constructor(
override fun getNotItemsSelectedHeadline(): String =
context.getString(R.string.select_items_to_share)
+ override fun getCopyButtonContentDescription(sharedText: CharSequence): String {
+ return context.getString(
+ getTemplateResource(sharedText, R.string.copy_link, R.string.copy_text)
+ )
+ }
+
private fun getPluralString(@StringRes templateResource: Int, count: Int): String {
return PluralsMessageFormatter.format(
context.resources,
mapOf(PLURALS_COUNT to count),
- templateResource
+ templateResource,
)
}
@@ -108,7 +111,7 @@ constructor(
private fun getTemplateResource(
text: CharSequence,
@StringRes linkResource: Int,
- @StringRes nonLinkResource: Int
+ @StringRes nonLinkResource: Int,
): Int {
return if (text.toString().isHttpUri()) linkResource else nonLinkResource
}
diff --git a/java/src/com/android/intentresolver/contentpreview/ImageLoaderModule.kt b/java/src/com/android/intentresolver/contentpreview/ImageLoaderModule.kt
index 27e817db..7cc4458f 100644
--- a/java/src/com/android/intentresolver/contentpreview/ImageLoaderModule.kt
+++ b/java/src/com/android/intentresolver/contentpreview/ImageLoaderModule.kt
@@ -17,7 +17,6 @@
package com.android.intentresolver.contentpreview
import android.content.res.Resources
-import com.android.intentresolver.Flags
import com.android.intentresolver.R
import com.android.intentresolver.inject.ApplicationOwned
import dagger.Binds
@@ -25,25 +24,15 @@ import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent
-import javax.inject.Provider
@Module
@InstallIn(ViewModelComponent::class)
interface ImageLoaderModule {
@Binds fun thumbnailLoader(thumbnailLoader: ThumbnailLoaderImpl): ThumbnailLoader
- companion object {
- @Provides
- fun imageLoader(
- imagePreviewImageLoader: Provider<ImagePreviewImageLoader>,
- previewImageLoader: Provider<PreviewImageLoader>
- ): ImageLoader =
- if (Flags.previewImageLoader()) {
- previewImageLoader.get()
- } else {
- imagePreviewImageLoader.get()
- }
+ @Binds fun imageLoader(previewImageLoader: PreviewImageLoader): ImageLoader
+ companion object {
@Provides
@ThumbnailSize
fun thumbnailSize(@ApplicationOwned resources: Resources): Int =
diff --git a/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt b/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt
deleted file mode 100644
index 379bdb37..00000000
--- a/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.intentresolver.contentpreview
-
-import android.content.ContentResolver
-import android.graphics.Bitmap
-import android.net.Uri
-import android.util.Log
-import android.util.Size
-import androidx.annotation.GuardedBy
-import androidx.annotation.VisibleForTesting
-import androidx.collection.LruCache
-import com.android.intentresolver.inject.Background
-import javax.inject.Inject
-import javax.inject.Qualifier
-import kotlinx.coroutines.CancellationException
-import kotlinx.coroutines.CompletableDeferred
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineExceptionHandler
-import kotlinx.coroutines.CoroutineName
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Deferred
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.sync.Semaphore
-
-private const val TAG = "ImagePreviewImageLoader"
-
-@Qualifier @MustBeDocumented @Retention(AnnotationRetention.BINARY) annotation class ThumbnailSize
-
-@Qualifier
-@MustBeDocumented
-@Retention(AnnotationRetention.BINARY)
-annotation class PreviewCacheSize
-
-/**
- * Implements preview image loading for the content preview UI. Provides requests deduplication,
- * image caching, and a limit on the number of parallel loadings.
- */
-@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
-class ImagePreviewImageLoader
-@VisibleForTesting
-constructor(
- private val scope: CoroutineScope,
- thumbnailSize: Int,
- private val contentResolver: ContentResolver,
- cacheSize: Int,
- // TODO: consider providing a scope with the dispatcher configured with
- // [CoroutineDispatcher#limitedParallelism] instead
- private val contentResolverSemaphore: Semaphore,
-) : ImageLoader {
-
- @Inject
- constructor(
- @Background dispatcher: CoroutineDispatcher,
- @ThumbnailSize thumbnailSize: Int,
- contentResolver: ContentResolver,
- @PreviewCacheSize cacheSize: Int,
- ) : this(
- CoroutineScope(
- SupervisorJob() +
- dispatcher +
- CoroutineExceptionHandler { _, exception ->
- Log.w(TAG, "Uncaught exception in ImageLoader", exception)
- } +
- CoroutineName("ImageLoader")
- ),
- thumbnailSize,
- contentResolver,
- cacheSize,
- )
-
- constructor(
- scope: CoroutineScope,
- thumbnailSize: Int,
- contentResolver: ContentResolver,
- cacheSize: Int,
- maxSimultaneousRequests: Int = 4
- ) : this(scope, thumbnailSize, contentResolver, cacheSize, Semaphore(maxSimultaneousRequests))
-
- private val thumbnailSize: Size = Size(thumbnailSize, thumbnailSize)
-
- private val lock = Any()
- @GuardedBy("lock") private val cache = LruCache<Uri, RequestRecord>(cacheSize)
- @GuardedBy("lock") private val runningRequests = HashMap<Uri, RequestRecord>()
-
- override suspend fun invoke(uri: Uri, size: Size, caching: Boolean): Bitmap? =
- loadImageAsync(uri, caching)
-
- override fun prePopulate(uriSizePairs: List<Pair<Uri, Size>>) {
- uriSizePairs.asSequence().take(cache.maxSize()).forEach { (uri, _) ->
- scope.launch { loadImageAsync(uri, caching = true) }
- }
- }
-
- private suspend fun loadImageAsync(uri: Uri, caching: Boolean): Bitmap? {
- return getRequestDeferred(uri, caching).await()
- }
-
- private fun getRequestDeferred(uri: Uri, caching: Boolean): Deferred<Bitmap?> {
- var shouldLaunchImageLoading = false
- val request =
- synchronized(lock) {
- cache[uri]
- ?: runningRequests
- .getOrPut(uri) {
- shouldLaunchImageLoading = true
- RequestRecord(uri, CompletableDeferred(), caching)
- }
- .apply { this.caching = this.caching || caching }
- }
- if (shouldLaunchImageLoading) {
- request.loadBitmapAsync()
- }
- return request.deferred
- }
-
- private fun RequestRecord.loadBitmapAsync() {
- scope
- .launch { loadBitmap() }
- .invokeOnCompletion { cause ->
- if (cause is CancellationException) {
- cancel()
- }
- }
- }
-
- private suspend fun RequestRecord.loadBitmap() {
- contentResolverSemaphore.acquire()
- val bitmap =
- try {
- contentResolver.loadThumbnail(uri, thumbnailSize, null)
- } catch (t: Throwable) {
- Log.d(TAG, "failed to load $uri preview", t)
- null
- } finally {
- contentResolverSemaphore.release()
- }
- complete(bitmap)
- }
-
- private fun RequestRecord.cancel() {
- synchronized(lock) {
- runningRequests.remove(uri)
- deferred.cancel()
- }
- }
-
- private fun RequestRecord.complete(bitmap: Bitmap?) {
- deferred.complete(bitmap)
- synchronized(lock) {
- runningRequests.remove(uri)
- if (bitmap != null && caching) {
- cache.put(uri, this)
- }
- }
- }
-
- private class RequestRecord(
- val uri: Uri,
- val deferred: CompletableDeferred<Bitmap?>,
- @GuardedBy("lock") var caching: Boolean
- )
-}
diff --git a/java/src/com/android/intentresolver/contentpreview/PreviewImageLoader.kt b/java/src/com/android/intentresolver/contentpreview/PreviewImageLoader.kt
index b10f7ef9..44d88c41 100644
--- a/java/src/com/android/intentresolver/contentpreview/PreviewImageLoader.kt
+++ b/java/src/com/android/intentresolver/contentpreview/PreviewImageLoader.kt
@@ -25,6 +25,7 @@ import com.android.intentresolver.inject.Background
import com.android.intentresolver.inject.ViewModelOwned
import javax.annotation.concurrent.GuardedBy
import javax.inject.Inject
+import javax.inject.Qualifier
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -39,7 +40,19 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
-private const val TAG = "PayloadSelImageLoader"
+private const val TAG = "ImageLoader"
+
+@Qualifier @MustBeDocumented @Retention(AnnotationRetention.BINARY) annotation class ThumbnailSize
+
+@Qualifier
+@MustBeDocumented
+@Retention(AnnotationRetention.BINARY)
+annotation class PreviewCacheSize
+
+@Qualifier
+@MustBeDocumented
+@Retention(AnnotationRetention.BINARY)
+annotation class PreviewMaxConcurrency
/**
* Implements preview image loading for the payload selection UI. Cancels preview loading for items
@@ -69,7 +82,7 @@ constructor(
if (oldRec !== newRec) {
onRecordEvictedFromCache(oldRec)
}
- }
+ },
)
override suspend fun invoke(uri: Uri, size: Size, caching: Boolean): Bitmap? =
@@ -104,7 +117,7 @@ constructor(
private suspend fun withRequestRecord(
uri: Uri,
caching: Boolean,
- block: suspend (RequestRecord) -> Bitmap?
+ block: suspend (RequestRecord) -> Bitmap?,
): Bitmap? {
val record = trackRecordRunning(uri, caching)
return try {
diff --git a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
index 45a0130d..8592e6ae 100644
--- a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
@@ -142,6 +142,8 @@ class TextContentPreviewUi extends ContentPreviewUi {
View copyButton = contentPreviewLayout.findViewById(R.id.copy);
if (copyButton != null) {
if (onCopy != null) {
+ copyButton.setContentDescription(
+ mHeadlineGenerator.getCopyButtonContentDescription(mSharingText));
copyButton.setOnClickListener((v) -> onCopy.run());
ViewCompat.setAccessibilityDelegate(
copyButton,
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ModifierExt.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ModifierExt.kt
new file mode 100644
index 00000000..a9d8b9dc
--- /dev/null
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ModifierExt.kt
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.intentresolver.contentpreview.payloadtoggle.ui.composable
+
+import androidx.compose.foundation.gestures.ScrollableState
+import androidx.compose.foundation.gestures.animateScrollBy
+import androidx.compose.foundation.gestures.awaitEachGesture
+import androidx.compose.foundation.gestures.awaitFirstDown
+import androidx.compose.foundation.gestures.waitForUpOrCancellation
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.input.pointer.PointerEventPass
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import kotlinx.coroutines.launch
+
+/** Calls [whenTrue] on this [Modifier] if [condition] is true. */
+@Composable
+inline fun Modifier.conditional(
+ condition: Boolean,
+ crossinline whenTrue: @Composable Modifier.() -> Modifier,
+): Modifier = if (condition) this.whenTrue() else this
+
+/**
+ * Overlays tap regions at the beginning and end of the scrollable region.
+ *
+ * When tap regions are tapped, [scrollableState] will be scrolled by the size of the modified
+ * scrollable multiplied by the [scrollRatio].
+ *
+ * Note: [scrollableState] must be shared with the scrollable being modified and [vertical] must be
+ * true only if the modified scrollable scrolls vertically.
+ */
+@Composable
+fun Modifier.tapToScroll(
+ scrollableState: ScrollableState,
+ vertical: Boolean = false,
+ tapRegionSize: Dp = 48.dp,
+ scrollRatio: Float = 0.5f,
+): Modifier {
+ val scope = rememberCoroutineScope()
+ var viewSize by remember { mutableStateOf(0) }
+ val isLtrLayoutDirection = LocalLayoutDirection.current == LayoutDirection.Ltr
+ val normalizedScrollVector = remember {
+ derivedStateOf {
+ if (vertical || isLtrLayoutDirection) {
+ viewSize * scrollRatio
+ } else {
+ -viewSize * scrollRatio
+ }
+ }
+ }
+ return onGloballyPositioned { viewSize = if (vertical) it.size.height else it.size.width }
+ .pointerInput(Unit) {
+ val tapRegionSizePx = tapRegionSize.roundToPx()
+
+ awaitEachGesture {
+ // Tap to scroll is disabled if the modified composable is not large enough to fit
+ // both tap regions.
+ if (viewSize < tapRegionSizePx * 2) return@awaitEachGesture
+
+ val down = awaitFirstDown(pass = PointerEventPass.Initial)
+ if (down.isConsumed) return@awaitEachGesture
+
+ val downPosition = if (vertical) down.position.y else down.position.x
+ val scrollVector =
+ when {
+ // Start taps scroll toward start
+ downPosition <= tapRegionSizePx -> -normalizedScrollVector.value
+
+ // End taps scroll toward end
+ downPosition >= viewSize - tapRegionSizePx -> normalizedScrollVector.value
+
+ // Middle taps are ignored
+ else -> return@awaitEachGesture
+ }
+
+ val up =
+ waitForUpOrCancellation(pass = PointerEventPass.Initial)
+ ?: return@awaitEachGesture
+
+ // Long presses are ignored
+ if (up.uptimeMillis - down.uptimeMillis >= viewConfiguration.longPressTimeoutMillis)
+ return@awaitEachGesture
+
+ // Swipes are ignored
+ if ((up.position - down.position).getDistance() >= viewConfiguration.touchSlop)
+ return@awaitEachGesture
+
+ down.consume()
+ up.consume()
+ scope.launch { scrollableState.animateScrollBy(scrollVector) }
+ }
+ }
+}
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt
index c51021a8..015a0490 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt
@@ -15,11 +15,14 @@
*/
package com.android.intentresolver.contentpreview.payloadtoggle.ui.composable
+import android.graphics.Bitmap
import androidx.compose.animation.Crossfade
+import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -36,7 +39,6 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.itemsIndexed
-import androidx.compose.foundation.selection.toggleable
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.systemGestureExclusion
import androidx.compose.material3.AssistChip
@@ -52,14 +54,17 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
+import androidx.compose.ui.draw.scale
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.MeasureScope
import androidx.compose.ui.layout.Placeable
import androidx.compose.ui.layout.layout
+import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.contentDescription
@@ -67,7 +72,10 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.android.intentresolver.Flags.announceShareouselItemListPosition
import com.android.intentresolver.Flags.shareouselScrollOffscreenSelections
+import com.android.intentresolver.Flags.shareouselSelectionShrink
+import com.android.intentresolver.Flags.shareouselTapToScrollSupport
import com.android.intentresolver.Flags.unselectFinalItem
import com.android.intentresolver.R
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ValueUpdate
@@ -80,6 +88,7 @@ import com.android.intentresolver.contentpreview.payloadtoggle.ui.viewmodel.Shar
import kotlin.math.abs
import kotlin.math.min
import kotlin.math.roundToInt
+import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
@@ -126,6 +135,7 @@ private fun PreviewCarousel(previews: PreviewsModel, viewModel: ShareouselViewMo
}
layout(placeable.width, placeable.height) { placeable.place(0, 0) }
}
+ .systemGestureExclusion()
) {
// Do not compose the list until we have measured values
if (measurements == PreviewCarouselMeasurements.UNMEASURED) return@Box
@@ -142,150 +152,235 @@ private fun PreviewCarousel(previews: PreviewsModel, viewModel: ShareouselViewMo
)
}
- LazyRow(
+ PreviewCarouselItems(
state = carouselState,
- horizontalArrangement = Arrangement.spacedBy(4.dp),
- contentPadding =
- PaddingValues(
- start = measurements.horizontalPaddingDp,
- end = measurements.horizontalPaddingDp,
- ),
- modifier = Modifier.fillMaxSize().systemGestureExclusion(),
- ) {
- itemsIndexed(
- items = previews.previewModels,
- key = { _, model -> model.key.key to model.key.isFinal },
- ) { index, model ->
- val visibleItem by remember {
- derivedStateOf {
- carouselState.layoutInfo.visibleItemsInfo.firstOrNull { it.index == index }
- }
+ measurements = measurements,
+ previews = previews,
+ viewModel = viewModel,
+ )
+ }
+}
+
+@Composable
+private fun PreviewCarouselItems(
+ state: LazyListState,
+ measurements: PreviewCarouselMeasurements,
+ previews: PreviewsModel,
+ viewModel: ShareouselViewModel,
+) {
+ LazyRow(
+ state = state,
+ horizontalArrangement = Arrangement.spacedBy(4.dp),
+ contentPadding =
+ PaddingValues(
+ start = measurements.horizontalPaddingDp,
+ end = measurements.horizontalPaddingDp,
+ ),
+ modifier =
+ Modifier.fillMaxSize().conditional(shareouselTapToScrollSupport()) {
+ tapToScroll(scrollableState = state)
+ },
+ ) {
+ itemsIndexed(
+ items = previews.previewModels,
+ key = { _, model -> model.key.key to model.key.isFinal },
+ ) { index, model ->
+ val visibleItem by remember {
+ derivedStateOf {
+ state.layoutInfo.visibleItemsInfo.firstOrNull { it.index == index }
}
+ }
- // Index if this is the element in the center of the viewing area, otherwise null
- val previewIndex by remember {
- derivedStateOf {
- visibleItem?.let {
- val halfPreviewWidth = it.size / 2
- val previewCenter = it.offset + halfPreviewWidth
- val previewDistanceToViewportCenter =
- abs(previewCenter - measurements.viewportCenterPx)
- if (previewDistanceToViewportCenter <= halfPreviewWidth) {
- index
- } else {
- null
- }
+ // Index if this is the element in the center of the viewing area, otherwise null
+ val previewIndex by remember {
+ derivedStateOf {
+ visibleItem?.let {
+ val halfPreviewWidth = it.size / 2
+ val previewCenter = it.offset + halfPreviewWidth
+ val previewDistanceToViewportCenter =
+ abs(previewCenter - measurements.viewportCenterPx)
+ if (previewDistanceToViewportCenter <= halfPreviewWidth) {
+ index
+ } else {
+ null
}
}
}
+ }
- val previewModel =
- viewModel.preview(
- /* key = */ model,
- /* previewHeight = */ measurements.viewportHeightPx,
- /* index = */ previewIndex,
- /* scope = */ rememberCoroutineScope(),
- )
+ val previewModel =
+ viewModel.preview(
+ /* key = */ model,
+ /* previewHeight = */ measurements.viewportHeightPx,
+ /* index = */ previewIndex,
+ /* scope = */ rememberCoroutineScope(),
+ )
- if (shareouselScrollOffscreenSelections()) {
- LaunchedEffect(index, model.uri) {
- var current: Boolean? = null
- previewModel.isSelected.collect { selected ->
- when {
- // First update will always be the current state, so we just want to
- // record the state and do nothing else.
- current == null -> current = selected
+ if (shareouselScrollOffscreenSelections()) {
+ ScrollOffscreenSelectionsEffect(
+ index = index,
+ previewModel = model,
+ isSelected = previewModel.isSelected,
+ state = state,
+ measurements = measurements,
+ )
+ }
+
+ ShareouselCard(
+ viewModel = previewModel,
+ aspectRatio = measurements.coerceAspectRatio(previewModel.aspectRatio),
+ annotateWithPosition = previews.previewModels.size > 1,
+ )
+ }
+ }
+}
+
+@Composable
+private fun ScrollOffscreenSelectionsEffect(
+ index: Int,
+ previewModel: PreviewModel,
+ isSelected: Flow<Boolean>,
+ state: LazyListState,
+ measurements: PreviewCarouselMeasurements,
+) {
+ LaunchedEffect(index, previewModel.uri) {
+ var current: Boolean? = null
+ isSelected.collect { selected ->
+ when {
+ // First update will always be the current state, so we just want to
+ // record the state and do nothing else.
+ current == null -> current = selected
- // We only want to act when the state changes
- current != selected -> {
- current = selected
- with(carouselState.layoutInfo) {
- visibleItemsInfo
- .firstOrNull { it.index == index }
- ?.let { item ->
- when {
- // Item is partially past start of viewport
- item.offset < viewportStartOffset ->
- measurements.scrollOffsetToStartEdge()
- // Item is partially past end of viewport
- (item.offset + item.size) > viewportEndOffset ->
- measurements.scrollOffsetToEndEdge(model)
- // Item is fully within viewport
- else -> null
- }?.let { scrollOffset ->
- carouselState.animateScrollToItem(
- index = index,
- scrollOffset = scrollOffset,
- )
- }
- }
- }
+ // We only want to act when the state changes
+ current != selected -> {
+ current = selected
+ with(state.layoutInfo) {
+ visibleItemsInfo
+ .firstOrNull { it.index == index }
+ ?.let { item ->
+ when {
+ // Item is partially past start of viewport
+ item.offset < viewportStartOffset ->
+ measurements.scrollOffsetToStartEdge()
+ // Item is partially past end of viewport
+ (item.offset + item.size) > viewportEndOffset ->
+ measurements.scrollOffsetToEndEdge(previewModel)
+ // Item is fully within viewport
+ else -> null
+ }?.let { scrollOffset ->
+ state.animateScrollToItem(
+ index = index,
+ scrollOffset = scrollOffset,
+ )
}
}
- }
}
}
-
- ShareouselCard(
- viewModel = previewModel,
- aspectRatio = measurements.coerceAspectRatio(previewModel.aspectRatio),
- )
}
}
}
}
@Composable
-private fun ShareouselCard(viewModel: ShareouselPreviewViewModel, aspectRatio: Float) {
+private fun ShareouselCard(
+ viewModel: ShareouselPreviewViewModel,
+ aspectRatio: Float,
+ annotateWithPosition: Boolean,
+) {
val bitmapLoadState by viewModel.bitmapLoadState.collectAsStateWithLifecycle()
val selected by viewModel.isSelected.collectAsStateWithLifecycle(initialValue = false)
- val borderColor = MaterialTheme.colorScheme.primary
- val scope = rememberCoroutineScope()
val contentDescription =
+ buildContentDescription(annotateWithPosition = annotateWithPosition, viewModel = viewModel)
+
+ Box(
+ modifier = Modifier.fillMaxHeight().aspectRatio(aspectRatio),
+ contentAlignment = Alignment.Center,
+ ) {
+ val scope = rememberCoroutineScope()
+ Crossfade(
+ targetState = bitmapLoadState,
+ modifier =
+ Modifier.semantics { this.contentDescription = contentDescription }
+ .testTag(viewModel.testTag)
+ .clickable { scope.launch { viewModel.setSelected(!selected) } }
+ .conditional(shareouselSelectionShrink()) {
+ val selectionScale by animateFloatAsState(if (selected) 0.95f else 1f)
+ scale(selectionScale)
+ }
+ .clip(RoundedCornerShape(size = 12.dp)),
+ ) { state ->
+ if (state is ValueUpdate.Value) {
+ ShareouselBitmapCard(
+ bitmap = state.getOrDefault(null),
+ aspectRatio = aspectRatio,
+ contentType = viewModel.contentType,
+ selected = selected,
+ )
+ } else {
+ PlaceholderBox(aspectRatio)
+ }
+ }
+ }
+}
+
+@Composable
+private fun buildContentDescription(
+ annotateWithPosition: Boolean,
+ viewModel: ShareouselPreviewViewModel,
+): String = buildString {
+ if (
+ announceShareouselItemListPosition() &&
+ annotateWithPosition &&
+ viewModel.cursorPosition >= 0
+ ) {
+ // If item cursor position is not known, do not announce item position.
+ // We can have items with an unknown cursor position only when:
+ // * when we haven't got the cursor and showing the initially shared items;
+ // * when we've got an inconsistent data from the app (some initially shared items
+ // are missing in the cursor);
+ append(stringResource(R.string.item_position_label, viewModel.cursorPosition + 1))
+ append(", ")
+ }
+ append(
when (viewModel.contentType) {
ContentType.Image -> stringResource(R.string.selectable_image)
ContentType.Video -> stringResource(R.string.selectable_video)
else -> stringResource(R.string.selectable_item)
}
- Crossfade(
- targetState = bitmapLoadState,
- modifier =
- Modifier.semantics { this.contentDescription = contentDescription }
- .clip(RoundedCornerShape(size = 12.dp))
- .toggleable(
- value = selected,
- onValueChange = { scope.launch { viewModel.setSelected(it) } },
- ),
- ) { state ->
- if (state is ValueUpdate.Value) {
- state.getOrDefault(null).let { bitmap ->
- ShareouselCard(
- image = {
- bitmap?.let {
- Image(
- bitmap = bitmap.asImageBitmap(),
- contentDescription = null,
- contentScale = ContentScale.Crop,
- modifier = Modifier.aspectRatio(aspectRatio),
- )
- } ?: PlaceholderBox(aspectRatio)
- },
- contentType = viewModel.contentType,
- selected = selected,
- modifier =
- Modifier.thenIf(selected) {
- Modifier.border(
- width = 4.dp,
- color = borderColor,
- shape = RoundedCornerShape(size = 12.dp),
- )
- },
+ )
+}
+
+@Composable
+private fun ShareouselBitmapCard(
+ bitmap: Bitmap?,
+ aspectRatio: Float,
+ contentType: ContentType,
+ selected: Boolean,
+) {
+ ShareouselCard(
+ image = {
+ if (bitmap == null) {
+ PlaceholderBox(aspectRatio)
+ } else {
+ Image(
+ bitmap = bitmap.asImageBitmap(),
+ contentDescription = null,
+ contentScale = ContentScale.Crop,
+ modifier = Modifier.aspectRatio(aspectRatio),
)
}
- } else {
- PlaceholderBox(aspectRatio)
- }
- }
+ },
+ contentType = contentType,
+ selected = selected,
+ modifier =
+ Modifier.conditional(selected) {
+ border(
+ width = 4.dp,
+ color = MaterialTheme.colorScheme.primary,
+ shape = RoundedCornerShape(size = 12.dp),
+ )
+ },
+ )
}
@Composable
@@ -370,9 +465,6 @@ private fun ShareouselAction(
)
}
-inline fun Modifier.thenIf(condition: Boolean, crossinline factory: () -> Modifier): Modifier =
- if (condition) this.then(factory()) else this
-
private data class PreviewCarouselMeasurements(
val viewportHeightPx: Int,
val viewportWidthPx: Int,
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselPreviewViewModel.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselPreviewViewModel.kt
index de435290..85f278a6 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselPreviewViewModel.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselPreviewViewModel.kt
@@ -33,4 +33,6 @@ data class ShareouselPreviewViewModel(
/** Sets whether this preview has been selected by the user. */
val setSelected: suspend (Boolean) -> Unit,
val aspectRatio: Float,
+ val cursorPosition: Int,
+ val testTag: String,
)
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt
index ebcd58d1..45e01e9d 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt
@@ -16,14 +16,10 @@
package com.android.intentresolver.contentpreview.payloadtoggle.ui.viewmodel
import android.util.Size
-import com.android.intentresolver.Flags
import com.android.intentresolver.Flags.unselectFinalItem
-import com.android.intentresolver.contentpreview.CachingImagePreviewImageLoader
import com.android.intentresolver.contentpreview.HeadlineGenerator
import com.android.intentresolver.contentpreview.ImageLoader
import com.android.intentresolver.contentpreview.MimeTypeClassifier
-import com.android.intentresolver.contentpreview.PreviewImageLoader
-import com.android.intentresolver.contentpreview.payloadtoggle.domain.cursor.PayloadToggle
import com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor.ChooserRequestInteractor
import com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor.CustomActionsInteractor
import com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor.SelectablePreviewsInteractor
@@ -37,7 +33,6 @@ import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent
-import javax.inject.Provider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
@@ -65,7 +60,7 @@ data class ShareouselViewModel(
/** Creates a [ShareouselPreviewViewModel] for a [PreviewModel] present in [previews]. */
val preview:
(
- key: PreviewModel, previewHeight: Int, index: Int?, scope: CoroutineScope
+ key: PreviewModel, previewHeight: Int, index: Int?, scope: CoroutineScope,
) -> ShareouselPreviewViewModel,
)
@@ -74,21 +69,9 @@ data class ShareouselViewModel(
object ShareouselViewModelModule {
@Provides
- @PayloadToggle
- fun imageLoader(
- cachingImageLoader: Provider<CachingImagePreviewImageLoader>,
- previewImageLoader: Provider<PreviewImageLoader>
- ): ImageLoader =
- if (Flags.previewImageLoader()) {
- previewImageLoader.get()
- } else {
- cachingImageLoader.get()
- }
-
- @Provides
fun create(
interactor: SelectablePreviewsInteractor,
- @PayloadToggle imageLoader: ImageLoader,
+ imageLoader: ImageLoader,
actionsInteractor: CustomActionsInteractor,
headlineGenerator: HeadlineGenerator,
selectionInteractor: SelectionInteractor,
@@ -97,12 +80,7 @@ object ShareouselViewModelModule {
// TODO: remove if possible
@ViewModelOwned scope: CoroutineScope,
): ShareouselViewModel {
- val keySet =
- interactor.previews.stateIn(
- scope,
- SharingStarted.Eagerly,
- initialValue = null,
- )
+ val keySet = interactor.previews.stateIn(scope, SharingStarted.Eagerly, initialValue = null)
return ShareouselViewModel(
headline =
selectionInteractor.aggregateContentType.zip(selectionInteractor.amountSelected) {
@@ -174,6 +152,9 @@ object ShareouselViewModelModule {
isSelected = previewInteractor.isSelected,
setSelected = previewInteractor::setSelected,
aspectRatio = key.aspectRatio,
+ // only items with a final key has a known cursor position
+ cursorPosition = if (key.key.isFinal) key.order else -1,
+ testTag = key.uri.toString(),
)
},
)
diff --git a/java/src/com/android/intentresolver/data/model/ChooserRequest.kt b/java/src/com/android/intentresolver/data/model/ChooserRequest.kt
index c4aa2b98..ad338103 100644
--- a/java/src/com/android/intentresolver/data/model/ChooserRequest.kt
+++ b/java/src/com/android/intentresolver/data/model/ChooserRequest.kt
@@ -28,7 +28,9 @@ import android.service.chooser.ChooserAction
import android.service.chooser.ChooserTarget
import androidx.annotation.StringRes
import com.android.intentresolver.ContentTypeHint
+import com.android.intentresolver.IChooserInteractiveSessionCallback
import com.android.intentresolver.ext.hasAction
+import com.android.systemui.shared.Flags.screenshotContextUrl
const val ANDROID_APP_SCHEME = "android-app"
@@ -182,6 +184,7 @@ data class ChooserRequest(
* Specified by the [Intent.EXTRA_METADATA_TEXT]
*/
val metadataText: CharSequence? = null,
+ val interactiveSessionCallback: IChooserInteractiveSessionCallback? = null,
) {
val referrerPackage = referrer?.takeIf { it.scheme == ANDROID_APP_SCHEME }?.authority
@@ -194,4 +197,7 @@ data class ChooserRequest(
}
val payloadIntents = listOf(targetIntent) + additionalTargets
+
+ val callerAllowsTextToggle =
+ screenshotContextUrl() && "com.android.systemui".equals(referrerPackage)
}
diff --git a/java/src/com/android/intentresolver/data/repository/ChooserRequestRepository.kt b/java/src/com/android/intentresolver/data/repository/ChooserRequestRepository.kt
index 14177b1b..8b7885c9 100644
--- a/java/src/com/android/intentresolver/data/repository/ChooserRequestRepository.kt
+++ b/java/src/com/android/intentresolver/data/repository/ChooserRequestRepository.kt
@@ -25,10 +25,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
@ViewModelScoped
class ChooserRequestRepository
@Inject
-constructor(
- initialRequest: ChooserRequest,
- initialActions: List<CustomActionModel>,
-) {
+constructor(val initialRequest: ChooserRequest, initialActions: List<CustomActionModel>) {
/** All information from the sharing application pertaining to the chooser. */
val chooserRequest: MutableStateFlow<ChooserRequest> = MutableStateFlow(initialRequest)
diff --git a/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java b/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java
index 9a50d7e4..f78fffd6 100644
--- a/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java
+++ b/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java
@@ -37,7 +37,6 @@ import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.android.intentresolver.ChooserListAdapter;
-import com.android.intentresolver.FeatureFlags;
import com.android.intentresolver.R;
import com.android.intentresolver.ResolverListAdapter.ViewHolder;
@@ -89,7 +88,6 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
private final int mMaxTargetsPerRow;
private final boolean mShouldShowContentPreview;
private final int mChooserRowTextOptionTranslatePixelSize;
- private final FeatureFlags mFeatureFlags;
@Nullable
private RecyclerView mRecyclerView;
@@ -104,8 +102,7 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
ChooserActivityDelegate chooserActivityDelegate,
ChooserListAdapter wrappedAdapter,
boolean shouldShowContentPreview,
- int maxTargetsPerRow,
- FeatureFlags featureFlags) {
+ int maxTargetsPerRow) {
super();
mChooserActivityDelegate = chooserActivityDelegate;
@@ -118,7 +115,6 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
mChooserRowTextOptionTranslatePixelSize = context.getResources().getDimensionPixelSize(
R.dimen.chooser_row_text_option_translate);
- mFeatureFlags = featureFlags;
wrappedAdapter.registerDataSetObserver(new DataSetObserver() {
@Override
diff --git a/java/src/com/android/intentresolver/inject/FeatureFlagsModule.kt b/java/src/com/android/intentresolver/inject/FeatureFlagsModule.kt
deleted file mode 100644
index d7be67db..00000000
--- a/java/src/com/android/intentresolver/inject/FeatureFlagsModule.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.intentresolver.inject
-
-import android.service.chooser.FeatureFlagsImpl as ChooserServiceFlagsImpl
-import com.android.intentresolver.FeatureFlagsImpl as IntentResolverFlagsImpl
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.InstallIn
-import dagger.hilt.components.SingletonComponent
-
-typealias IntentResolverFlags = com.android.intentresolver.FeatureFlags
-
-typealias FakeIntentResolverFlags = com.android.intentresolver.FakeFeatureFlagsImpl
-
-typealias ChooserServiceFlags = android.service.chooser.FeatureFlags
-
-typealias FakeChooserServiceFlags = android.service.chooser.FakeFeatureFlagsImpl
-
-@Module
-@InstallIn(SingletonComponent::class)
-object FeatureFlagsModule {
-
- @Provides fun intentResolverFlags(): IntentResolverFlags = IntentResolverFlagsImpl()
-
- @Provides fun chooserServiceFlags(): ChooserServiceFlags = ChooserServiceFlagsImpl()
-}
diff --git a/java/src/com/android/intentresolver/interactive/data/repository/InteractiveSessionCallbackRepository.kt b/java/src/com/android/intentresolver/interactive/data/repository/InteractiveSessionCallbackRepository.kt
new file mode 100644
index 00000000..f8894de5
--- /dev/null
+++ b/java/src/com/android/intentresolver/interactive/data/repository/InteractiveSessionCallbackRepository.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.intentresolver.interactive.data.repository
+
+import android.os.Bundle
+import androidx.lifecycle.SavedStateHandle
+import com.android.intentresolver.IChooserController
+import com.android.intentresolver.interactive.domain.model.ChooserIntentUpdater
+import dagger.hilt.android.scopes.ViewModelScoped
+import java.util.concurrent.atomic.AtomicReference
+import javax.inject.Inject
+
+private const val INTERACTIVE_SESSION_CALLBACK_KEY = "interactive-session-callback"
+
+@ViewModelScoped
+class InteractiveSessionCallbackRepository @Inject constructor(savedStateHandle: SavedStateHandle) {
+ private val intentUpdaterRef =
+ AtomicReference<ChooserIntentUpdater?>(
+ savedStateHandle
+ .get<Bundle>(INTERACTIVE_SESSION_CALLBACK_KEY)
+ ?.let { it.getBinder(INTERACTIVE_SESSION_CALLBACK_KEY) }
+ ?.let { binder ->
+ binder.queryLocalInterface(IChooserController.DESCRIPTOR)
+ as? ChooserIntentUpdater
+ }
+ )
+
+ val intentUpdater: ChooserIntentUpdater?
+ get() = intentUpdaterRef.get()
+
+ init {
+ savedStateHandle.setSavedStateProvider(INTERACTIVE_SESSION_CALLBACK_KEY) {
+ Bundle().apply { putBinder(INTERACTIVE_SESSION_CALLBACK_KEY, intentUpdater) }
+ }
+ }
+
+ fun setChooserIntentUpdater(intentUpdater: ChooserIntentUpdater) {
+ intentUpdaterRef.compareAndSet(null, intentUpdater)
+ }
+}
diff --git a/java/src/com/android/intentresolver/interactive/domain/interactor/InteractiveSessionInteractor.kt b/java/src/com/android/intentresolver/interactive/domain/interactor/InteractiveSessionInteractor.kt
new file mode 100644
index 00000000..09b79985
--- /dev/null
+++ b/java/src/com/android/intentresolver/interactive/domain/interactor/InteractiveSessionInteractor.kt
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.intentresolver.interactive.domain.interactor
+
+import android.content.Intent
+import android.os.Bundle
+import android.os.IBinder
+import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.PendingSelectionCallbackRepository
+import com.android.intentresolver.data.model.ChooserRequest
+import com.android.intentresolver.data.repository.ActivityModelRepository
+import com.android.intentresolver.data.repository.ChooserRequestRepository
+import com.android.intentresolver.interactive.data.repository.InteractiveSessionCallbackRepository
+import com.android.intentresolver.interactive.domain.model.ChooserIntentUpdater
+import com.android.intentresolver.ui.viewmodel.readChooserRequest
+import com.android.intentresolver.validation.Invalid
+import com.android.intentresolver.validation.Valid
+import com.android.intentresolver.validation.log
+import dagger.hilt.android.scopes.ViewModelScoped
+import javax.inject.Inject
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.update
+import kotlinx.coroutines.launch
+
+private const val TAG = "ChooserSession"
+
+@ViewModelScoped
+class InteractiveSessionInteractor
+@Inject
+constructor(
+ activityModelRepo: ActivityModelRepository,
+ private val chooserRequestRepository: ChooserRequestRepository,
+ private val pendingSelectionCallbackRepo: PendingSelectionCallbackRepository,
+ private val interactiveCallbackRepo: InteractiveSessionCallbackRepository,
+) {
+ private val activityModel = activityModelRepo.value
+ private val sessionCallback =
+ chooserRequestRepository.initialRequest.interactiveSessionCallback?.let {
+ SafeChooserInteractiveSessionCallback(it)
+ }
+ val isSessionActive = MutableStateFlow(true)
+
+ suspend fun activate() = coroutineScope {
+ if (sessionCallback == null || activityModel.isTaskRoot) {
+ sessionCallback?.registerChooserController(null)
+ return@coroutineScope
+ }
+ launch {
+ val callbackBinder: IBinder = sessionCallback.asBinder()
+ if (callbackBinder.isBinderAlive) {
+ val deathRecipient = IBinder.DeathRecipient { isSessionActive.value = false }
+ callbackBinder.linkToDeath(deathRecipient, 0)
+ try {
+ awaitCancellation()
+ } finally {
+ runCatching { sessionCallback.asBinder().unlinkToDeath(deathRecipient, 0) }
+ }
+ } else {
+ isSessionActive.value = false
+ }
+ }
+ val chooserIntentUpdater =
+ interactiveCallbackRepo.intentUpdater
+ ?: ChooserIntentUpdater().also {
+ interactiveCallbackRepo.setChooserIntentUpdater(it)
+ sessionCallback.registerChooserController(it)
+ }
+ chooserIntentUpdater.chooserIntent.collect { onIntentUpdated(it) }
+ }
+
+ fun sendTopDrawerTopOffsetChange(offset: Int) {
+ sessionCallback?.onDrawerVerticalOffsetChanged(offset)
+ }
+
+ fun endSession() {
+ sessionCallback?.registerChooserController(null)
+ }
+
+ private fun onIntentUpdated(chooserIntent: Intent?) {
+ if (chooserIntent == null) {
+ isSessionActive.value = false
+ return
+ }
+
+ val result =
+ readChooserRequest(
+ chooserIntent.extras ?: Bundle(),
+ activityModel.launchedFromPackage,
+ activityModel.referrer,
+ )
+ when (result) {
+ is Valid<ChooserRequest> -> {
+ val newRequest = result.value
+ pendingSelectionCallbackRepo.pendingTargetIntent.compareAndSet(
+ null,
+ result.value.targetIntent,
+ )
+ chooserRequestRepository.chooserRequest.update {
+ it.copy(
+ targetIntent = newRequest.targetIntent,
+ targetAction = newRequest.targetAction,
+ isSendActionTarget = newRequest.isSendActionTarget,
+ targetType = newRequest.targetType,
+ filteredComponentNames = newRequest.filteredComponentNames,
+ callerChooserTargets = newRequest.callerChooserTargets,
+ additionalTargets = newRequest.additionalTargets,
+ replacementExtras = newRequest.replacementExtras,
+ initialIntents = newRequest.initialIntents,
+ shareTargetFilter = newRequest.shareTargetFilter,
+ chosenComponentSender = newRequest.chosenComponentSender,
+ refinementIntentSender = newRequest.refinementIntentSender,
+ )
+ }
+ pendingSelectionCallbackRepo.pendingTargetIntent.compareAndSet(
+ result.value.targetIntent,
+ null,
+ )
+ }
+ is Invalid -> {
+ result.errors.forEach { it.log(TAG) }
+ }
+ }
+ }
+}
diff --git a/java/src/com/android/intentresolver/interactive/domain/interactor/SafeChooserInteractiveSessionCallback.kt b/java/src/com/android/intentresolver/interactive/domain/interactor/SafeChooserInteractiveSessionCallback.kt
new file mode 100644
index 00000000..d746a3b5
--- /dev/null
+++ b/java/src/com/android/intentresolver/interactive/domain/interactor/SafeChooserInteractiveSessionCallback.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.intentresolver.interactive.domain.interactor
+
+import android.util.Log
+import com.android.intentresolver.IChooserController
+import com.android.intentresolver.IChooserInteractiveSessionCallback
+
+private const val TAG = "SessionCallback"
+
+class SafeChooserInteractiveSessionCallback(
+ private val delegate: IChooserInteractiveSessionCallback
+) : IChooserInteractiveSessionCallback by delegate {
+
+ override fun registerChooserController(updater: IChooserController?) {
+ if (!isAlive) return
+ runCatching { delegate.registerChooserController(updater) }
+ .onFailure { Log.e(TAG, "Failed to invoke registerChooserController", it) }
+ }
+
+ override fun onDrawerVerticalOffsetChanged(offset: Int) {
+ if (!isAlive) return
+ runCatching { delegate.onDrawerVerticalOffsetChanged(offset) }
+ .onFailure { Log.e(TAG, "Failed to invoke onDrawerVerticalOffsetChanged", it) }
+ }
+
+ private val isAlive: Boolean
+ get() = delegate.asBinder().isBinderAlive
+}
diff --git a/java/src/com/android/intentresolver/interactive/domain/model/ChooserIntentUpdater.kt b/java/src/com/android/intentresolver/interactive/domain/model/ChooserIntentUpdater.kt
new file mode 100644
index 00000000..5466a95d
--- /dev/null
+++ b/java/src/com/android/intentresolver/interactive/domain/model/ChooserIntentUpdater.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.intentresolver.interactive.domain.model
+
+import android.content.Intent
+import com.android.intentresolver.IChooserController
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.filter
+
+private val NotSet = Intent()
+
+class ChooserIntentUpdater : IChooserController.Stub() {
+ private val updates = MutableStateFlow<Intent?>(NotSet)
+
+ val chooserIntent: Flow<Intent?>
+ get() = updates.filter { it !== NotSet }
+
+ override fun updateIntent(chooserIntent: Intent?) {
+ updates.value = chooserIntent
+ }
+}
diff --git a/java/src/com/android/intentresolver/shared/model/ActivityModel.kt b/java/src/com/android/intentresolver/shared/model/ActivityModel.kt
index c5efdeba..1a57759d 100644
--- a/java/src/com/android/intentresolver/shared/model/ActivityModel.kt
+++ b/java/src/com/android/intentresolver/shared/model/ActivityModel.kt
@@ -35,6 +35,8 @@ data class ActivityModel(
val launchedFromPackage: String,
/** The referrer as supplied to the activity. */
val referrer: Uri?,
+ /** True if the activity is the first activity in the task */
+ val isTaskRoot: Boolean,
) : Parcelable {
constructor(
source: Parcel
@@ -43,6 +45,7 @@ data class ActivityModel(
launchedFromUid = source.readInt(),
launchedFromPackage = requireNotNull(source.readString()),
referrer = source.readParcelable(),
+ isTaskRoot = source.readBoolean(),
)
/** A package name from referrer, if it is an android-app URI */
@@ -55,6 +58,7 @@ data class ActivityModel(
dest.writeInt(launchedFromUid)
dest.writeString(launchedFromPackage)
dest.writeParcelable(referrer, flags)
+ dest.writeBoolean(isTaskRoot)
}
companion object {
@@ -74,6 +78,7 @@ data class ActivityModel(
activity.launchedFromUid,
Objects.requireNonNull<String>(activity.launchedFromPackage),
activity.referrer,
+ activity.isTaskRoot,
)
}
}
diff --git a/java/src/com/android/intentresolver/shortcuts/ShortcutLoader.kt b/java/src/com/android/intentresolver/shortcuts/ShortcutLoader.kt
index 828d8561..aa1f385f 100644
--- a/java/src/com/android/intentresolver/shortcuts/ShortcutLoader.kt
+++ b/java/src/com/android/intentresolver/shortcuts/ShortcutLoader.kt
@@ -35,8 +35,7 @@ import androidx.annotation.MainThread
import androidx.annotation.OpenForTesting
import androidx.annotation.VisibleForTesting
import androidx.annotation.WorkerThread
-import com.android.intentresolver.Flags.fixShortcutLoaderJobLeak
-import com.android.intentresolver.Flags.fixShortcutsFlashing
+import com.android.intentresolver.Flags.fixShortcutsFlashingFixed
import com.android.intentresolver.chooser.DisplayResolveInfo
import com.android.intentresolver.measurements.Tracer
import com.android.intentresolver.measurements.runTracing
@@ -80,8 +79,7 @@ constructor(
private val dispatcher: CoroutineDispatcher,
private val callback: Consumer<Result>,
) {
- private val scope =
- if (fixShortcutLoaderJobLeak()) parentScope.createChildScope() else parentScope
+ private val scope = parentScope.createChildScope()
private val shortcutToChooserTargetConverter = ShortcutToChooserTargetConverter()
private val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager
private val appPredictorWatchdog = AtomicReference<Job?>(null)
@@ -170,9 +168,7 @@ constructor(
@OpenForTesting
open fun destroy() {
- if (fixShortcutLoaderJobLeak()) {
- scope.cancel()
- }
+ scope.cancel()
}
@WorkerThread
@@ -193,7 +189,7 @@ constructor(
Log.d(TAG, "[$id] query AppPredictor for user $userHandle")
val watchdogJob =
- if (fixShortcutsFlashing()) {
+ if (fixShortcutsFlashingFixed()) {
scope
.launch(start = CoroutineStart.LAZY) {
delay(APP_PREDICTOR_RESPONSE_TIMEOUT_MS)
diff --git a/java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt b/java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt
index 13de84b2..cb4bdcc1 100644
--- a/java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt
+++ b/java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt
@@ -40,9 +40,11 @@ import android.content.IntentSender
import android.net.Uri
import android.os.Bundle
import android.service.chooser.ChooserAction
+import android.service.chooser.ChooserSession
import android.service.chooser.ChooserTarget
import com.android.intentresolver.ChooserActivity
import com.android.intentresolver.ContentTypeHint
+import com.android.intentresolver.Flags.interactiveSession
import com.android.intentresolver.R
import com.android.intentresolver.data.model.ChooserRequest
import com.android.intentresolver.ext.hasSendAction
@@ -58,6 +60,8 @@ import com.android.intentresolver.validation.validateFrom
private const val MAX_CHOOSER_ACTIONS = 5
private const val MAX_INITIAL_INTENTS = 2
+private const val EXTRA_CHOOSER_INTERACTIVE_CALLBACK =
+ "com.android.extra.EXTRA_CHOOSER_INTERACTIVE_CALLBACK"
internal fun Intent.maybeAddSendActionFlags() =
ifMatch(Intent::hasSendAction) {
@@ -69,6 +73,14 @@ fun readChooserRequest(
model: ActivityModel,
savedState: Bundle = model.intent.extras ?: Bundle(),
): ValidationResult<ChooserRequest> {
+ return readChooserRequest(savedState, model.launchedFromPackage, model.referrer)
+}
+
+fun readChooserRequest(
+ savedState: Bundle,
+ launchedFromPackage: String,
+ referrer: Uri?,
+): ValidationResult<ChooserRequest> {
@Suppress("DEPRECATION")
return validateFrom(savedState::get) {
val targetIntent = required(IntentOrUri(EXTRA_INTENT)).maybeAddSendActionFlags()
@@ -139,18 +151,26 @@ fun readChooserRequest(
val metadataText = optional(value<CharSequence>(EXTRA_METADATA_TEXT))
+ val interactiveSessionCallback =
+ if (interactiveSession()) {
+ optional(value<ChooserSession>(EXTRA_CHOOSER_INTERACTIVE_CALLBACK))
+ ?.sessionCallbackBinder
+ } else {
+ null
+ }
+
ChooserRequest(
targetIntent = targetIntent,
targetAction = targetIntent.action,
isSendActionTarget = isSendAction,
targetType = targetIntent.type,
launchedFromPackage =
- requireNotNull(model.launchedFromPackage) {
+ requireNotNull(launchedFromPackage) {
"launch.fromPackage was null, See Activity.getLaunchedFromPackage()"
},
title = customTitle,
defaultTitleResource = defaultTitleResource,
- referrer = model.referrer,
+ referrer = referrer,
filteredComponentNames = filteredComponents,
callerChooserTargets = callerChooserTargets,
chooserActions = chooserActions,
@@ -168,6 +188,7 @@ fun readChooserRequest(
focusedItemPosition = focusedItemPos,
contentTypeHint = contentTypeHint,
metadataText = metadataText,
+ interactiveSessionCallback = interactiveSessionCallback,
)
}
}
diff --git a/java/src/com/android/intentresolver/ui/viewmodel/ChooserViewModel.kt b/java/src/com/android/intentresolver/ui/viewmodel/ChooserViewModel.kt
index 8597d802..7bc811c0 100644
--- a/java/src/com/android/intentresolver/ui/viewmodel/ChooserViewModel.kt
+++ b/java/src/com/android/intentresolver/ui/viewmodel/ChooserViewModel.kt
@@ -21,6 +21,7 @@ import android.util.Log
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
+import com.android.intentresolver.Flags.interactiveSession
import com.android.intentresolver.Flags.saveShareouselState
import com.android.intentresolver.contentpreview.ImageLoader
import com.android.intentresolver.contentpreview.PreviewDataProvider
@@ -32,6 +33,7 @@ import com.android.intentresolver.data.repository.ActivityModelRepository
import com.android.intentresolver.data.repository.ChooserRequestRepository
import com.android.intentresolver.domain.saveUpdates
import com.android.intentresolver.inject.Background
+import com.android.intentresolver.interactive.domain.interactor.InteractiveSessionInteractor
import com.android.intentresolver.shared.model.ActivityModel
import com.android.intentresolver.validation.Invalid
import com.android.intentresolver.validation.Valid
@@ -67,6 +69,7 @@ constructor(
private val chooserRequestRepository: Lazy<ChooserRequestRepository>,
private val contentResolver: ContentInterface,
val imageLoader: ImageLoader,
+ private val interactiveSessionInteractorLazy: Lazy<InteractiveSessionInteractor>,
) : ViewModel() {
/** Parcelable-only references provided from the creating Activity */
@@ -98,6 +101,9 @@ constructor(
)
}
+ val interactiveSessionInteractor: InteractiveSessionInteractor
+ get() = interactiveSessionInteractorLazy.get()
+
init {
when (initialRequest) {
is Invalid -> {
@@ -116,6 +122,9 @@ constructor(
}
}
}
+ if (interactiveSession()) {
+ viewModelScope.launch(bgDispatcher) { interactiveSessionInteractor.activate() }
+ }
}
}
}
diff --git a/java/src/com/android/intentresolver/widget/ChooserTargetItemView.kt b/java/src/com/android/intentresolver/widget/ChooserTargetItemView.kt
index b5a4d617..816a2b1d 100644
--- a/java/src/com/android/intentresolver/widget/ChooserTargetItemView.kt
+++ b/java/src/com/android/intentresolver/widget/ChooserTargetItemView.kt
@@ -22,7 +22,10 @@ import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.util.TypedValue
+import android.view.InputDevice.SOURCE_MOUSE
import android.view.MotionEvent
+import android.view.MotionEvent.ACTION_HOVER_ENTER
+import android.view.MotionEvent.ACTION_HOVER_MOVE
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
@@ -93,7 +96,7 @@ class ChooserTargetItemView(
val iconView = iconView ?: return false
if (!isEnabled) return true
when (event.action) {
- MotionEvent.ACTION_HOVER_ENTER -> {
+ ACTION_HOVER_ENTER -> {
iconView.isHovered = true
}
MotionEvent.ACTION_HOVER_EXIT -> {
@@ -103,7 +106,17 @@ class ChooserTargetItemView(
return true
}
- override fun onInterceptHoverEvent(event: MotionEvent?) = true
+ override fun onInterceptHoverEvent(event: MotionEvent) =
+ if (event.isFromSource(SOURCE_MOUSE)) {
+ // This is the same logic as in super.onInterceptHoverEvent (ViewGroup) minus the check
+ // that the pointer fall on the scroll bar as we need to control the hover state of the
+ // icon.
+ // We also want to intercept only MOUSE hover events as the TalkBack's Explore by Touch
+ // (including single taps) reported as a hover event.
+ event.action == ACTION_HOVER_MOVE || event.action == ACTION_HOVER_ENTER
+ } else {
+ super.onInterceptHoverEvent(event)
+ }
override fun dispatchDraw(canvas: Canvas) {
super.dispatchDraw(canvas)
diff --git a/java/src/com/android/intentresolver/widget/ResolverDrawerLayout.java b/java/src/com/android/intentresolver/widget/ResolverDrawerLayout.java
index 07693b25..4895a2cd 100644
--- a/java/src/com/android/intentresolver/widget/ResolverDrawerLayout.java
+++ b/java/src/com/android/intentresolver/widget/ResolverDrawerLayout.java
@@ -278,6 +278,10 @@ public class ResolverDrawerLayout extends ViewGroup {
mDismissLocked = locked;
}
+ int getTopOffset() {
+ return mTopOffset;
+ }
+
private boolean isMoving() {
return mIsDragging || !mScroller.isFinished();
}
diff --git a/java/src/com/android/intentresolver/widget/ResolverDrawerLayoutExt.kt b/java/src/com/android/intentresolver/widget/ResolverDrawerLayoutExt.kt
new file mode 100644
index 00000000..0c537a12
--- /dev/null
+++ b/java/src/com/android/intentresolver/widget/ResolverDrawerLayoutExt.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:JvmName("ResolverDrawerLayoutExt")
+
+package com.android.intentresolver.widget
+
+import android.graphics.Rect
+import android.view.View
+import android.view.ViewGroup.MarginLayoutParams
+
+fun ResolverDrawerLayout.getVisibleDrawerRect(outRect: Rect) {
+ if (!isLaidOut) {
+ outRect.set(0, 0, 0, 0)
+ return
+ }
+ val firstChild = firstNonGoneChild()
+ val lp = firstChild?.layoutParams as? MarginLayoutParams
+ val margin = lp?.topMargin ?: 0
+ val top = maxOf(paddingTop, topOffset + margin)
+ val leftEdge = paddingLeft
+ val rightEdge = width - paddingRight
+ val widthAvailable = rightEdge - leftEdge
+ val childWidth = firstChild?.width ?: 0
+ val left = leftEdge + (widthAvailable - childWidth) / 2
+ val right = left + childWidth
+ outRect.set(left, top, right, height - paddingBottom)
+}
+
+fun ResolverDrawerLayout.firstNonGoneChild(): View? {
+ for (i in 0 until childCount) {
+ val view = getChildAt(i)
+ if (view.visibility != View.GONE) {
+ return view
+ }
+ }
+ return null
+}