summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--java/res/color/resolver_profile_tab_text.xml4
-rw-r--r--java/res/drawable/bottomsheet_background.xml2
-rw-r--r--java/res/drawable/chevron_right.xml2
-rw-r--r--java/res/drawable/chooser_action_button_bg.xml2
-rw-r--r--java/res/drawable/chooser_content_preview_rounded.xml2
-rw-r--r--java/res/drawable/chooser_row_layer_list.xml2
-rw-r--r--java/res/drawable/edit_action_background.xml2
-rw-r--r--java/res/drawable/ic_drag_handle.xml2
-rw-r--r--java/res/drawable/resolver_outlined_button_bg.xml2
-rw-r--r--java/res/drawable/resolver_profile_tab_bg.xml4
-rw-r--r--java/res/layout-h480dp/image_preview_image_item.xml4
-rw-r--r--java/res/layout-h480dp/image_preview_loading_item.xml2
-rw-r--r--java/res/layout/chooser_action_row.xml2
-rw-r--r--java/res/layout/chooser_action_view.xml4
-rw-r--r--java/res/layout/chooser_grid_item.xml4
-rw-r--r--java/res/layout/chooser_grid_item_hover.xml8
-rw-r--r--java/res/layout/chooser_grid_preview_file.xml6
-rw-r--r--java/res/layout/chooser_grid_preview_files_text.xml4
-rw-r--r--java/res/layout/chooser_grid_preview_image.xml2
-rw-r--r--java/res/layout/chooser_grid_preview_text.xml8
-rw-r--r--java/res/layout/chooser_grid_scrollable_preview.xml4
-rw-r--r--java/res/layout/chooser_headline_row.xml4
-rw-r--r--java/res/layout/chooser_list_per_profile_wrap.xml2
-rw-r--r--java/res/layout/chooser_row.xml2
-rw-r--r--java/res/layout/image_preview_loading_item.xml2
-rw-r--r--java/res/layout/resolve_grid_item.xml4
-rw-r--r--java/res/layout/resolver_empty_states.xml2
-rw-r--r--java/res/values-af/strings.xml3
-rw-r--r--java/res/values-am/strings.xml3
-rw-r--r--java/res/values-ar/strings.xml3
-rw-r--r--java/res/values-as/strings.xml3
-rw-r--r--java/res/values-az/strings.xml3
-rw-r--r--java/res/values-b+sr+Latn/strings.xml3
-rw-r--r--java/res/values-be/strings.xml3
-rw-r--r--java/res/values-bg/strings.xml3
-rw-r--r--java/res/values-bn/strings.xml5
-rw-r--r--java/res/values-bs/strings.xml3
-rw-r--r--java/res/values-ca/strings.xml3
-rw-r--r--java/res/values-cs/strings.xml3
-rw-r--r--java/res/values-da/strings.xml3
-rw-r--r--java/res/values-de/strings.xml3
-rw-r--r--java/res/values-en-rAU/strings.xml3
-rw-r--r--java/res/values-en-rGB/strings.xml3
-rw-r--r--java/res/values-en-rIN/strings.xml3
-rw-r--r--java/res/values-es-rUS/strings.xml3
-rw-r--r--java/res/values-es/strings.xml3
-rw-r--r--java/res/values-et/strings.xml3
-rw-r--r--java/res/values-eu/strings.xml3
-rw-r--r--java/res/values-fa/strings.xml3
-rw-r--r--java/res/values-fi/strings.xml3
-rw-r--r--java/res/values-fr-rCA/strings.xml3
-rw-r--r--java/res/values-fr/strings.xml3
-rw-r--r--java/res/values-gl/strings.xml3
-rw-r--r--java/res/values-gu/strings.xml3
-rw-r--r--java/res/values-hi/strings.xml3
-rw-r--r--java/res/values-hr/strings.xml3
-rw-r--r--java/res/values-hu/strings.xml3
-rw-r--r--java/res/values-hy/strings.xml3
-rw-r--r--java/res/values-in/strings.xml3
-rw-r--r--java/res/values-is/strings.xml3
-rw-r--r--java/res/values-it/strings.xml3
-rw-r--r--java/res/values-iw/strings.xml3
-rw-r--r--java/res/values-ja/strings.xml3
-rw-r--r--java/res/values-ka/strings.xml3
-rw-r--r--java/res/values-kk/strings.xml3
-rw-r--r--java/res/values-km/strings.xml3
-rw-r--r--java/res/values-kn/strings.xml3
-rw-r--r--java/res/values-ko/strings.xml3
-rw-r--r--java/res/values-ky/strings.xml3
-rw-r--r--java/res/values-lt/strings.xml3
-rw-r--r--java/res/values-lv/strings.xml3
-rw-r--r--java/res/values-mk/strings.xml3
-rw-r--r--java/res/values-ml/strings.xml3
-rw-r--r--java/res/values-mn/strings.xml3
-rw-r--r--java/res/values-mr/strings.xml3
-rw-r--r--java/res/values-ms/strings.xml3
-rw-r--r--java/res/values-my/strings.xml3
-rw-r--r--java/res/values-nb/strings.xml3
-rw-r--r--java/res/values-ne/strings.xml5
-rw-r--r--java/res/values-or/strings.xml3
-rw-r--r--java/res/values-pa/strings.xml3
-rw-r--r--java/res/values-pl/strings.xml3
-rw-r--r--java/res/values-pt-rBR/strings.xml3
-rw-r--r--java/res/values-pt/strings.xml3
-rw-r--r--java/res/values-ro/strings.xml3
-rw-r--r--java/res/values-ru/strings.xml3
-rw-r--r--java/res/values-si/strings.xml3
-rw-r--r--java/res/values-sk/strings.xml3
-rw-r--r--java/res/values-sl/strings.xml3
-rw-r--r--java/res/values-sq/strings.xml5
-rw-r--r--java/res/values-sr/strings.xml3
-rw-r--r--java/res/values-sv/strings.xml3
-rw-r--r--java/res/values-sw/strings.xml5
-rw-r--r--java/res/values-ta/strings.xml3
-rw-r--r--java/res/values-te/strings.xml3
-rw-r--r--java/res/values-th/strings.xml3
-rw-r--r--java/res/values-tl/strings.xml3
-rw-r--r--java/res/values-tr/strings.xml3
-rw-r--r--java/res/values-uk/strings.xml3
-rw-r--r--java/res/values-ur/strings.xml3
-rw-r--r--java/res/values-uz/strings.xml3
-rw-r--r--java/res/values-vi/strings.xml3
-rw-r--r--java/res/values-zh-rCN/strings.xml3
-rw-r--r--java/res/values-zh-rHK/strings.xml3
-rw-r--r--java/res/values-zh-rTW/strings.xml3
-rw-r--r--java/res/values-zu/strings.xml3
-rw-r--r--java/src/com/android/intentresolver/ResolverListAdapter.java20
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractor.kt94
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractor.kt18
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/model/LoadedWindow.kt6
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewKey.kt49
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewModel.kt5
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt171
-rw-r--r--java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt12
-rw-r--r--java/src/com/android/intentresolver/ui/viewmodel/IntentExt.kt58
-rw-r--r--lint-baseline.xml16
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt41
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt104
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewInteractorTest.kt5
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewsInteractorTest.kt14
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractorTest.kt15
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractorTest.kt6
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModelTest.kt26
-rw-r--r--tests/unit/src/com/android/intentresolver/ui/viewmodel/IntentExtTest.kt174
124 files changed, 765 insertions, 402 deletions
diff --git a/java/res/color/resolver_profile_tab_text.xml b/java/res/color/resolver_profile_tab_text.xml
index 7c2723ce..ffeba854 100644
--- a/java/res/color/resolver_profile_tab_text.xml
+++ b/java/res/color/resolver_profile_tab_text.xml
@@ -15,6 +15,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:color="?androidprv:attr/materialColorOnPrimary" android:state_selected="true"/>
- <item android:color="?androidprv:attr/materialColorOnSurfaceVariant"/>
+ <item android:color="@androidprv:color/materialColorOnPrimary" android:state_selected="true"/>
+ <item android:color="@androidprv:color/materialColorOnSurfaceVariant"/>
</selector>
diff --git a/java/res/drawable/bottomsheet_background.xml b/java/res/drawable/bottomsheet_background.xml
index f4386b7d..ec676cea 100644
--- a/java/res/drawable/bottomsheet_background.xml
+++ b/java/res/drawable/bottomsheet_background.xml
@@ -20,5 +20,5 @@
<corners
android:topLeftRadius="@*android:dimen/config_bottomDialogCornerRadius"
android:topRightRadius="@*android:dimen/config_bottomDialogCornerRadius"/>
- <solid android:color="?androidprv:attr/materialColorSurfaceContainer" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainer" />
</shape>
diff --git a/java/res/drawable/chevron_right.xml b/java/res/drawable/chevron_right.xml
index 747e06dd..09fd97a7 100644
--- a/java/res/drawable/chevron_right.xml
+++ b/java/res/drawable/chevron_right.xml
@@ -26,7 +26,7 @@
android:viewportWidth="16"
android:viewportHeight="24"
android:autoMirrored="true"
- android:tint="?androidprv:attr/materialColorOnSurface">
+ android:tint="@androidprv:color/materialColorOnSurface">
<path
android:fillColor="@android:color/white"
android:pathData="M10,4.5L8.59,5.91 13.17,10.5l-4.58,4.59L10,16.5l6,-6 -6,-6z"/>
diff --git a/java/res/drawable/chooser_action_button_bg.xml b/java/res/drawable/chooser_action_button_bg.xml
index 300be831..88eac4ce 100644
--- a/java/res/drawable/chooser_action_button_bg.xml
+++ b/java/res/drawable/chooser_action_button_bg.xml
@@ -25,7 +25,7 @@
android:insetBottom="8dp">
<shape android:shape="rectangle">
<corners android:radius="@dimen/chooser_action_corner_radius" />
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHigh"/>
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHigh"/>
</shape>
</inset>
</item>
diff --git a/java/res/drawable/chooser_content_preview_rounded.xml b/java/res/drawable/chooser_content_preview_rounded.xml
index a1b204bd..00aa2912 100644
--- a/java/res/drawable/chooser_content_preview_rounded.xml
+++ b/java/res/drawable/chooser_content_preview_rounded.xml
@@ -21,7 +21,7 @@
android:shape="rectangle">
<solid
- android:color="?androidprv:attr/materialColorSurfaceContainerHigh" />
+ android:color="@androidprv:color/materialColorSurfaceContainerHigh" />
<corners android:radius="16dp" />
</shape>
diff --git a/java/res/drawable/chooser_row_layer_list.xml b/java/res/drawable/chooser_row_layer_list.xml
index 868ac8aa..2f1e2046 100644
--- a/java/res/drawable/chooser_row_layer_list.xml
+++ b/java/res/drawable/chooser_row_layer_list.xml
@@ -20,7 +20,7 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item>
<shape android:shape="rectangle">
- <solid android:color="?androidprv:attr/materialColorSecondary"/>
+ <solid android:color="@androidprv:color/materialColorSecondary"/>
<size android:width="128dp" android:height="2dp"/>
<corners android:radius="2dp" />
</shape>
diff --git a/java/res/drawable/edit_action_background.xml b/java/res/drawable/edit_action_background.xml
index 91726f49..ebc6d814 100644
--- a/java/res/drawable/edit_action_background.xml
+++ b/java/res/drawable/edit_action_background.xml
@@ -22,7 +22,7 @@
<inset android:inset="8dp">
<shape android:shape="rectangle">
<corners android:radius="12dp" />
- <solid android:color="?androidprv:attr/materialColorSecondaryFixed"/>
+ <solid android:color="@androidprv:color/materialColorSecondaryFixed"/>
</shape>
</inset>
</item>
diff --git a/java/res/drawable/ic_drag_handle.xml b/java/res/drawable/ic_drag_handle.xml
index f22e8c30..d6965209 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:attr/materialColorOutlineVariant" />
+ <solid android:color="@androidprv:color/materialColorOutlineVariant" />
<corners android:radius="2dp" />
</shape>
diff --git a/java/res/drawable/resolver_outlined_button_bg.xml b/java/res/drawable/resolver_outlined_button_bg.xml
index 3469a06e..b018624c 100644
--- a/java/res/drawable/resolver_outlined_button_bg.xml
+++ b/java/res/drawable/resolver_outlined_button_bg.xml
@@ -26,7 +26,7 @@
<shape android:shape="rectangle">
<corners android:radius="8dp" />
<stroke android:width="1dp"
- android:color="?androidprv:attr/materialColorPrimaryContainer"/>
+ android:color="@androidprv:color/materialColorPrimaryContainer"/>
</shape>
</inset>
</item>
diff --git a/java/res/drawable/resolver_profile_tab_bg.xml b/java/res/drawable/resolver_profile_tab_bg.xml
index 97f3b7e2..20f0be92 100644
--- a/java/res/drawable/resolver_profile_tab_bg.xml
+++ b/java/res/drawable/resolver_profile_tab_bg.xml
@@ -29,14 +29,14 @@
<item android:state_selected="false">
<shape android:shape="rectangle">
<corners android:radius="12dp" />
- <solid android:color="?androidprv:attr/materialColorSurfaceContainerHighest" />
+ <solid android:color="@androidprv:color/materialColorSurfaceContainerHighest" />
</shape>
</item>
<item android:state_selected="true">
<shape android:shape="rectangle">
<corners android:radius="12dp" />
- <solid android:color="?androidprv:attr/materialColorPrimary" />
+ <solid android:color="@androidprv:color/materialColorPrimary" />
</shape>
</item>
</selector>
diff --git a/java/res/layout-h480dp/image_preview_image_item.xml b/java/res/layout-h480dp/image_preview_image_item.xml
index ac63b2d5..47dc7012 100644
--- a/java/res/layout-h480dp/image_preview_image_item.xml
+++ b/java/res/layout-h480dp/image_preview_image_item.xml
@@ -61,7 +61,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@drawable/edit_action_background"
- android:drawableTint="?androidprv:attr/materialColorSecondaryFixed"
+ android:drawableTint="@androidprv:color/materialColorSecondaryFixed"
android:contentDescription="@string/screenshot_edit"
android:visibility="gone"
>
@@ -70,7 +70,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="4dp"
- android:tint="?androidprv:attr/materialColorOnSecondaryFixed"
+ android:tint="@androidprv:color/materialColorOnSecondaryFixed"
android:src="@androidprv:drawable/ic_screenshot_edit"
/>
</FrameLayout>
diff --git a/java/res/layout-h480dp/image_preview_loading_item.xml b/java/res/layout-h480dp/image_preview_loading_item.xml
index 85020e9a..0bc2656f 100644
--- a/java/res/layout-h480dp/image_preview_loading_item.xml
+++ b/java/res/layout-h480dp/image_preview_loading_item.xml
@@ -26,7 +26,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"
- android:indeterminateTint="?androidprv:attr/materialColorPrimary"
+ android:indeterminateTint="@androidprv:color/materialColorPrimary"
android:indeterminateTintMode="src_in" />
</FrameLayout>
diff --git a/java/res/layout/chooser_action_row.xml b/java/res/layout/chooser_action_row.xml
index 7bce113e..9b39ba67 100644
--- a/java/res/layout/chooser_action_row.xml
+++ b/java/res/layout/chooser_action_row.xml
@@ -30,7 +30,7 @@
android:layout_marginTop="8dp"
android:layout_marginHorizontal="@dimen/chooser_edge_margin_normal"
android:layout_marginBottom="10dp"
- android:background="?androidprv:attr/materialColorSurfaceContainerHighest"
+ android:background="@androidprv:color/materialColorSurfaceContainerHighest"
/>
</merge>
diff --git a/java/res/layout/chooser_action_view.xml b/java/res/layout/chooser_action_view.xml
index b4859258..57cc59b7 100644
--- a/java/res/layout/chooser_action_view.xml
+++ b/java/res/layout/chooser_action_view.xml
@@ -22,10 +22,10 @@
android:paddingHorizontal="@dimen/chooser_edge_margin_normal_half"
android:clickable="true"
android:drawablePadding="6dp"
- android:drawableTint="?androidprv:attr/materialColorOnSurface"
+ android:drawableTint="@androidprv:color/materialColorOnSurface"
android:drawableTintMode="src_in"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="@dimen/chooser_action_view_text_size" />
diff --git a/java/res/layout/chooser_grid_item.xml b/java/res/layout/chooser_grid_item.xml
index 547a9944..76d2e60f 100644
--- a/java/res/layout/chooser_grid_item.xml
+++ b/java/res/layout/chooser_grid_item.xml
@@ -50,7 +50,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="@dimen/chooser_grid_target_name_text_size"
android:maxLines="1"
android:ellipsize="end" />
@@ -59,7 +59,7 @@
<TextView android:id="@android:id/text2"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="@dimen/chooser_grid_activity_name_text_size"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="1"
diff --git a/java/res/layout/chooser_grid_item_hover.xml b/java/res/layout/chooser_grid_item_hover.xml
index 05206065..5e49c9fd 100644
--- a/java/res/layout/chooser_grid_item_hover.xml
+++ b/java/res/layout/chooser_grid_item_hover.xml
@@ -32,8 +32,8 @@
android:defaultFocusHighlightEnabled="false"
app:focusOutlineWidth="@dimen/chooser_item_focus_outline_width"
app:focusOutlineCornerRadius="@dimen/chooser_item_focus_outline_corner_radius"
- app:focusOutlineColor="?androidprv:attr/materialColorSecondaryFixed"
- app:focusInnerOutlineColor="?androidprv:attr/materialColorOnSecondaryFixedVariant">
+ app:focusOutlineColor="@androidprv:color/materialColorSecondaryFixed"
+ app:focusInnerOutlineColor="@androidprv:color/materialColorOnSecondaryFixedVariant">
<ImageView android:id="@android:id/icon"
android:layout_width="@dimen/chooser_icon_width_with_padding"
@@ -53,7 +53,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="@dimen/chooser_grid_target_name_text_size"
android:maxLines="1"
android:ellipsize="end" />
@@ -62,7 +62,7 @@
<TextView android:id="@android:id/text2"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="@dimen/chooser_grid_activity_name_text_size"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="1"
diff --git a/java/res/layout/chooser_grid_preview_file.xml b/java/res/layout/chooser_grid_preview_file.xml
index 4e8cf7ba..9584ec9a 100644
--- a/java/res/layout/chooser_grid_preview_file.xml
+++ b/java/res/layout/chooser_grid_preview_file.xml
@@ -24,7 +24,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:background="?androidprv:attr/materialColorSurfaceContainer">
+ android:background="@androidprv:color/materialColorSurfaceContainer">
<RelativeLayout
android:layout_width="match_parent"
@@ -63,7 +63,7 @@
android:gravity="start|top"
android:singleLine="true"
android:textStyle="bold"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="12sp"
android:lineHeight="16sp"
android:textAppearance="@style/TextAppearance.ChooserDefault"/>
@@ -74,7 +74,7 @@
android:layout_height="wrap_content"
android:gravity="start|top"
android:singleLine="true"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:textSize="12sp"
android:lineHeight="16sp"
android:textAppearance="@style/TextAppearance.ChooserDefault"/>
diff --git a/java/res/layout/chooser_grid_preview_files_text.xml b/java/res/layout/chooser_grid_preview_files_text.xml
index 65c62f82..9e2bde67 100644
--- a/java/res/layout/chooser_grid_preview_files_text.xml
+++ b/java/res/layout/chooser_grid_preview_files_text.xml
@@ -23,7 +23,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:background="?androidprv:attr/materialColorSurfaceContainer">
+ android:background="@androidprv:color/materialColorSurfaceContainer">
<LinearLayout
android:layout_width="match_parent"
@@ -53,7 +53,7 @@
android:maxLines="@integer/text_preview_lines"
android:ellipsize="end"
android:linksClickable="false"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:textAppearance="@style/TextAppearance.ChooserDefault"/>
</LinearLayout>
diff --git a/java/res/layout/chooser_grid_preview_image.xml b/java/res/layout/chooser_grid_preview_image.xml
index f1aad727..199963b1 100644
--- a/java/res/layout/chooser_grid_preview_image.xml
+++ b/java/res/layout/chooser_grid_preview_image.xml
@@ -24,7 +24,7 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:importantForAccessibility="no"
- android:background="?androidprv:attr/materialColorSurfaceContainer">
+ android:background="@androidprv:color/materialColorSurfaceContainer">
<ViewStub
android:id="@+id/chooser_headline_row_stub"
diff --git a/java/res/layout/chooser_grid_preview_text.xml b/java/res/layout/chooser_grid_preview_text.xml
index ee54c0ae..951abfc7 100644
--- a/java/res/layout/chooser_grid_preview_text.xml
+++ b/java/res/layout/chooser_grid_preview_text.xml
@@ -25,7 +25,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:background="?androidprv:attr/materialColorSurfaceContainer">
+ android:background="@androidprv:color/materialColorSurfaceContainer">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
@@ -67,7 +67,7 @@
android:textAlignment="gravity"
android:textDirection="locale"
android:textStyle="bold"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:fontFamily="@androidprv:string/config_headlineFontFamily"/>
<TextView
@@ -82,7 +82,7 @@
app:layout_goneMarginStart="0dp"
android:ellipsize="end"
android:fontFamily="@androidprv:string/config_headlineFontFamily"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:textAlignment="gravity"
android:textDirection="locale"
android:maxLines="@integer/text_preview_lines"
@@ -105,7 +105,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:tint="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:tint="@androidprv:color/materialColorOnSurfaceVariant"
android:src="@androidprv:drawable/ic_menu_copy_material"
/>
</FrameLayout>
diff --git a/java/res/layout/chooser_grid_scrollable_preview.xml b/java/res/layout/chooser_grid_scrollable_preview.xml
index 02584d27..f8c7a541 100644
--- a/java/res/layout/chooser_grid_scrollable_preview.xml
+++ b/java/res/layout/chooser_grid_scrollable_preview.xml
@@ -65,7 +65,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_alwaysShow="true"
- android:background="?androidprv:attr/materialColorSurfaceContainer">
+ android:background="@androidprv:color/materialColorSurfaceContainer">
<ViewStub
android:id="@+id/chooser_headline_row_stub"
@@ -99,7 +99,7 @@
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
- android:background="?androidprv:attr/materialColorSurfaceContainer">
+ android:background="@androidprv:color/materialColorSurfaceContainer">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
diff --git a/java/res/layout/chooser_headline_row.xml b/java/res/layout/chooser_headline_row.xml
index 4e19249b..1c8a0ac9 100644
--- a/java/res/layout/chooser_headline_row.xml
+++ b/java/res/layout/chooser_headline_row.xml
@@ -74,7 +74,7 @@
android:paddingHorizontal="@dimen/chooser_edge_margin_normal_half"
style="?android:attr/borderlessButtonStyle"
android:drawableEnd="@drawable/chevron_right"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="12sp"
/>
@@ -90,7 +90,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/reselection_action"
android:layout_alignWithParentIfMissing="true"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/java/res/layout/chooser_list_per_profile_wrap.xml b/java/res/layout/chooser_list_per_profile_wrap.xml
index d48fcb50..e556bc94 100644
--- a/java/res/layout/chooser_list_per_profile_wrap.xml
+++ b/java/res/layout/chooser_list_per_profile_wrap.xml
@@ -26,7 +26,7 @@
app:layoutManager="com.android.intentresolver.ChooserGridLayoutManager"
android:id="@androidprv:id/resolver_list"
android:clipToPadding="false"
- android:background="?androidprv:attr/materialColorSurfaceContainer"
+ android:background="@androidprv:color/materialColorSurfaceContainer"
android:scrollbars="none"
android:nestedScrollingEnabled="true" />
diff --git a/java/res/layout/chooser_row.xml b/java/res/layout/chooser_row.xml
index 4a5e28c3..bbe65a85 100644
--- a/java/res/layout/chooser_row.xml
+++ b/java/res/layout/chooser_row.xml
@@ -28,7 +28,7 @@
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:visibility="gone" />
</LinearLayout>
diff --git a/java/res/layout/image_preview_loading_item.xml b/java/res/layout/image_preview_loading_item.xml
index a8a8f264..edcfb3d1 100644
--- a/java/res/layout/image_preview_loading_item.xml
+++ b/java/res/layout/image_preview_loading_item.xml
@@ -27,7 +27,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"
- android:indeterminateTint="?androidprv:attr/materialColorPrimary"
+ android:indeterminateTint="@androidprv:color/materialColorPrimary"
android:indeterminateTintMode="src_in" />
</FrameLayout>
diff --git a/java/res/layout/resolve_grid_item.xml b/java/res/layout/resolve_grid_item.xml
index e5a00429..f9d433de 100644
--- a/java/res/layout/resolve_grid_item.xml
+++ b/java/res/layout/resolve_grid_item.xml
@@ -49,7 +49,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?androidprv:attr/materialColorOnSurface"
+ android:textColor="@androidprv:color/materialColorOnSurface"
android:textSize="@dimen/chooser_grid_target_name_text_size"
android:gravity="top|center_horizontal"
android:maxLines="1"
@@ -59,7 +59,7 @@
<TextView android:id="@android:id/text2"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="@dimen/chooser_grid_activity_name_text_size"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="1"
diff --git a/java/res/layout/resolver_empty_states.xml b/java/res/layout/resolver_empty_states.xml
index 0cf6e955..4dac23ab 100644
--- a/java/res/layout/resolver_empty_states.xml
+++ b/java/res/layout/resolver_empty_states.xml
@@ -84,7 +84,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/noApplications"
- android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
+ android:textColor="@androidprv:color/materialColorOnSurfaceVariant"
android:padding="@dimen/chooser_edge_margin_normal"
android:gravity="center"/>
</RelativeLayout>
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 9f0e79f6..f24528a0 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Knoppie"</string>
</resources>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
index 48ff0003..d46f88d1 100644
--- a/java/res/values-am/strings.xml
+++ b/java/res/values-am/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"ሊመረጥ የሚችል ምስል"</string>
<string name="selectable_video" msgid="1271768647699300826">"ሊመረጥ የሚችል ቪድዮ"</string>
<string name="selectable_item" msgid="7557320816744205280">"ሊመረጥ የሚችል ንጥል"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"አዝራር"</string>
</resources>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index 110a9190..278e03f2 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"صورة يمكن اختيارها"</string>
<string name="selectable_video" msgid="1271768647699300826">"فيديو يمكن اختياره"</string>
<string name="selectable_item" msgid="7557320816744205280">"عنصر يمكن اختياره"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"زرّ"</string>
</resources>
diff --git a/java/res/values-as/strings.xml b/java/res/values-as/strings.xml
index f842817b..2177c527 100644
--- a/java/res/values-as/strings.xml
+++ b/java/res/values-as/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"বাছনি কৰিব পৰা প্ৰতিচ্ছবি"</string>
<string name="selectable_video" msgid="1271768647699300826">"বাছনি কৰিব পৰা ভিডিঅ’"</string>
<string name="selectable_item" msgid="7557320816744205280">"বাছনি কৰিব পৰা বস্তু"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"বুটাম"</string>
</resources>
diff --git a/java/res/values-az/strings.xml b/java/res/values-az/strings.xml
index e6a8ea65..93086938 100644
--- a/java/res/values-az/strings.xml
+++ b/java/res/values-az/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Düymə"</string>
</resources>
diff --git a/java/res/values-b+sr+Latn/strings.xml b/java/res/values-b+sr+Latn/strings.xml
index 500151e3..86fc1854 100644
--- a/java/res/values-b+sr+Latn/strings.xml
+++ b/java/res/values-b+sr+Latn/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Dugme"</string>
</resources>
diff --git a/java/res/values-be/strings.xml b/java/res/values-be/strings.xml
index 7e91ecf3..97ca27d3 100644
--- a/java/res/values-be/strings.xml
+++ b/java/res/values-be/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"Відарыс, які можна выбраць"</string>
<string name="selectable_video" msgid="1271768647699300826">"Відэа, якое можна выбраць"</string>
<string name="selectable_item" msgid="7557320816744205280">"Элемент, які можна выбраць"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Кнопка"</string>
</resources>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index 758b5092..3cec0cdf 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"Избираемо изображение"</string>
<string name="selectable_video" msgid="1271768647699300826">"Избираем видеоклип"</string>
<string name="selectable_item" msgid="7557320816744205280">"Избираем елемент"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Бутон"</string>
</resources>
diff --git a/java/res/values-bn/strings.xml b/java/res/values-bn/strings.xml
index c7a3af47..ea524006 100644
--- a/java/res/values-bn/strings.xml
+++ b/java/res/values-bn/strings.xml
@@ -56,7 +56,7 @@
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{আরও #টি ফাইল}one{আরও #টি ফাইল}other{আরও #টি ফাইল}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{আরও #টি ফাইল}one{আরও #টি ফাইল}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{#টি ছবি শেয়ার করা হচ্ছে}other{#টি ছবি শেয়ার করা হচ্ছে}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{ভিডিও শেয়ার করা হচ্ছে}one{#টি ভিডিও শেয়ার করা হচ্ছে}other{#টি ভিডিও শেয়ার করা হচ্ছে}}"</string>
<string name="sharing_files" msgid="1275646542246028823">"{count,plural, =1{#টি ফাইল শেয়ার করা হচ্ছে}one{#টি ফাইল শেয়ার করা হচ্ছে}other{#টি ফাইল শেয়ার করা হচ্ছে}}"</string>
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"বেছে নেওয়া যাবে এমন ছবি"</string>
<string name="selectable_video" msgid="1271768647699300826">"বেছে নেওয়া যাবে এমন ভিডিও"</string>
<string name="selectable_item" msgid="7557320816744205280">"বেছে নেওয়া যাবে এমন আইটেম"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"বোতাম"</string>
</resources>
diff --git a/java/res/values-bs/strings.xml b/java/res/values-bs/strings.xml
index 33819c4a..ddf3119b 100644
--- a/java/res/values-bs/strings.xml
+++ b/java/res/values-bs/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Dugme"</string>
</resources>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index c4a051ac..48d7138f 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Botó"</string>
</resources>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index fdacfbfd..151e2147 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Tlačítko"</string>
</resources>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index c517965a..e9d952fe 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Knap"</string>
</resources>
diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml
index 619d6878..911dd273 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Schaltfläche"</string>
</resources>
diff --git a/java/res/values-en-rAU/strings.xml b/java/res/values-en-rAU/strings.xml
index 4bfdc507..4d16a6f4 100644
--- a/java/res/values-en-rAU/strings.xml
+++ b/java/res/values-en-rAU/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Button"</string>
</resources>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index 4bfdc507..4d16a6f4 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Button"</string>
</resources>
diff --git a/java/res/values-en-rIN/strings.xml b/java/res/values-en-rIN/strings.xml
index 4bfdc507..4d16a6f4 100644
--- a/java/res/values-en-rIN/strings.xml
+++ b/java/res/values-en-rIN/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Button"</string>
</resources>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index 8650abe1..923e9d36 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Botón"</string>
</resources>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index 8e95d7ba..f7c3c0b0 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Botón"</string>
</resources>
diff --git a/java/res/values-et/strings.xml b/java/res/values-et/strings.xml
index 5aa88e1a..6a17f5b3 100644
--- a/java/res/values-et/strings.xml
+++ b/java/res/values-et/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Nupp"</string>
</resources>
diff --git a/java/res/values-eu/strings.xml b/java/res/values-eu/strings.xml
index a27087d1..e80edad4 100644
--- a/java/res/values-eu/strings.xml
+++ b/java/res/values-eu/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Botoia"</string>
</resources>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index 94c5cd32..71386d35 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"تصویر قابل‌انتخاب"</string>
<string name="selectable_video" msgid="1271768647699300826">"ویدیو قابل‌انتخاب"</string>
<string name="selectable_item" msgid="7557320816744205280">"مورد قابل‌انتخاب"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"دکمه"</string>
</resources>
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
index 8a0653b6..6938d4fa 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Painike"</string>
</resources>
diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml
index 80fe1d5e..7fdda598 100644
--- a/java/res/values-fr-rCA/strings.xml
+++ b/java/res/values-fr-rCA/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Bouton"</string>
</resources>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index 00e308de..39d436a7 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Bouton"</string>
</resources>
diff --git a/java/res/values-gl/strings.xml b/java/res/values-gl/strings.xml
index bcb305b5..d45e982e 100644
--- a/java/res/values-gl/strings.xml
+++ b/java/res/values-gl/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Botón"</string>
</resources>
diff --git a/java/res/values-gu/strings.xml b/java/res/values-gu/strings.xml
index f0155e90..d0e65a18 100644
--- a/java/res/values-gu/strings.xml
+++ b/java/res/values-gu/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"પસંદ કરી શકાય તેવી છબી"</string>
<string name="selectable_video" msgid="1271768647699300826">"પસંદ કરી શકાય તેવો વીડિયો"</string>
<string name="selectable_item" msgid="7557320816744205280">"પસંદ કરી શકાય તેવી આઇટમ"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"બટન"</string>
</resources>
diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml
index 032b0ec2..70da0c22 100644
--- a/java/res/values-hi/strings.xml
+++ b/java/res/values-hi/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"ऐसी इमेज जिसे चुना जा सकता है"</string>
<string name="selectable_video" msgid="1271768647699300826">"ऐसा वीडियो जिसे चुना जा सकता है"</string>
<string name="selectable_item" msgid="7557320816744205280">"ऐसा आइटम जिसे चुना जा सकता है"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"बटन"</string>
</resources>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index 1219ed5b..c8f8c90d 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Gumb"</string>
</resources>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index 8c159a61..a9e5e820 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Gomb"</string>
</resources>
diff --git a/java/res/values-hy/strings.xml b/java/res/values-hy/strings.xml
index 71a5329c..b0b0b235 100644
--- a/java/res/values-hy/strings.xml
+++ b/java/res/values-hy/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"Ընտրելու հնարավորությամբ պատկեր"</string>
<string name="selectable_video" msgid="1271768647699300826">"Ընտրելու հնարավորությամբ տեսանյութ"</string>
<string name="selectable_item" msgid="7557320816744205280">"Ընտրելու հնարավորությամբ տարր"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Կոճակ"</string>
</resources>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 14201b18..86828b7c 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Tombol"</string>
</resources>
diff --git a/java/res/values-is/strings.xml b/java/res/values-is/strings.xml
index 9eb6ff70..9125bae9 100644
--- a/java/res/values-is/strings.xml
+++ b/java/res/values-is/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Hnappur"</string>
</resources>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index 5687b1b2..7d0a7fa7 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Pulsante"</string>
</resources>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 52a98a21..3c1be527 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"תמונה שניתן לבחור"</string>
<string name="selectable_video" msgid="1271768647699300826">"סרטון שניתן לבחור"</string>
<string name="selectable_item" msgid="7557320816744205280">"פריט שניתן לבחור"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"לחצן"</string>
</resources>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index 3366df12..094106c3 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"選択可能な画像"</string>
<string name="selectable_video" msgid="1271768647699300826">"選択可能な動画"</string>
<string name="selectable_item" msgid="7557320816744205280">"選択可能なアイテム"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"ボタン"</string>
</resources>
diff --git a/java/res/values-ka/strings.xml b/java/res/values-ka/strings.xml
index c0f7267a..e0951e39 100644
--- a/java/res/values-ka/strings.xml
+++ b/java/res/values-ka/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"არჩევადი სურათი"</string>
<string name="selectable_video" msgid="1271768647699300826">"არჩევადი ვიდეო"</string>
<string name="selectable_item" msgid="7557320816744205280">"არჩევადი ერთეული"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"ღილაკი"</string>
</resources>
diff --git a/java/res/values-kk/strings.xml b/java/res/values-kk/strings.xml
index 8763e110..99357ef6 100644
--- a/java/res/values-kk/strings.xml
+++ b/java/res/values-kk/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"Таңдауға болатын сурет"</string>
<string name="selectable_video" msgid="1271768647699300826">"Таңдауға болатын бейне"</string>
<string name="selectable_item" msgid="7557320816744205280">"Таңдауға болатын элемент"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Түйме"</string>
</resources>
diff --git a/java/res/values-km/strings.xml b/java/res/values-km/strings.xml
index 7378f627..29d80e96 100644
--- a/java/res/values-km/strings.xml
+++ b/java/res/values-km/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"រូបភាពដែល​អាចជ្រើសរើសបាន"</string>
<string name="selectable_video" msgid="1271768647699300826">"វីដេអូដែល​អាចជ្រើសរើសបាន"</string>
<string name="selectable_item" msgid="7557320816744205280">"ធាតុដែល​អាចជ្រើសរើសបាន"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"ប៊ូតុង"</string>
</resources>
diff --git a/java/res/values-kn/strings.xml b/java/res/values-kn/strings.xml
index 2a7b15b3..d777b6fa 100644
--- a/java/res/values-kn/strings.xml
+++ b/java/res/values-kn/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"ಆಯ್ಕೆಮಾಡಬಹುದಾದ ಚಿತ್ರ"</string>
<string name="selectable_video" msgid="1271768647699300826">"ಆಯ್ಕೆ ಮಾಡಬಹುದಾದ ವೀಡಿಯೊ"</string>
<string name="selectable_item" msgid="7557320816744205280">"ಆಯ್ಕೆ ಮಾಡಬಹುದಾದ ಐಟಂ"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"ಬಟನ್"</string>
</resources>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index a2d9f7c9..0ab0cefb 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"선택 가능한 이미지"</string>
<string name="selectable_video" msgid="1271768647699300826">"선택 가능한 동영상"</string>
<string name="selectable_item" msgid="7557320816744205280">"선택 가능한 항목"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"버튼"</string>
</resources>
diff --git a/java/res/values-ky/strings.xml b/java/res/values-ky/strings.xml
index d447a8e0..7de1593d 100644
--- a/java/res/values-ky/strings.xml
+++ b/java/res/values-ky/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"Тандала турган сүрөт"</string>
<string name="selectable_video" msgid="1271768647699300826">"Тандала турган видео"</string>
<string name="selectable_item" msgid="7557320816744205280">"Тандала турган нерсе"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Баскыч"</string>
</resources>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index c8c14d87..f1a0494d 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Mygtukas"</string>
</resources>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
index 421a7629..5fed4d43 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Poga"</string>
</resources>
diff --git a/java/res/values-mk/strings.xml b/java/res/values-mk/strings.xml
index 4e21c5d1..2ab3c072 100644
--- a/java/res/values-mk/strings.xml
+++ b/java/res/values-mk/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"Слика што може да се избере"</string>
<string name="selectable_video" msgid="1271768647699300826">"Видео што може да се избере"</string>
<string name="selectable_item" msgid="7557320816744205280">"Ставка што може да се избере"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Копче"</string>
</resources>
diff --git a/java/res/values-ml/strings.xml b/java/res/values-ml/strings.xml
index 04fecfc8..6318a101 100644
--- a/java/res/values-ml/strings.xml
+++ b/java/res/values-ml/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"തിരഞ്ഞെടുക്കാവുന്ന ചിത്രം"</string>
<string name="selectable_video" msgid="1271768647699300826">"തിരഞ്ഞെടുക്കാവുന്ന വീഡിയോ"</string>
<string name="selectable_item" msgid="7557320816744205280">"തിരഞ്ഞെടുക്കാവുന്ന ഇനം"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"ബട്ടൺ"</string>
</resources>
diff --git a/java/res/values-mn/strings.xml b/java/res/values-mn/strings.xml
index 1a29d084..8dc3cd58 100644
--- a/java/res/values-mn/strings.xml
+++ b/java/res/values-mn/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"Сонгох боломжтой зураг"</string>
<string name="selectable_video" msgid="1271768647699300826">"Сонгох боломжтой видео"</string>
<string name="selectable_item" msgid="7557320816744205280">"Сонгох боломжтой зүйл"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Товч"</string>
</resources>
diff --git a/java/res/values-mr/strings.xml b/java/res/values-mr/strings.xml
index 55c6caec..5e54a61a 100644
--- a/java/res/values-mr/strings.xml
+++ b/java/res/values-mr/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"निवडण्यायोग्य इमेज"</string>
<string name="selectable_video" msgid="1271768647699300826">"निवडण्यायोग्य व्हिडिओ"</string>
<string name="selectable_item" msgid="7557320816744205280">"निवडण्यायोग्य आयटम"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"बटण"</string>
</resources>
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
index 0ad33c91..b6dca50f 100644
--- a/java/res/values-ms/strings.xml
+++ b/java/res/values-ms/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Butang"</string>
</resources>
diff --git a/java/res/values-my/strings.xml b/java/res/values-my/strings.xml
index fe6b166b..af596656 100644
--- a/java/res/values-my/strings.xml
+++ b/java/res/values-my/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"ရွေးချယ်နိုင်သောပုံ"</string>
<string name="selectable_video" msgid="1271768647699300826">"ရွေးချယ်နိုင်သော ဗီဒီယို"</string>
<string name="selectable_item" msgid="7557320816744205280">"ရွေးချယ်နိုင်သောအရာ"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"ခလုတ်"</string>
</resources>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index 5f4509a6..bd31a926 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Knapp"</string>
</resources>
diff --git a/java/res/values-ne/strings.xml b/java/res/values-ne/strings.xml
index ed0df8fb..620e402c 100644
--- a/java/res/values-ne/strings.xml
+++ b/java/res/values-ne/strings.xml
@@ -78,7 +78,7 @@
<string name="usb_device_resolve_prompt_warn" msgid="4254493957548169620">"यो एपलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले यो USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string>
<string name="resolver_personal_tab" msgid="1381052735324320565">"व्यक्तिगत"</string>
<string name="resolver_work_tab" msgid="3588325717455216412">"काम"</string>
- <string name="resolver_private_tab" msgid="3707548826254095157">"निजी"</string>
+ <string name="resolver_private_tab" msgid="3707548826254095157">"निजी स्पेस"</string>
<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>
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"चयन गर्न मिल्ने फोटो"</string>
<string name="selectable_video" msgid="1271768647699300826">"चयन गर्न मिल्ने भिडियो"</string>
<string name="selectable_item" msgid="7557320816744205280">"चयन गर्न मिल्ने वस्तु"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"बटन"</string>
</resources>
diff --git a/java/res/values-or/strings.xml b/java/res/values-or/strings.xml
index 94069e7e..785acbe1 100644
--- a/java/res/values-or/strings.xml
+++ b/java/res/values-or/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"ଚୟନ କରାଯାଇପାରୁଥିବା ଇମେଜ"</string>
<string name="selectable_video" msgid="1271768647699300826">"ଚୟନ କରାଯାଇପାରୁଥିବା ଭିଡିଓ"</string>
<string name="selectable_item" msgid="7557320816744205280">"ଚୟନ କରାଯାଇପାରୁଥିବା ଆଇଟମ"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"ବଟନ"</string>
</resources>
diff --git a/java/res/values-pa/strings.xml b/java/res/values-pa/strings.xml
index 0d78cdbe..8b9f528c 100644
--- a/java/res/values-pa/strings.xml
+++ b/java/res/values-pa/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"ਚੁਣਨਯੋਗ ਚਿੱਤਰ"</string>
<string name="selectable_video" msgid="1271768647699300826">"ਚੁਣਨਯੋਗ ਵੀਡੀਓ"</string>
<string name="selectable_item" msgid="7557320816744205280">"ਚੁਣਨਯੋਗ ਆਈਟਮ"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"ਬਟਨ"</string>
</resources>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index cf265226..3de2b1f4 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Przycisk"</string>
</resources>
diff --git a/java/res/values-pt-rBR/strings.xml b/java/res/values-pt-rBR/strings.xml
index 37531559..5ed57493 100644
--- a/java/res/values-pt-rBR/strings.xml
+++ b/java/res/values-pt-rBR/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Botão"</string>
</resources>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index 37531559..5ed57493 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Botão"</string>
</resources>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index 7ab54ac6..7c8816b6 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Buton"</string>
</resources>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index 4ea3ea7f..e0934ad1 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"Изображение, которое можно выбрать"</string>
<string name="selectable_video" msgid="1271768647699300826">"Видео, которое можно выбрать"</string>
<string name="selectable_item" msgid="7557320816744205280">"Объект, который можно выбрать"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Кнопка"</string>
</resources>
diff --git a/java/res/values-si/strings.xml b/java/res/values-si/strings.xml
index e2ee4820..19af7794 100644
--- a/java/res/values-si/strings.xml
+++ b/java/res/values-si/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"තෝරා ගත හැකි රූපය"</string>
<string name="selectable_video" msgid="1271768647699300826">"තෝරා ගත හැකි වීඩියෝව"</string>
<string name="selectable_item" msgid="7557320816744205280">"තෝරා ගත හැකි අයිතමය"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"බොත්තම"</string>
</resources>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index 1c433160..36898690 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Tlačidlo"</string>
</resources>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
index 641801bd..714ba171 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Gumb"</string>
</resources>
diff --git a/java/res/values-sq/strings.xml b/java/res/values-sq/strings.xml
index 9fd15dff..db24392a 100644
--- a/java/res/values-sq/strings.xml
+++ b/java/res/values-sq/strings.xml
@@ -74,7 +74,7 @@
<string name="image_preview_a11y_description" msgid="297102643932491797">"Miniatura e pamjes paraprake të imazhit"</string>
<string name="video_preview_a11y_description" msgid="683440858811095990">"Miniatura e pamjes paraprake të videos"</string>
<string name="file_preview_a11y_description" msgid="7397224827802410602">"Miniatura e pamjes paraprake të skedarit"</string>
- <string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"Nuk ka persona të rekomanduar për ta ndarë"</string>
+ <string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"Nuk ka persona të rekomanduar për të ndarë"</string>
<string name="usb_device_resolve_prompt_warn" msgid="4254493957548169620">"Këtij aplikacioni nuk i është dhënë leje për regjistrim, por mund të regjistrojë audio përmes kësaj pajisjeje USB."</string>
<string name="resolver_personal_tab" msgid="1381052735324320565">"Personal"</string>
<string name="resolver_work_tab" msgid="3588325717455216412">"Puna"</string>
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Buton"</string>
</resources>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index 26f1a48f..8591ef7d 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"Слика која може да се изабере"</string>
<string name="selectable_video" msgid="1271768647699300826">"Видео који може да се изабере"</string>
<string name="selectable_item" msgid="7557320816744205280">"Ставка која може да се изабере"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Дугме"</string>
</resources>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index ff1c0525..6810faa7 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Knapp"</string>
</resources>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
index ef8f9504..77b83e99 100644
--- a/java/res/values-sw/strings.xml
+++ b/java/res/values-sw/strings.xml
@@ -58,7 +58,7 @@
<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_videos" msgid="3583423190182877434">"{count,plural, =1{Inashiriki video}other{Inashiriki video #}}"</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="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>
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Kitufe"</string>
</resources>
diff --git a/java/res/values-ta/strings.xml b/java/res/values-ta/strings.xml
index 17652d9c..f53e5b29 100644
--- a/java/res/values-ta/strings.xml
+++ b/java/res/values-ta/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"தேர்ந்தெடுக்கக்கூடிய படம்"</string>
<string name="selectable_video" msgid="1271768647699300826">"தேர்ந்தெடுக்கக்கூடிய வீடியோ"</string>
<string name="selectable_item" msgid="7557320816744205280">"தேர்ந்தெடுக்கக்கூடியது"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"பட்டன்"</string>
</resources>
diff --git a/java/res/values-te/strings.xml b/java/res/values-te/strings.xml
index a178c6eb..5003d8eb 100644
--- a/java/res/values-te/strings.xml
+++ b/java/res/values-te/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"ఎంచుకోదగిన ఇమేజ్"</string>
<string name="selectable_video" msgid="1271768647699300826">"ఎంచుకోదగిన వీడియో"</string>
<string name="selectable_item" msgid="7557320816744205280">"ఎంచుకోదగిన ఐటెమ్"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"బటన్"</string>
</resources>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index 5800a821..8bb9408f 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"รูปภาพที่เลือกได้"</string>
<string name="selectable_video" msgid="1271768647699300826">"วิดีโอที่เลือกได้"</string>
<string name="selectable_item" msgid="7557320816744205280">"รายการที่เลือกได้"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"ปุ่ม"</string>
</resources>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index d84572a7..e98c06bf 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Button"</string>
</resources>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index 15a47a2b..25b7e860 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Düğme"</string>
</resources>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 39d02d4c..33f9e350 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"Зображення, яке можна вибрати"</string>
<string name="selectable_video" msgid="1271768647699300826">"Відео, яке можна вибрати"</string>
<string name="selectable_item" msgid="7557320816744205280">"Об’єкт, який можна вибрати"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Кнопка"</string>
</resources>
diff --git a/java/res/values-ur/strings.xml b/java/res/values-ur/strings.xml
index 1d2eebb4..950041e7 100644
--- a/java/res/values-ur/strings.xml
+++ b/java/res/values-ur/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"قابل انتخاب تصویر"</string>
<string name="selectable_video" msgid="1271768647699300826">"قابل انتخاب ویڈیو"</string>
<string name="selectable_item" msgid="7557320816744205280">"قابل انتخاب آئٹم"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"بٹن"</string>
</resources>
diff --git a/java/res/values-uz/strings.xml b/java/res/values-uz/strings.xml
index 235a0661..1792e0d2 100644
--- a/java/res/values-uz/strings.xml
+++ b/java/res/values-uz/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Tugma"</string>
</resources>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index c0e89ebc..a32bacc1 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Nút"</string>
</resources>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index 97837697..603a4e5e 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"可选择的图片"</string>
<string name="selectable_video" msgid="1271768647699300826">"可选择的视频"</string>
<string name="selectable_item" msgid="7557320816744205280">"可选择的内容"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"按钮"</string>
</resources>
diff --git a/java/res/values-zh-rHK/strings.xml b/java/res/values-zh-rHK/strings.xml
index 88a70d4a..b3aed885 100644
--- a/java/res/values-zh-rHK/strings.xml
+++ b/java/res/values-zh-rHK/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"可以揀嘅圖片"</string>
<string name="selectable_video" msgid="1271768647699300826">"可以揀嘅影片"</string>
<string name="selectable_item" msgid="7557320816744205280">"可以揀嘅項目"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"按鈕"</string>
</resources>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index 05ed8285..97770baf 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -106,6 +106,5 @@
<string name="selectable_image" msgid="3157858923437182271">"可選取的圖片"</string>
<string name="selectable_video" msgid="1271768647699300826">"可選取的影片"</string>
<string name="selectable_item" msgid="7557320816744205280">"可選取的項目"</string>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"按鈕"</string>
</resources>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index c394b147..bdf42d69 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -106,6 +106,5 @@
<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>
- <!-- no translation found for role_description_button (4537198530568333649) -->
- <skip />
+ <string name="role_description_button" msgid="4537198530568333649">"Inkinobho"</string>
</resources>
diff --git a/java/src/com/android/intentresolver/ResolverListAdapter.java b/java/src/com/android/intentresolver/ResolverListAdapter.java
index fc5514b6..f29553eb 100644
--- a/java/src/com/android/intentresolver/ResolverListAdapter.java
+++ b/java/src/com/android/intentresolver/ResolverListAdapter.java
@@ -404,14 +404,18 @@ public class ResolverListAdapter extends BaseAdapter {
);
} else {
mOtherProfile = null;
- try {
- mLastChosen = mResolverListController.getLastChosen();
- // TODO: does this also somehow need to update mLastChosenPosition? If so, maybe
- // the current method should also take responsibility for re-initializing
- // mLastChosenPosition, where it's currently done at the start of rebuildList()?
- // (Why is this related to the presence of mOtherProfile in fhe first place?)
- } catch (RemoteException re) {
- Log.d(TAG, "Error calling getLastChosenActivity\n" + re);
+ // If `mFilterLastUsed` is (`final`) false, we'll never read `mLastChosen`, so don't
+ // bother making the system query.
+ if (mFilterLastUsed) {
+ try {
+ mLastChosen = mResolverListController.getLastChosen();
+ // TODO: does this also somehow need to update mLastChosenPosition? If so, maybe
+ // the current method should also take responsibility for re-initializing
+ // mLastChosenPosition, where it's currently done at the start of rebuildList()?
+ // (Why is this related to the presence of mOtherProfile in fhe first place?)
+ } catch (RemoteException re) {
+ Log.d(TAG, "Error calling getLastChosenActivity\n" + re);
+ }
}
}
}
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractor.kt
index 7d658209..59e7e15e 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractor.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractor.kt
@@ -30,6 +30,7 @@ import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.expa
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.numLoadedPages
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.shiftWindowLeft
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.shiftWindowRight
+import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewKey
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel
import com.android.intentresolver.inject.FocusedItemIndex
import com.android.intentresolver.util.cursor.CursorView
@@ -82,16 +83,19 @@ constructor(
.toMap(ConcurrentHashMap())
val pagedCursor: PagedCursor<CursorRow?> = uriCursor.paged(pageSize)
val startPosition = uriCursor.extras?.getInt(POSITION, 0) ?: 0
+
val state =
loadToMaxPages(
- initialState = readInitialState(pagedCursor, startPosition, unclaimedRecords),
+ startPosition = startPosition,
+ initialState = readInitialState(startPosition, pagedCursor, unclaimedRecords),
pagedCursor = pagedCursor,
unclaimedRecords = unclaimedRecords,
)
- processLoadRequests(state, pagedCursor, unclaimedRecords)
+ processLoadRequests(startPosition, state, pagedCursor, unclaimedRecords)
}
private suspend fun loadToMaxPages(
+ startPosition: Int,
initialState: CursorWindow,
pagedCursor: PagedCursor<CursorRow?>,
unclaimedRecords: MutableUnclaimedMap,
@@ -102,7 +106,7 @@ constructor(
val (leftTriggerIndex, rightTriggerIndex) = state.triggerIndices()
interactor.setPreviews(
previews = state.merged.values.toList(),
- startIndex = startPageNum,
+ startIndex = state.startIndex,
hasMoreLeft = state.hasMoreLeft,
hasMoreRight = state.hasMoreRight,
leftTriggerIndex = leftTriggerIndex,
@@ -113,9 +117,10 @@ constructor(
state =
when {
state.hasMoreLeft && loadedLeft < loadedRight ->
- state.loadMoreLeft(pagedCursor, unclaimedRecords)
- state.hasMoreRight -> state.loadMoreRight(pagedCursor, unclaimedRecords)
- else -> state.loadMoreLeft(pagedCursor, unclaimedRecords)
+ state.loadMoreLeft(startPosition, pagedCursor, unclaimedRecords)
+ state.hasMoreRight ->
+ state.loadMoreRight(startPosition, pagedCursor, unclaimedRecords)
+ else -> state.loadMoreLeft(startPosition, pagedCursor, unclaimedRecords)
}
}
return state
@@ -123,6 +128,7 @@ constructor(
/** Loop forever, processing any loading requests from the UI and updating local cache. */
private suspend fun processLoadRequests(
+ startPosition: Int,
initialState: CursorWindow,
pagedCursor: PagedCursor<CursorRow?>,
unclaimedRecords: MutableUnclaimedMap,
@@ -138,13 +144,19 @@ constructor(
val loadingState: Flow<LoadDirection?> =
interactor.setPreviews(
previews = state.merged.values.toList(),
- startIndex = 0, // TODO: actually track this as the window changes?
+ startIndex = state.startIndex,
hasMoreLeft = state.hasMoreLeft,
hasMoreRight = state.hasMoreRight,
leftTriggerIndex = leftTriggerIndex,
rightTriggerIndex = rightTriggerIndex,
)
- state = loadingState.handleOneLoadRequest(state, pagedCursor, unclaimedRecords)
+ state =
+ loadingState.handleOneLoadRequest(
+ startPosition,
+ state,
+ pagedCursor,
+ unclaimedRecords,
+ )
}
}
@@ -153,6 +165,7 @@ constructor(
* with the loaded data incorporated.
*/
private suspend fun Flow<LoadDirection?>.handleOneLoadRequest(
+ startPosition: Int,
state: CursorWindow,
pagedCursor: PagedCursor<CursorRow?>,
unclaimedRecords: MutableUnclaimedMap,
@@ -160,8 +173,10 @@ constructor(
mapLatest { loadDirection ->
loadDirection?.let {
when (loadDirection) {
- LoadDirection.Left -> state.loadMoreLeft(pagedCursor, unclaimedRecords)
- LoadDirection.Right -> state.loadMoreRight(pagedCursor, unclaimedRecords)
+ LoadDirection.Left ->
+ state.loadMoreLeft(startPosition, pagedCursor, unclaimedRecords)
+ LoadDirection.Right ->
+ state.loadMoreRight(startPosition, pagedCursor, unclaimedRecords)
}
}
}
@@ -169,12 +184,12 @@ constructor(
.first()
/**
- * Returns the initial [CursorWindow], with a single page loaded that contains the given
+ * Returns the initial [CursorWindow], with a single page loaded that contains the
* [startPosition].
*/
private suspend fun readInitialState(
- cursor: PagedCursor<CursorRow?>,
startPosition: Int,
+ cursor: PagedCursor<CursorRow?>,
unclaimedRecords: MutableUnclaimedMap,
): CursorWindow {
val startPageIdx = startPosition / pageSize
@@ -184,13 +199,15 @@ constructor(
if (!hasMoreLeft) {
// First read the initial page; this might claim some unclaimed Uris
val page =
- cursor.getPageRows(startPageIdx)?.toPage(mutableMapOf(), unclaimedRecords)
+ cursor
+ .getPageRows(startPageIdx)
+ ?.toPage(startPosition, mutableMapOf(), unclaimedRecords)
// Now that unclaimed Uris are up-to-date, add them first.
putAllUnclaimedLeft(unclaimedRecords)
// Then add the loaded page
page?.let(::putAll)
} else {
- cursor.getPageRows(startPageIdx)?.toPage(this, unclaimedRecords)
+ cursor.getPageRows(startPageIdx)?.toPage(startPosition, this, unclaimedRecords)
}
// Finally, add the remainder of the unclaimed Uris.
if (!hasMoreRight) {
@@ -198,6 +215,7 @@ constructor(
}
}
return CursorWindow(
+ startIndex = startPosition % pageSize,
firstLoadedPageNum = startPageIdx,
lastLoadedPageNum = startPageIdx,
pages = listOf(page.keys),
@@ -208,13 +226,14 @@ constructor(
}
private suspend fun CursorWindow.loadMoreRight(
+ startPosition: Int,
cursor: PagedCursor<CursorRow?>,
unclaimedRecords: MutableUnclaimedMap,
): CursorWindow {
val pageNum = lastLoadedPageNum + 1
val hasMoreRight = pageNum < cursor.count - 1
val newPage: PreviewMap = buildMap {
- readAndPutPage(this@loadMoreRight, cursor, pageNum, unclaimedRecords)
+ readAndPutPage(startPosition, this@loadMoreRight, cursor, pageNum, unclaimedRecords)
if (!hasMoreRight) {
putAllUnclaimedRight(unclaimedRecords)
}
@@ -227,6 +246,7 @@ constructor(
}
private suspend fun CursorWindow.loadMoreLeft(
+ startPosition: Int,
cursor: PagedCursor<CursorRow?>,
unclaimedRecords: MutableUnclaimedMap,
): CursorWindow {
@@ -235,13 +255,14 @@ constructor(
val newPage: PreviewMap = buildMap {
if (!hasMoreLeft) {
// First read the page; this might claim some unclaimed Uris
- val page = readPage(this@loadMoreLeft, cursor, pageNum, unclaimedRecords)
+ val page =
+ readPage(startPosition, this@loadMoreLeft, cursor, pageNum, unclaimedRecords)
// Now that unclaimed URIs are up-to-date, add them first
putAllUnclaimedLeft(unclaimedRecords)
// Then add the loaded page
putAll(page)
} else {
- readAndPutPage(this@loadMoreLeft, cursor, pageNum, unclaimedRecords)
+ readAndPutPage(startPosition, this@loadMoreLeft, cursor, pageNum, unclaimedRecords)
}
}
return if (numLoadedPages < maxLoadedPages) {
@@ -259,15 +280,17 @@ constructor(
}
private suspend fun readPage(
+ startPosition: Int,
state: CursorWindow,
pagedCursor: PagedCursor<CursorRow?>,
pageNum: Int,
unclaimedRecords: MutableUnclaimedMap,
): PreviewMap =
- mutableMapOf<Uri, PreviewModel>()
- .readAndPutPage(state, pagedCursor, pageNum, unclaimedRecords)
+ mutableMapOf<PreviewKey, PreviewModel>()
+ .readAndPutPage(startPosition, state, pagedCursor, pageNum, unclaimedRecords)
private suspend fun <M : MutablePreviewMap> M.readAndPutPage(
+ startPosition: Int,
state: CursorWindow,
pagedCursor: PagedCursor<CursorRow?>,
pageNum: Int,
@@ -275,19 +298,23 @@ constructor(
): M =
pagedCursor
.getPageRows(pageNum) // TODO: what do we do if the load fails?
- ?.filter { it.uri !in state.merged }
- ?.toPage(this, unclaimedRecords) ?: this
+ ?.filter { PreviewKey.final(it.position - startPosition) !in state.merged }
+ ?.toPage(startPosition, this, unclaimedRecords) ?: this
private suspend fun <M : MutablePreviewMap> Sequence<CursorRow>.toPage(
+ startPosition: Int,
destination: M,
unclaimedRecords: MutableUnclaimedMap,
): M =
// Restrict parallelism so as to not overload the metadata reader; anecdotally, too
// many parallel queries causes failures.
- mapParallel(parallelism = 4) { row -> createPreviewModel(row, unclaimedRecords) }
- .associateByTo(destination) { it.uri }
+ mapParallel(parallelism = 4) { row ->
+ createPreviewModel(startPosition, row, unclaimedRecords)
+ }
+ .associateByTo(destination) { it.key }
private fun createPreviewModel(
+ startPosition: Int,
row: CursorRow,
unclaimedRecords: MutableUnclaimedMap,
): PreviewModel =
@@ -298,6 +325,7 @@ constructor(
row.previewSize
?: metadata.previewUri?.let { uriMetadataReader.readPreviewSize(it) }
PreviewModel(
+ key = PreviewKey.final(row.position - startPosition),
uri = row.uri,
previewUri = metadata.previewUri,
mimeType = metadata.mimeType,
@@ -308,11 +336,9 @@ constructor(
.also { updated ->
if (unclaimedRecords.remove(row.uri) != null) {
// unclaimedRecords contains initially shared (and thus selected) items with
- // unknown
- // cursor position. Update selection records when any of those items is
- // encountered
- // in the cursor to maintain proper selection order should other items also be
- // selected.
+ // unknown cursor position. Update selection records when any of those items is
+ // encountered in the cursor to maintain proper selection order should other
+ // items also be selected.
selectionInteractor.updateSelection(updated)
}
}
@@ -324,7 +350,7 @@ constructor(
putAllUnclaimedWhere(unclaimed) { it < focusedItemIdx }
}
-private typealias CursorWindow = LoadedWindow<Uri, PreviewModel>
+private typealias CursorWindow = LoadedWindow<PreviewKey, PreviewModel>
/**
* Values from the initial selection set that have not yet appeared within the Cursor. These values
@@ -336,9 +362,13 @@ private typealias UnclaimedMap = Map<Uri, Pair<Int, PreviewModel>>
/** Mutable version of [UnclaimedMap]. */
private typealias MutableUnclaimedMap = MutableMap<Uri, Pair<Int, PreviewModel>>
-private typealias MutablePreviewMap = MutableMap<Uri, PreviewModel>
+private typealias UnkeyedMap = Map<Uri, PreviewModel>
+
+private typealias MutableUnkeyedMap = MutableMap<Uri, PreviewModel>
+
+private typealias MutablePreviewMap = MutableMap<PreviewKey, PreviewModel>
-private typealias PreviewMap = Map<Uri, PreviewModel>
+private typealias PreviewMap = Map<PreviewKey, PreviewModel>
private fun <M : MutablePreviewMap> M.putAllUnclaimedWhere(
unclaimedRecords: UnclaimedMap,
@@ -347,7 +377,7 @@ private fun <M : MutablePreviewMap> M.putAllUnclaimedWhere(
unclaimedRecords
.asSequence()
.filter { predicate(it.value.first) }
- .map { it.key to it.value.second }
+ .map { (_, value) -> value.second.key to value.second }
.toMap(this)
private fun PagedCursor<CursorRow?>.getPageRows(pageNum: Int): Sequence<CursorRow>? =
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractor.kt
index 50086a23..1fd69351 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractor.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractor.kt
@@ -22,6 +22,7 @@ import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.P
import com.android.intentresolver.contentpreview.payloadtoggle.domain.cursor.CursorResolver
import com.android.intentresolver.contentpreview.payloadtoggle.domain.cursor.PayloadToggle
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.CursorRow
+import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewKey
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel
import com.android.intentresolver.inject.ContentUris
import com.android.intentresolver.inject.FocusedItemIndex
@@ -64,6 +65,12 @@ constructor(
.mapParallelIndexed(parallelism = 4) { index, uri ->
val metadata = uriMetadataReader.getMetadata(uri)
PreviewModel(
+ key =
+ if (index == focusedItemIdx) {
+ PreviewKey.final(0)
+ } else {
+ PreviewKey.temp(index)
+ },
uri = uri,
previewUri = metadata.previewUri,
mimeType = metadata.mimeType,
@@ -71,11 +78,12 @@ constructor(
metadata.previewUri?.let {
uriMetadataReader.readPreviewSize(it).aspectRatioOrDefault(1f)
} ?: 1f,
- order = when {
- index < focusedItemIdx -> Int.MIN_VALUE + index
- index == focusedItemIdx -> 0
- else -> Int.MAX_VALUE - selectedItems.size + index + 1
- }
+ order =
+ when {
+ index < focusedItemIdx -> Int.MIN_VALUE + index
+ index == focusedItemIdx -> 0
+ else -> Int.MAX_VALUE - selectedItems.size + index + 1
+ },
)
}
}
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/model/LoadedWindow.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/model/LoadedWindow.kt
index e2e69852..5e34b178 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/model/LoadedWindow.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/model/LoadedWindow.kt
@@ -18,6 +18,8 @@ package com.android.intentresolver.contentpreview.payloadtoggle.domain.model
/** A window of data loaded from a cursor. */
data class LoadedWindow<K, V>(
+ /** The index position of the item that should be displayed initially. */
+ val startIndex: Int,
/** First cursor page index loaded within this window. */
val firstLoadedPageNum: Int,
/** Last cursor page index loaded within this window. */
@@ -42,6 +44,7 @@ fun <K, V> LoadedWindow<K, V>.shiftWindowRight(
hasMore: Boolean,
): LoadedWindow<K, V> =
LoadedWindow(
+ startIndex = startIndex - newPage.size,
firstLoadedPageNum = firstLoadedPageNum + 1,
lastLoadedPageNum = lastLoadedPageNum + 1,
pages = pages.drop(1) + listOf(newPage.keys),
@@ -61,6 +64,7 @@ fun <K, V> LoadedWindow<K, V>.expandWindowRight(
hasMore: Boolean,
): LoadedWindow<K, V> =
LoadedWindow(
+ startIndex = startIndex,
firstLoadedPageNum = firstLoadedPageNum,
lastLoadedPageNum = lastLoadedPageNum + 1,
pages = pages + listOf(newPage.keys),
@@ -75,6 +79,7 @@ fun <K, V> LoadedWindow<K, V>.shiftWindowLeft(
hasMore: Boolean,
): LoadedWindow<K, V> =
LoadedWindow(
+ startIndex = startIndex + newPage.size,
firstLoadedPageNum = firstLoadedPageNum - 1,
lastLoadedPageNum = lastLoadedPageNum - 1,
pages = listOf(newPage.keys) + pages.dropLast(1),
@@ -93,6 +98,7 @@ fun <K, V> LoadedWindow<K, V>.expandWindowLeft(
hasMore: Boolean,
): LoadedWindow<K, V> =
LoadedWindow(
+ startIndex = startIndex + newPage.size,
firstLoadedPageNum = firstLoadedPageNum - 1,
lastLoadedPageNum = lastLoadedPageNum,
pages = listOf(newPage.keys) + pages,
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewKey.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewKey.kt
new file mode 100644
index 00000000..6b42133e
--- /dev/null
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewKey.kt
@@ -0,0 +1,49 @@
+/*
+ * 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.payloadtoggle.shared.model
+
+/** Unique identifier for preview items. */
+sealed interface PreviewKey {
+
+ private data class Temp(override val key: Int, override val isFinal: Boolean = false) :
+ PreviewKey
+
+ private data class Final(override val key: Int, override val isFinal: Boolean = true) :
+ PreviewKey
+
+ /** The identifier, must be unique among like keys types */
+ val key: Int
+ /** Whether this key is final or temporary. */
+ val isFinal: Boolean
+
+ companion object {
+ /**
+ * Creates a temporary key.
+ *
+ * This is used for the initial preview items until final keys can be generated, at which
+ * point it is replaced with a final key.
+ */
+ fun temp(key: Int): PreviewKey = Temp(key)
+
+ /**
+ * Creates a final key.
+ *
+ * This is used for all preview items other than the initial preview items.
+ */
+ fun final(key: Int): PreviewKey = Final(key)
+ }
+}
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewModel.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewModel.kt
index 8a479156..d4df8a3a 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewModel.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewModel.kt
@@ -20,6 +20,8 @@ import android.net.Uri
/** An individual preview presented in Shareousel. */
data class PreviewModel(
+ /** Unique identifier for this model. */
+ val key: PreviewKey,
/** Uri for this item; if this preview is selected, this will be shared with the target app. */
val uri: Uri,
/** Uri for the preview image. */
@@ -28,7 +30,8 @@ data class PreviewModel(
val mimeType: String?,
val aspectRatio: Float = 1f,
/**
- * Relative item position in the list that is used to determine items order in the target intent
+ * Relative item position in the list that is used to determine items order in the target
+ * intent.
*/
val order: Int,
)
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 4b87d227..5b368084 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
@@ -57,11 +57,14 @@ import androidx.compose.ui.draw.clip
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.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.contentDescription
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.shareouselScrollOffscreenSelections
@@ -70,11 +73,13 @@ import com.android.intentresolver.R
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ValueUpdate
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.getOrDefault
import com.android.intentresolver.contentpreview.payloadtoggle.shared.ContentType
+import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewsModel
import com.android.intentresolver.contentpreview.payloadtoggle.ui.viewmodel.ShareouselPreviewViewModel
import com.android.intentresolver.contentpreview.payloadtoggle.ui.viewmodel.ShareouselViewModel
import kotlin.math.abs
import kotlin.math.min
+import kotlin.math.roundToInt
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
@@ -96,7 +101,7 @@ private fun Shareousel(viewModel: ShareouselViewModel, keySet: PreviewsModel) {
Column(
modifier =
Modifier.background(MaterialTheme.colorScheme.surfaceContainer)
- .padding(vertical = 16.dp),
+ .padding(vertical = 16.dp)
) {
PreviewCarousel(keySet, viewModel)
ActionCarousel(viewModel)
@@ -105,59 +110,50 @@ private fun Shareousel(viewModel: ShareouselViewModel, keySet: PreviewsModel) {
@OptIn(ExperimentalFoundationApi::class)
@Composable
-private fun PreviewCarousel(
- previews: PreviewsModel,
- viewModel: ShareouselViewModel,
-) {
- var maxAspectRatio by remember { mutableStateOf(0f) }
- var viewportHeight by remember { mutableStateOf(0) }
- var viewportCenter by remember { mutableStateOf(0) }
- var horizontalPadding by remember { mutableStateOf(0.dp) }
+private fun PreviewCarousel(previews: PreviewsModel, viewModel: ShareouselViewModel) {
+ var measurements by remember { mutableStateOf(PreviewCarouselMeasurements.UNMEASURED) }
Box(
modifier =
Modifier.fillMaxWidth()
.height(dimensionResource(R.dimen.chooser_preview_image_height_tall))
.layout { measurable, constraints ->
val placeable = measurable.measure(constraints)
- val (minItemWidth, maxAR) =
+ measurements =
if (placeable.height <= 0) {
- 0f to 0f
+ PreviewCarouselMeasurements.UNMEASURED
} else {
- val minItemWidth = (MIN_ASPECT_RATIO * placeable.height)
- val maxItemWidth = maxOf(0, placeable.width - 32.dp.roundToPx())
- val maxAR =
- (maxItemWidth.toFloat() / placeable.height).coerceIn(
- 0f,
- MAX_ASPECT_RATIO
- )
- minItemWidth to maxAR
+ PreviewCarouselMeasurements(placeable, measureScope = this)
}
- viewportCenter = placeable.width / 2
- maxAspectRatio = maxAR
- viewportHeight = placeable.height
- horizontalPadding = ((placeable.width - minItemWidth) / 2).toDp()
layout(placeable.width, placeable.height) { placeable.place(0, 0) }
- },
+ }
) {
- if (maxAspectRatio <= 0 && previews.previewModels.isNotEmpty()) {
- // Do not compose the list until we know the viewport size
- return@Box
- }
-
- var firstSelectedIndex by remember { mutableStateOf(null as Int?) }
+ // Do not compose the list until we have measured values
+ if (measurements == PreviewCarouselMeasurements.UNMEASURED) return@Box
val carouselState =
rememberLazyListState(
prefetchStrategy = remember { ShareouselLazyListPrefetchStrategy() },
+ initialFirstVisibleItemIndex = previews.startIdx,
+ initialFirstVisibleItemScrollOffset =
+ measurements.scrollOffsetToCenter(
+ previewModel = previews.previewModels[previews.startIdx]
+ ),
)
LazyRow(
state = carouselState,
horizontalArrangement = Arrangement.spacedBy(4.dp),
- contentPadding = PaddingValues(start = horizontalPadding, end = horizontalPadding),
+ contentPadding =
+ PaddingValues(
+ start = measurements.horizontalPaddingDp,
+ end = measurements.horizontalPaddingDp,
+ ),
modifier = Modifier.fillMaxSize().systemGestureExclusion(),
) {
- itemsIndexed(previews.previewModels, key = { _, model -> model.uri }) { index, model ->
+ 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 }
@@ -171,7 +167,7 @@ private fun PreviewCarousel(
val halfPreviewWidth = it.size / 2
val previewCenter = it.offset + halfPreviewWidth
val previewDistanceToViewportCenter =
- abs(previewCenter - viewportCenter)
+ abs(previewCenter - measurements.viewportCenterPx)
if (previewDistanceToViewportCenter <= halfPreviewWidth) {
index
} else {
@@ -182,13 +178,12 @@ private fun PreviewCarousel(
}
val previewModel =
- viewModel.preview(model, viewportHeight, previewIndex, rememberCoroutineScope())
- val selected by
- previewModel.isSelected.collectAsStateWithLifecycle(initialValue = false)
-
- if (selected) {
- firstSelectedIndex = min(index, firstSelectedIndex ?: Int.MAX_VALUE)
- }
+ viewModel.preview(
+ /* key = */ model,
+ /* previewHeight = */ measurements.viewportHeightPx,
+ /* index = */ previewIndex,
+ /* scope = */ rememberCoroutineScope(),
+ )
if (shareouselScrollOffscreenSelections()) {
LaunchedEffect(index, model.uri) {
@@ -209,10 +204,10 @@ private fun PreviewCarousel(
when {
// Item is partially past start of viewport
item.offset < viewportStartOffset ->
- -viewportStartOffset
+ measurements.scrollOffsetToStartEdge()
// Item is partially past end of viewport
(item.offset + item.size) > viewportEndOffset ->
- item.size - viewportEndOffset
+ measurements.scrollOffsetToEndEdge(model)
// Item is fully within viewport
else -> null
}?.let { scrollOffset ->
@@ -230,29 +225,8 @@ private fun PreviewCarousel(
}
ShareouselCard(
- viewModel.preview(
- model,
- viewportHeight,
- previewIndex,
- rememberCoroutineScope()
- ),
- maxAspectRatio,
- )
- }
- }
-
- firstSelectedIndex?.let { index ->
- LaunchedEffect(Unit) {
- val visibleItem =
- carouselState.layoutInfo.visibleItemsInfo.firstOrNull { it.index == index }
- val center =
- with(carouselState.layoutInfo) {
- ((viewportEndOffset - viewportStartOffset) / 2) + viewportStartOffset
- }
-
- carouselState.scrollToItem(
- index = index,
- scrollOffset = visibleItem?.size?.div(2)?.minus(center) ?: 0,
+ viewModel = previewModel,
+ aspectRatio = measurements.coerceAspectRatio(previewModel.aspectRatio),
)
}
}
@@ -260,7 +234,7 @@ private fun PreviewCarousel(
}
@Composable
-private fun ShareouselCard(viewModel: ShareouselPreviewViewModel, maxAspectRatio: Float) {
+private fun ShareouselCard(viewModel: ShareouselPreviewViewModel, aspectRatio: Float) {
val bitmapLoadState by viewModel.bitmapLoadState.collectAsStateWithLifecycle()
val selected by viewModel.isSelected.collectAsStateWithLifecycle(initialValue = false)
val borderColor = MaterialTheme.colorScheme.primary
@@ -279,9 +253,8 @@ private fun ShareouselCard(viewModel: ShareouselPreviewViewModel, maxAspectRatio
.toggleable(
value = selected,
onValueChange = { scope.launch { viewModel.setSelected(it) } },
- )
+ ),
) { state ->
- val aspectRatio = minOf(maxAspectRatio, maxOf(MIN_ASPECT_RATIO, viewModel.aspectRatio))
if (state is ValueUpdate.Value) {
state.getOrDefault(null).let { bitmap ->
ShareouselCard(
@@ -304,7 +277,7 @@ private fun ShareouselCard(viewModel: ShareouselPreviewViewModel, maxAspectRatio
color = borderColor,
shape = RoundedCornerShape(size = 12.dp),
)
- }
+ },
)
}
} else {
@@ -355,7 +328,7 @@ private fun ActionCarousel(viewModel: ShareouselViewModel) {
Image(
icon = it,
modifier = Modifier.size(16.dp),
- colorFilter = ColorFilter.tint(LocalContentColor.current)
+ colorFilter = ColorFilter.tint(LocalContentColor.current),
)
}
}
@@ -389,7 +362,7 @@ private fun ShareouselAction(
AssistChipDefaults.assistChipColors(
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh,
labelColor = MaterialTheme.colorScheme.onSurface,
- leadingIconContentColor = MaterialTheme.colorScheme.onSurface
+ leadingIconContentColor = MaterialTheme.colorScheme.onSurface,
),
modifier = modifier,
)
@@ -398,5 +371,57 @@ private fun ShareouselAction(
inline fun Modifier.thenIf(condition: Boolean, crossinline factory: () -> Modifier): Modifier =
if (condition) this.then(factory()) else this
-private const val MIN_ASPECT_RATIO = 0.4f
-private const val MAX_ASPECT_RATIO = 2.5f
+private data class PreviewCarouselMeasurements(
+ val viewportHeightPx: Int,
+ val viewportWidthPx: Int,
+ val viewportCenterPx: Int = viewportWidthPx / 2,
+ val maxAspectRatio: Float,
+ val horizontalPaddingPx: Int,
+ val horizontalPaddingDp: Dp,
+) {
+ constructor(
+ placeable: Placeable,
+ measureScope: MeasureScope,
+ horizontalPadding: Float = (placeable.width - (MIN_ASPECT_RATIO * placeable.height)) / 2,
+ ) : this(
+ viewportHeightPx = placeable.height,
+ viewportWidthPx = placeable.width,
+ maxAspectRatio =
+ with(measureScope) {
+ min(
+ (placeable.width - 32.dp.roundToPx()).toFloat() / placeable.height,
+ MAX_ASPECT_RATIO,
+ )
+ },
+ horizontalPaddingPx = horizontalPadding.roundToInt(),
+ horizontalPaddingDp = with(measureScope) { horizontalPadding.toDp() },
+ )
+
+ fun coerceAspectRatio(ratio: Float): Float = ratio.coerceIn(MIN_ASPECT_RATIO, maxAspectRatio)
+
+ fun scrollOffsetToCenter(previewModel: PreviewModel): Int =
+ horizontalPaddingPx + (aspectRatioToWidthPx(previewModel.aspectRatio) / 2) -
+ viewportCenterPx
+
+ fun scrollOffsetToStartEdge(): Int = horizontalPaddingPx
+
+ fun scrollOffsetToEndEdge(previewModel: PreviewModel): Int =
+ horizontalPaddingPx + aspectRatioToWidthPx(previewModel.aspectRatio) - viewportWidthPx
+
+ private fun aspectRatioToWidthPx(ratio: Float): Int =
+ (coerceAspectRatio(ratio) * viewportHeightPx).roundToInt()
+
+ companion object {
+ private const val MIN_ASPECT_RATIO = 0.4f
+ private const val MAX_ASPECT_RATIO = 2.5f
+
+ val UNMEASURED =
+ PreviewCarouselMeasurements(
+ viewportHeightPx = 0,
+ viewportWidthPx = 0,
+ maxAspectRatio = 0f,
+ horizontalPaddingPx = 0,
+ horizontalPaddingDp = 0.dp,
+ )
+ }
+}
diff --git a/java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt b/java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt
index 1644e409..13de84b2 100644
--- a/java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt
+++ b/java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt
@@ -36,7 +36,6 @@ import android.content.Intent.EXTRA_TEXT
import android.content.Intent.EXTRA_TITLE
import android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK
import android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT
-import android.content.IntentFilter
import android.content.IntentSender
import android.net.Uri
import android.os.Bundle
@@ -164,7 +163,7 @@ fun readChooserRequest(
refinementIntentSender = refinementIntentSender,
sharedText = sharedText,
sharedTextTitle = sharedTextTitle,
- shareTargetFilter = targetIntent.toShareTargetFilter(),
+ shareTargetFilter = targetIntent.createIntentFilter(),
additionalContentUri = additionalContentUri,
focusedItemPosition = focusedItemPos,
contentTypeHint = contentTypeHint,
@@ -180,12 +179,3 @@ fun Validation.readChooserActions(): List<ChooserAction>? =
optional(array<ChooserAction>(EXTRA_CHOOSER_CUSTOM_ACTIONS))
?.filter { hasValidIcon(it) }
?.take(MAX_CHOOSER_ACTIONS)
-
-private fun Intent.toShareTargetFilter(): IntentFilter? {
- return type?.let {
- IntentFilter().apply {
- action?.also { addAction(it) }
- addDataType(it)
- }
- }
-}
diff --git a/java/src/com/android/intentresolver/ui/viewmodel/IntentExt.kt b/java/src/com/android/intentresolver/ui/viewmodel/IntentExt.kt
new file mode 100644
index 00000000..30f16d20
--- /dev/null
+++ b/java/src/com/android/intentresolver/ui/viewmodel/IntentExt.kt
@@ -0,0 +1,58 @@
+/*
+ * 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.ui.viewmodel
+
+import android.content.Intent
+import android.content.IntentFilter
+import android.content.IntentFilter.MalformedMimeTypeException
+import android.net.Uri
+import android.os.PatternMatcher
+
+/** Collects Uris from standard locations within the Intent. */
+fun Intent.collectUris(): Set<Uri> = buildSet {
+ data?.also { add(it) }
+ @Suppress("DEPRECATION")
+ when (val stream = extras?.get(Intent.EXTRA_STREAM)) {
+ is Uri -> add(stream)
+ is ArrayList<*> -> addAll(stream.mapNotNull { it as? Uri })
+ else -> Unit
+ }
+ clipData?.apply { (0..<itemCount).mapNotNull { getItemAt(it).uri }.forEach(::add) }
+}
+
+fun IntentFilter.addUri(uri: Uri) {
+ uri.scheme?.also { addDataScheme(it) }
+ uri.host?.also { addDataAuthority(it, null) }
+ uri.path?.also { addDataPath(it, PatternMatcher.PATTERN_LITERAL) }
+}
+
+fun Intent.createIntentFilter(): IntentFilter? {
+ val uris = collectUris()
+ if (action == null && uris.isEmpty()) {
+ // at least one is required to be meaningful
+ return null
+ }
+ return IntentFilter().also { filter ->
+ type?.also {
+ try {
+ filter.addDataType(it)
+ } catch (_: MalformedMimeTypeException) { // ignore malformed type
+ }
+ }
+ action?.also { filter.addAction(it) }
+ uris.forEach(filter::addUri)
+ }
+}
diff --git a/lint-baseline.xml b/lint-baseline.xml
index c970b7a7..c1f51348 100644
--- a/lint-baseline.xml
+++ b/lint-baseline.xml
@@ -2083,8 +2083,8 @@
<issue
id="Overdraw"
- message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
- errorLine1=" android:background=&quot;?androidprv:attr/materialColorSurfaceContainer&quot;>"
+ message="Possible overdraw: Root element paints background `@androidprv:color/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
+ errorLine1=" android:background=&quot;@androidprv:color/materialColorSurfaceContainer&quot;>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="packages/modules/IntentResolver/java/res/layout/chooser_grid_preview_file.xml"
@@ -2094,8 +2094,8 @@
<issue
id="Overdraw"
- message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
- errorLine1=" android:background=&quot;?androidprv:attr/materialColorSurfaceContainer&quot;>"
+ message="Possible overdraw: Root element paints background `@androidprv:color/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
+ errorLine1=" android:background=&quot;@androidprv:color/materialColorSurfaceContainer&quot;>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="packages/modules/IntentResolver/java/res/layout/chooser_grid_preview_files_text.xml"
@@ -2105,8 +2105,8 @@
<issue
id="Overdraw"
- message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
- errorLine1=" android:background=&quot;?androidprv:attr/materialColorSurfaceContainer&quot;>"
+ message="Possible overdraw: Root element paints background `@androidprv:color/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
+ errorLine1=" android:background=&quot;@androidprv:color/materialColorSurfaceContainer&quot;>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="packages/modules/IntentResolver/java/res/layout/chooser_grid_preview_image.xml"
@@ -2116,8 +2116,8 @@
<issue
id="Overdraw"
- message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
- errorLine1=" android:background=&quot;?androidprv:attr/materialColorSurfaceContainer&quot;>"
+ message="Possible overdraw: Root element paints background `@androidprv:color/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
+ errorLine1=" android:background=&quot;@androidprv:color/materialColorSurfaceContainer&quot;>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="packages/modules/IntentResolver/java/res/layout/chooser_grid_preview_text.xml"
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt
index c4ba8105..5d29b4f3 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt
@@ -34,6 +34,7 @@ import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.p
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.TargetIntentModifier
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.targetIntentModifier
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.CursorRow
+import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewKey
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel
import com.android.intentresolver.contentpreview.readSize
import com.android.intentresolver.contentpreview.uriMetadataReader
@@ -51,10 +52,10 @@ import org.junit.Test
class CursorPreviewsInteractorTest {
private fun runTestWithDeps(
- initialSelection: Iterable<Int> = (1..2),
- focusedItemIndex: Int = initialSelection.count() / 2,
- cursor: Iterable<Int> = (0 until 4),
- cursorStartPosition: Int = cursor.count() / 2,
+ initialSelection: Iterable<Int>,
+ focusedItemIndex: Int,
+ cursor: Iterable<Int>,
+ cursorStartPosition: Int,
pageSize: Int = 16,
maxLoadedPages: Int = 3,
cursorSizes: Map<Int, Size> = emptyMap(),
@@ -81,6 +82,7 @@ class CursorPreviewsInteractorTest {
block(
TestDeps(
initialSelection,
+ focusedItemIndex,
cursor,
cursorStartPosition,
cursorSizes,
@@ -92,6 +94,7 @@ class CursorPreviewsInteractorTest {
private class TestDeps(
initialSelectionRange: Iterable<Int>,
+ focusedItemIndex: Int,
private val cursorRange: Iterable<Int>,
private val cursorStartPosition: Int,
private val cursorSizes: Map<Int, Size>,
@@ -117,14 +120,26 @@ class CursorPreviewsInteractorTest {
}
}
val initialPreviews: List<PreviewModel> =
- initialSelectionRange.map { i ->
- PreviewModel(uri = uri(i), mimeType = "image/bitmap", order = i)
+ initialSelectionRange.mapIndexed { index, i ->
+ PreviewModel(
+ key =
+ if (index == focusedItemIndex) {
+ PreviewKey.final(0)
+ } else {
+ PreviewKey.temp(index)
+ },
+ uri = uri(i),
+ mimeType = "image/bitmap",
+ order = i,
+ )
}
}
@Test
fun initialCursorLoad() =
runTestWithDeps(
+ initialSelection = (1..2),
+ focusedItemIndex = 1,
cursor = (0 until 10),
cursorStartPosition = 2,
cursorSizes = mapOf(0 to (200 x 100)),
@@ -143,6 +158,7 @@ class CursorPreviewsInteractorTest {
.containsExactlyElementsIn(
List(6) {
PreviewModel(
+ key = PreviewKey.final((it - 2)),
uri = Uri.fromParts("scheme$it", "ssp$it", "fragment$it"),
mimeType = "image/bitmap",
aspectRatio =
@@ -156,7 +172,7 @@ class CursorPreviewsInteractorTest {
}
)
.inOrder()
- assertThat(startIdx).isEqualTo(0)
+ assertThat(startIdx).isEqualTo(2)
assertThat(loadMoreLeft).isNull()
assertThat(loadMoreRight).isNotNull()
assertThat(leftTriggerIndex).isEqualTo(2)
@@ -168,7 +184,9 @@ class CursorPreviewsInteractorTest {
fun loadMoreLeft_evictRight() =
runTestWithDeps(
initialSelection = listOf(24),
+ focusedItemIndex = 0,
cursor = (0 until 48),
+ cursorStartPosition = 24,
pageSize = 16,
maxLoadedPages = 1,
) { deps ->
@@ -201,7 +219,9 @@ class CursorPreviewsInteractorTest {
fun loadMoreRight_evictLeft() =
runTestWithDeps(
initialSelection = listOf(24),
+ focusedItemIndex = 0,
cursor = (0 until 48),
+ cursorStartPosition = 24,
pageSize = 16,
maxLoadedPages = 1,
) { deps ->
@@ -233,7 +253,9 @@ class CursorPreviewsInteractorTest {
fun noMoreRight_appendUnclaimedFromInitialSelection() =
runTestWithDeps(
initialSelection = listOf(24, 50),
+ focusedItemIndex = 0,
cursor = listOf(24),
+ cursorStartPosition = 0,
pageSize = 16,
maxLoadedPages = 2,
) { deps ->
@@ -255,7 +277,9 @@ class CursorPreviewsInteractorTest {
fun noMoreLeft_appendUnclaimedFromInitialSelection() =
runTestWithDeps(
initialSelection = listOf(0, 24),
+ focusedItemIndex = 1,
cursor = listOf(24),
+ cursorStartPosition = 0,
pageSize = 16,
maxLoadedPages = 2,
) { deps ->
@@ -283,6 +307,7 @@ class CursorPreviewsInteractorTest {
) { deps ->
previewSelectionsRepository.selections.value =
PreviewModel(
+ key = PreviewKey.final(0),
uri = uri(1),
mimeType = "image/png",
order = 0,
@@ -296,6 +321,7 @@ class CursorPreviewsInteractorTest {
assertThat(previewSelectionsRepository.selections.value.values)
.containsExactly(
PreviewModel(
+ key = PreviewKey.final(0),
uri = uri(1),
mimeType = "image/bitmap",
order = 1,
@@ -307,6 +333,7 @@ class CursorPreviewsInteractorTest {
fun testReadFailedPages() =
runTestWithDeps(
initialSelection = listOf(4),
+ focusedItemIndex = 0,
cursor = emptyList(),
cursorStartPosition = 0,
pageSize = 2,
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt
index 27c98dc0..0a56a2d0 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt
@@ -30,6 +30,7 @@ import com.android.intentresolver.contentpreview.payloadtoggle.domain.cursor.pay
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.TargetIntentModifier
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.targetIntentModifier
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.CursorRow
+import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewKey
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewsModel
import com.android.intentresolver.contentpreview.uriMetadataReader
@@ -50,10 +51,10 @@ import org.junit.Test
class FetchPreviewsInteractorTest {
private fun runTest(
- initialSelection: Iterable<Int> = (1..2),
- focusedItemIndex: Int = initialSelection.count() / 2,
- cursor: Iterable<Int> = (0 until 4),
- cursorStartPosition: Int = cursor.count() / 2,
+ initialSelection: Iterable<Int>,
+ focusedItemIndex: Int,
+ cursor: Iterable<Int>,
+ cursorStartPosition: Int,
pageSize: Int = 16,
maxLoadedPages: Int = 8,
previewSizes: Map<Int, Size> = emptyMap(),
@@ -110,7 +111,11 @@ class FetchPreviewsInteractorTest {
fun setsInitialPreviews() =
runTest(
initialSelection = (1..3),
- previewSizes = mapOf(1 to Size(100, 50))) {
+ focusedItemIndex = 1,
+ cursor = (0 until 4),
+ cursorStartPosition = 1,
+ previewSizes = mapOf(1 to Size(100, 50)),
+ ) {
backgroundScope.launch { fetchPreviewsInteractor.activate() }
runCurrent()
@@ -120,17 +125,20 @@ class FetchPreviewsInteractorTest {
previewModels =
listOf(
PreviewModel(
+ key = PreviewKey.temp(0),
uri = Uri.fromParts("scheme1", "ssp1", "fragment1"),
mimeType = "image/bitmap",
aspectRatio = 2f,
order = Int.MIN_VALUE,
),
PreviewModel(
+ key = PreviewKey.final(0),
uri = Uri.fromParts("scheme2", "ssp2", "fragment2"),
mimeType = "image/bitmap",
order = 0,
),
PreviewModel(
+ key = PreviewKey.temp(2),
uri = Uri.fromParts("scheme3", "ssp3", "fragment3"),
mimeType = "image/bitmap",
order = Int.MAX_VALUE,
@@ -146,48 +154,60 @@ class FetchPreviewsInteractorTest {
}
@Test
- fun lookupCursorFromContentResolver() = runTest {
- backgroundScope.launch { fetchPreviewsInteractor.activate() }
- fakeCursorResolver.complete()
- runCurrent()
+ fun lookupCursorFromContentResolver() =
+ runTest(
+ initialSelection = (1..2),
+ focusedItemIndex = 1,
+ cursor = (0 until 4),
+ cursorStartPosition = 2,
+ ) {
+ backgroundScope.launch { fetchPreviewsInteractor.activate() }
+ fakeCursorResolver.complete()
+ runCurrent()
- with(cursorPreviewsRepository) {
- assertThat(previewsModel.value).isNotNull()
- assertThat(previewsModel.value!!.startIdx).isEqualTo(0)
- assertThat(previewsModel.value!!.loadMoreLeft).isNull()
- assertThat(previewsModel.value!!.loadMoreRight).isNull()
- assertThat(previewsModel.value!!.previewModels)
- .containsExactly(
- PreviewModel(
- uri = Uri.fromParts("scheme0", "ssp0", "fragment0"),
- mimeType = "image/bitmap",
- order = 0,
- ),
- PreviewModel(
- uri = Uri.fromParts("scheme1", "ssp1", "fragment1"),
- mimeType = "image/bitmap",
- order = 1,
- ),
- PreviewModel(
- uri = Uri.fromParts("scheme2", "ssp2", "fragment2"),
- mimeType = "image/bitmap",
- order = 2,
- ),
- PreviewModel(
- uri = Uri.fromParts("scheme3", "ssp3", "fragment3"),
- mimeType = "image/bitmap",
- order = 3,
- ),
- )
- .inOrder()
+ with(cursorPreviewsRepository) {
+ assertThat(previewsModel.value).isNotNull()
+ assertThat(previewsModel.value!!.startIdx).isEqualTo(2)
+ assertThat(previewsModel.value!!.loadMoreLeft).isNull()
+ assertThat(previewsModel.value!!.loadMoreRight).isNull()
+ assertThat(previewsModel.value!!.previewModels)
+ .containsExactly(
+ PreviewModel(
+ key = PreviewKey.final(-2),
+ uri = Uri.fromParts("scheme0", "ssp0", "fragment0"),
+ mimeType = "image/bitmap",
+ order = 0,
+ ),
+ PreviewModel(
+ key = PreviewKey.final(-1),
+ uri = Uri.fromParts("scheme1", "ssp1", "fragment1"),
+ mimeType = "image/bitmap",
+ order = 1,
+ ),
+ PreviewModel(
+ key = PreviewKey.final(0),
+ uri = Uri.fromParts("scheme2", "ssp2", "fragment2"),
+ mimeType = "image/bitmap",
+ order = 2,
+ ),
+ PreviewModel(
+ key = PreviewKey.final(1),
+ uri = Uri.fromParts("scheme3", "ssp3", "fragment3"),
+ mimeType = "image/bitmap",
+ order = 3,
+ ),
+ )
+ .inOrder()
+ }
}
- }
@Test
fun loadMoreLeft_evictRight() =
runTest(
initialSelection = listOf(24),
+ focusedItemIndex = 0,
cursor = (0 until 48),
+ cursorStartPosition = 24,
pageSize = 16,
maxLoadedPages = 1,
) {
@@ -223,7 +243,9 @@ class FetchPreviewsInteractorTest {
fun loadMoreRight_evictLeft() =
runTest(
initialSelection = listOf(24),
+ focusedItemIndex = 0,
cursor = (0 until 48),
+ cursorStartPosition = 24,
pageSize = 16,
maxLoadedPages = 1,
) {
@@ -254,7 +276,9 @@ class FetchPreviewsInteractorTest {
fun noMoreRight_appendUnclaimedFromInitialSelection() =
runTest(
initialSelection = listOf(24, 50),
+ focusedItemIndex = 0,
cursor = listOf(24),
+ cursorStartPosition = 0,
pageSize = 16,
maxLoadedPages = 2,
) {
@@ -275,7 +299,9 @@ class FetchPreviewsInteractorTest {
fun noMoreLeft_appendUnclaimedFromInitialSelection() =
runTest(
initialSelection = listOf(0, 24),
+ focusedItemIndex = 1,
cursor = listOf(24),
+ cursorStartPosition = 0,
pageSize = 16,
maxLoadedPages = 2,
) {
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewInteractorTest.kt
index 5d9ddbb6..0268a4d5 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewInteractorTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewInteractorTest.kt
@@ -24,6 +24,7 @@ import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.p
import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.previewSelectionsRepository
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.TargetIntentModifier
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.targetIntentModifier
+import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewKey
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel
import com.android.intentresolver.data.repository.chooserRequestRepository
import com.android.intentresolver.logging.FakeEventLog
@@ -44,6 +45,7 @@ class SelectablePreviewInteractorTest {
SelectablePreviewInteractor(
key =
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
order = 0,
@@ -63,6 +65,7 @@ class SelectablePreviewInteractorTest {
SelectablePreviewInteractor(
key =
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/bitmap",
order = 0,
@@ -75,6 +78,7 @@ class SelectablePreviewInteractorTest {
previewSelectionsRepository.selections.value =
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/bitmap",
order = 0,
@@ -93,6 +97,7 @@ class SelectablePreviewInteractorTest {
SelectablePreviewInteractor(
key =
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/bitmap",
order = 0,
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewsInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewsInteractorTest.kt
index c50d2d3f..c90a3091 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewsInteractorTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewsInteractorTest.kt
@@ -23,6 +23,7 @@ import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.c
import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.previewSelectionsRepository
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.TargetIntentModifier
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.targetIntentModifier
+import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewKey
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewsModel
import com.android.intentresolver.util.runKosmosTest
@@ -41,11 +42,13 @@ class SelectablePreviewsInteractorTest {
previewModels =
listOf(
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/bitmap",
order = 0,
),
PreviewModel(
+ key = PreviewKey.final(2),
uri = Uri.fromParts("scheme2", "ssp2", "fragment2"),
mimeType = "image/bitmap",
order = 1,
@@ -59,6 +62,7 @@ class SelectablePreviewsInteractorTest {
)
previewSelectionsRepository.selections.value =
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
order = 0,
@@ -72,11 +76,13 @@ class SelectablePreviewsInteractorTest {
assertThat(keySet.value!!.previewModels)
.containsExactly(
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/bitmap",
order = 0,
),
PreviewModel(
+ key = PreviewKey.final(2),
uri = Uri.fromParts("scheme2", "ssp2", "fragment2"),
mimeType = "image/bitmap",
order = 1,
@@ -90,6 +96,7 @@ class SelectablePreviewsInteractorTest {
val firstModel =
underTest.preview(
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
order = 0,
@@ -100,6 +107,7 @@ class SelectablePreviewsInteractorTest {
val secondModel =
underTest.preview(
PreviewModel(
+ key = PreviewKey.final(2),
uri = Uri.fromParts("scheme2", "ssp2", "fragment2"),
mimeType = null,
order = 1,
@@ -112,6 +120,7 @@ class SelectablePreviewsInteractorTest {
fun keySet_reflectsRepositoryUpdate() = runKosmosTest {
previewSelectionsRepository.selections.value =
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
order = 0,
@@ -124,6 +133,7 @@ class SelectablePreviewsInteractorTest {
val firstModel =
underTest.preview(
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
order = 0,
@@ -140,11 +150,13 @@ class SelectablePreviewsInteractorTest {
previewModels =
listOf(
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/bitmap",
order = 0,
),
PreviewModel(
+ key = PreviewKey.final(2),
uri = Uri.fromParts("scheme2", "ssp2", "fragment2"),
mimeType = "image/bitmap",
order = 1,
@@ -163,11 +175,13 @@ class SelectablePreviewsInteractorTest {
assertThat(previews.value!!.previewModels)
.containsExactly(
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/bitmap",
order = 0,
),
PreviewModel(
+ key = PreviewKey.final(2),
uri = Uri.fromParts("scheme2", "ssp2", "fragment2"),
mimeType = "image/bitmap",
order = 1,
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractorTest.kt
index c8242333..c24138b8 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractorTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractorTest.kt
@@ -24,6 +24,7 @@ import android.platform.test.flag.junit.SetFlagsRule
import com.android.intentresolver.Flags
import com.android.intentresolver.contentpreview.mimetypeClassifier
import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.previewSelectionsRepository
+import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewKey
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel
import com.android.intentresolver.util.runKosmosTest
import com.google.common.truth.Truth.assertThat
@@ -39,9 +40,10 @@ class SelectionInteractorTest {
fun singleSelection_removalPrevented() = runKosmosTest {
val initialPreview =
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
- order = 0
+ order = 0,
)
previewSelectionsRepository.selections.value = mapOf(initialPreview.uri to initialPreview)
@@ -66,9 +68,10 @@ class SelectionInteractorTest {
fun singleSelection_itemRemovedNoPendingIntentUpdates() = runKosmosTest {
val initialPreview =
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
- order = 0
+ order = 0,
)
previewSelectionsRepository.selections.value = mapOf(initialPreview.uri to initialPreview)
@@ -92,15 +95,17 @@ class SelectionInteractorTest {
fun multipleSelections_removalAllowed() = runKosmosTest {
val first =
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
- order = 0
+ order = 0,
)
val second =
PreviewModel(
+ key = PreviewKey.final(2),
uri = Uri.fromParts("scheme2", "ssp2", "fragment2"),
mimeType = null,
- order = 1
+ order = 1,
)
previewSelectionsRepository.selections.value = listOf(first, second).associateBy { it.uri }
@@ -109,7 +114,7 @@ class SelectionInteractorTest {
previewSelectionsRepository,
{ Intent() },
updateTargetIntentInteractor,
- mimetypeClassifier
+ mimetypeClassifier,
)
underTest.unselect(first)
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractorTest.kt
index 748459cb..42f1a1b2 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractorTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractorTest.kt
@@ -21,6 +21,7 @@ package com.android.intentresolver.contentpreview.payloadtoggle.domain.interacto
import android.net.Uri
import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.cursorPreviewsRepository
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.LoadDirection
+import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewKey
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel
import com.android.intentresolver.util.runKosmosTest
import com.google.common.truth.Truth.assertThat
@@ -37,6 +38,7 @@ class SetCursorPreviewsInteractorTest {
previews =
listOf(
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
order = 0,
@@ -59,9 +61,10 @@ class SetCursorPreviewsInteractorTest {
assertThat(it.previewModels)
.containsExactly(
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
- order = 0
+ order = 0,
)
)
.inOrder()
@@ -76,6 +79,7 @@ class SetCursorPreviewsInteractorTest {
previews =
listOf(
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
order = 0,
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModelTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModelTest.kt
index fc7ac751..6dd96040 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModelTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModelTest.kt
@@ -42,6 +42,7 @@ import com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor
import com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor.selectionInteractor
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ValueUpdate
import com.android.intentresolver.contentpreview.payloadtoggle.shared.ContentType
+import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewKey
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel
import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewsModel
import com.android.intentresolver.data.model.ChooserRequest
@@ -84,15 +85,17 @@ class ShareouselViewModelTest {
previewSelectionsRepository.selections.value =
listOf(
PreviewModel(
+ key = PreviewKey.final(0),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/png",
order = 0,
),
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme1", "ssp1", "fragment1"),
mimeType = "image/jpeg",
order = 1,
- )
+ ),
)
.associateBy { it.uri }
runCurrent()
@@ -104,15 +107,17 @@ class ShareouselViewModelTest {
previewSelectionsRepository.selections.value =
listOf(
PreviewModel(
+ key = PreviewKey.final(0),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "video/mpeg",
order = 0,
),
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme1", "ssp1", "fragment1"),
mimeType = "video/mpeg",
order = 1,
- )
+ ),
)
.associateBy { it.uri }
runCurrent()
@@ -124,15 +129,17 @@ class ShareouselViewModelTest {
previewSelectionsRepository.selections.value =
listOf(
PreviewModel(
+ key = PreviewKey.final(0),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/jpeg",
order = 0,
),
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme1", "ssp1", "fragment1"),
mimeType = "video/mpeg",
order = 1,
- )
+ ),
)
.associateBy { it.uri }
runCurrent()
@@ -145,7 +152,7 @@ class ShareouselViewModelTest {
ChooserRequest(
targetIntent = Intent(),
launchedFromPackage = "",
- metadataText = "Hello"
+ metadataText = "Hello",
)
chooserRequestRepository.chooserRequest.value = request
@@ -162,15 +169,17 @@ class ShareouselViewModelTest {
previewModels =
listOf(
PreviewModel(
+ key = PreviewKey.final(0),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/png",
order = 0,
),
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme1", "ssp1", "fragment1"),
mimeType = "video/mpeg",
order = 1,
- )
+ ),
),
startIdx = 1,
loadMoreLeft = null,
@@ -194,6 +203,7 @@ class ShareouselViewModelTest {
val previewVm =
shareouselViewModel.preview.invoke(
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme1", "ssp1", "fragment1"),
mimeType = "video/mpeg",
order = 0,
@@ -225,15 +235,17 @@ class ShareouselViewModelTest {
previewModels =
listOf(
PreviewModel(
+ key = PreviewKey.final(0),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "image/png",
order = 0,
),
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme1", "ssp1", "fragment1"),
mimeType = "video/mpeg",
order = 1,
- )
+ ),
),
startIdx = 1,
loadMoreLeft = null,
@@ -246,6 +258,7 @@ class ShareouselViewModelTest {
val previewVm =
shareouselViewModel.preview.invoke(
PreviewModel(
+ key = PreviewKey.final(0),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = "video/mpeg",
order = 1,
@@ -314,6 +327,7 @@ class ShareouselViewModelTest {
this.targetIntentModifier = targetIntentModifier
previewSelectionsRepository.selections.value =
PreviewModel(
+ key = PreviewKey.final(1),
uri = Uri.fromParts("scheme", "ssp", "fragment"),
mimeType = null,
order = 0,
diff --git a/tests/unit/src/com/android/intentresolver/ui/viewmodel/IntentExtTest.kt b/tests/unit/src/com/android/intentresolver/ui/viewmodel/IntentExtTest.kt
new file mode 100644
index 00000000..8fc162ca
--- /dev/null
+++ b/tests/unit/src/com/android/intentresolver/ui/viewmodel/IntentExtTest.kt
@@ -0,0 +1,174 @@
+/*
+ * 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.ui.viewmodel
+
+import android.content.Intent
+import android.content.Intent.ACTION_SEND
+import android.content.Intent.EXTRA_STREAM
+import android.net.Uri
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+class IntentExtTest {
+
+ @Test
+ fun noActionOrUris() {
+ val intent = Intent()
+
+ assertThat(intent.createIntentFilter()).isNull()
+ }
+
+ @Test
+ fun uriInData() {
+ val intent = Intent(ACTION_SEND)
+ intent.setDataAndType(
+ Uri.Builder().scheme("scheme1").encodedAuthority("auth1").path("path1").build(),
+ "image/png",
+ )
+
+ val filter = intent.createIntentFilter()
+
+ assertThat(filter).isNotNull()
+ assertThat(filter!!.dataTypes()[0]).isEqualTo("image/png")
+ assertThat(filter.actionsIterator().next()).isEqualTo(ACTION_SEND)
+ assertThat(filter.schemesIterator().next()).isEqualTo("scheme1")
+ assertThat(filter.authoritiesIterator().next().host).isEqualTo("auth1")
+ assertThat(filter.getDataPath(0).path).isEqualTo("/path1")
+ }
+
+ @Test
+ fun noAction() {
+ val intent = Intent()
+ intent.setDataAndType(
+ Uri.Builder().scheme("scheme1").encodedAuthority("auth1").path("path1").build(),
+ "image/png",
+ )
+
+ val filter = intent.createIntentFilter()
+
+ assertThat(filter).isNotNull()
+ assertThat(filter!!.dataTypes()[0]).isEqualTo("image/png")
+ assertThat(filter.countActions()).isEqualTo(0)
+ assertThat(filter.schemesIterator().next()).isEqualTo("scheme1")
+ assertThat(filter.authoritiesIterator().next().host).isEqualTo("auth1")
+ assertThat(filter.getDataPath(0).path).isEqualTo("/path1")
+ }
+
+ @Test
+ fun singleUriInExtraStream() {
+ val intent = Intent(ACTION_SEND)
+ intent.type = "image/png"
+ intent.putExtra(
+ EXTRA_STREAM,
+ Uri.Builder().scheme("scheme1").encodedAuthority("auth1").path("path1").build(),
+ )
+
+ val filter = intent.createIntentFilter()
+
+ assertThat(filter).isNotNull()
+ assertThat(filter!!.dataTypes()[0]).isEqualTo("image/png")
+ assertThat(filter.actionsIterator().next()).isEqualTo(ACTION_SEND)
+ assertThat(filter.schemesIterator().next()).isEqualTo("scheme1")
+ assertThat(filter.authoritiesIterator().next().host).isEqualTo("auth1")
+ assertThat(filter.getDataPath(0).path).isEqualTo("/path1")
+ }
+
+ @Test
+ fun uriInDataAndStream() {
+ val intent = Intent(ACTION_SEND)
+ intent.setDataAndType(
+ Uri.Builder().scheme("scheme1").encodedAuthority("auth1").path("path1").build(),
+ "image/png",
+ )
+
+ intent.putExtra(
+ EXTRA_STREAM,
+ Uri.Builder().scheme("scheme2").encodedAuthority("auth2").path("path2").build(),
+ )
+ val filter = intent.createIntentFilter()
+
+ assertThat(filter).isNotNull()
+ assertThat(filter!!.dataTypes()[0]).isEqualTo("image/png")
+ assertThat(filter.actionsIterator().next()).isEqualTo(ACTION_SEND)
+ assertThat(filter.getDataScheme(0)).isEqualTo("scheme1")
+ assertThat(filter.getDataScheme(1)).isEqualTo("scheme2")
+ assertThat(filter.getDataAuthority(0).host).isEqualTo("auth1")
+ assertThat(filter.getDataAuthority(1).host).isEqualTo("auth2")
+ assertThat(filter.getDataPath(0).path).isEqualTo("/path1")
+ assertThat(filter.getDataPath(1).path).isEqualTo("/path2")
+ }
+
+ @Test
+ fun multipleUris() {
+ val intent = Intent(ACTION_SEND)
+ intent.type = "image/png"
+ val uris =
+ arrayListOf(
+ Uri.Builder().scheme("scheme1").encodedAuthority("auth1").path("path1").build(),
+ Uri.Builder().scheme("scheme2").encodedAuthority("auth2").path("path2").build(),
+ )
+ intent.putExtra(EXTRA_STREAM, uris)
+
+ val filter = intent.createIntentFilter()
+
+ assertThat(filter).isNotNull()
+ assertThat(filter!!.dataTypes()[0]).isEqualTo("image/png")
+ assertThat(filter.actionsIterator().next()).isEqualTo(ACTION_SEND)
+ assertThat(filter.getDataScheme(0)).isEqualTo("scheme1")
+ assertThat(filter.getDataScheme(1)).isEqualTo("scheme2")
+ assertThat(filter.getDataAuthority(0).host).isEqualTo("auth1")
+ assertThat(filter.getDataAuthority(1).host).isEqualTo("auth2")
+ assertThat(filter.getDataPath(0).path).isEqualTo("/path1")
+ assertThat(filter.getDataPath(1).path).isEqualTo("/path2")
+ }
+
+ @Test
+ fun multipleUrisWithNullValues() {
+ val intent = Intent(ACTION_SEND)
+ intent.type = "image/png"
+ val uris =
+ arrayListOf(
+ null,
+ Uri.Builder().scheme("scheme1").encodedAuthority("auth1").path("path1").build(),
+ null,
+ )
+ intent.putExtra(EXTRA_STREAM, uris)
+
+ val filter = intent.createIntentFilter()
+
+ assertThat(filter).isNotNull()
+ assertThat(filter!!.dataTypes()[0]).isEqualTo("image/png")
+ assertThat(filter.actionsIterator().next()).isEqualTo(ACTION_SEND)
+ assertThat(filter.getDataScheme(0)).isEqualTo("scheme1")
+ assertThat(filter.getDataAuthority(0).host).isEqualTo("auth1")
+ assertThat(filter.getDataPath(0).path).isEqualTo("/path1")
+ }
+
+ @Test
+ fun badMimeType() {
+ val intent = Intent(ACTION_SEND)
+ intent.type = "badType"
+ intent.putExtra(
+ EXTRA_STREAM,
+ Uri.Builder().scheme("scheme1").encodedAuthority("authority1").path("path1").build(),
+ )
+
+ val filter = intent.createIntentFilter()
+
+ assertThat(filter).isNotNull()
+ assertThat(filter!!.countDataTypes()).isEqualTo(0)
+ }
+}