diff options
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="?androidprv:attr/materialColorSurfaceContainer">" + 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="@androidprv:color/materialColorSurfaceContainer">" 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="?androidprv:attr/materialColorSurfaceContainer">" + 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="@androidprv:color/materialColorSurfaceContainer">" 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="?androidprv:attr/materialColorSurfaceContainer">" + 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="@androidprv:color/materialColorSurfaceContainer">" 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="?androidprv:attr/materialColorSurfaceContainer">" + 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="@androidprv:color/materialColorSurfaceContainer">" 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) + } +} |