diff options
Diffstat (limited to 'java')
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 +} |