summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp1
-rw-r--r--aconfig/FeatureFlags.aconfig7
-rw-r--r--java/res/drawable/resolver_profile_tab_bg.xml2
-rw-r--r--java/res/layout/chooser_grid.xml97
-rw-r--r--java/res/layout/chooser_grid_preview_file.xml8
-rw-r--r--java/res/layout/chooser_grid_preview_files_text.xml8
-rw-r--r--java/res/layout/chooser_grid_preview_text.xml9
-rw-r--r--java/res/layout/chooser_list_per_profile.xml34
-rw-r--r--java/res/values-af/strings.xml2
-rw-r--r--java/res/values-am/strings.xml2
-rw-r--r--java/res/values-ar/strings.xml6
-rw-r--r--java/res/values-as/strings.xml2
-rw-r--r--java/res/values-az/strings.xml2
-rw-r--r--java/res/values-b+sr+Latn/strings.xml2
-rw-r--r--java/res/values-be/strings.xml2
-rw-r--r--java/res/values-bg/strings.xml2
-rw-r--r--java/res/values-bn/strings.xml2
-rw-r--r--java/res/values-bs/strings.xml2
-rw-r--r--java/res/values-ca/strings.xml2
-rw-r--r--java/res/values-cs/strings.xml2
-rw-r--r--java/res/values-da/strings.xml2
-rw-r--r--java/res/values-de/strings.xml2
-rw-r--r--java/res/values-el/strings.xml2
-rw-r--r--java/res/values-en-rAU/strings.xml2
-rw-r--r--java/res/values-en-rCA/strings.xml1
-rw-r--r--java/res/values-en-rGB/strings.xml2
-rw-r--r--java/res/values-en-rIN/strings.xml2
-rw-r--r--java/res/values-en-rXC/strings.xml1
-rw-r--r--java/res/values-es-rUS/strings.xml2
-rw-r--r--java/res/values-es/strings.xml2
-rw-r--r--java/res/values-et/strings.xml2
-rw-r--r--java/res/values-eu/strings.xml2
-rw-r--r--java/res/values-fa/strings.xml4
-rw-r--r--java/res/values-fi/strings.xml2
-rw-r--r--java/res/values-fr-rCA/strings.xml2
-rw-r--r--java/res/values-fr/strings.xml4
-rw-r--r--java/res/values-gl/strings.xml2
-rw-r--r--java/res/values-gu/strings.xml2
-rw-r--r--java/res/values-hi/strings.xml2
-rw-r--r--java/res/values-hr/strings.xml2
-rw-r--r--java/res/values-hu/strings.xml2
-rw-r--r--java/res/values-hy/strings.xml2
-rw-r--r--java/res/values-in/strings.xml4
-rw-r--r--java/res/values-is/strings.xml2
-rw-r--r--java/res/values-it/strings.xml2
-rw-r--r--java/res/values-iw/strings.xml4
-rw-r--r--java/res/values-ja/strings.xml4
-rw-r--r--java/res/values-ka/strings.xml2
-rw-r--r--java/res/values-kk/strings.xml2
-rw-r--r--java/res/values-km/strings.xml2
-rw-r--r--java/res/values-kn/strings.xml2
-rw-r--r--java/res/values-ko/strings.xml2
-rw-r--r--java/res/values-ky/strings.xml2
-rw-r--r--java/res/values-lo/strings.xml2
-rw-r--r--java/res/values-lt/strings.xml2
-rw-r--r--java/res/values-lv/strings.xml2
-rw-r--r--java/res/values-mk/strings.xml2
-rw-r--r--java/res/values-ml/strings.xml2
-rw-r--r--java/res/values-mn/strings.xml2
-rw-r--r--java/res/values-mr/strings.xml2
-rw-r--r--java/res/values-ms/strings.xml2
-rw-r--r--java/res/values-my/strings.xml2
-rw-r--r--java/res/values-nb/strings.xml4
-rw-r--r--java/res/values-ne/strings.xml2
-rw-r--r--java/res/values-nl/strings.xml2
-rw-r--r--java/res/values-or/strings.xml2
-rw-r--r--java/res/values-pa/strings.xml2
-rw-r--r--java/res/values-pl/strings.xml2
-rw-r--r--java/res/values-pt-rBR/strings.xml4
-rw-r--r--java/res/values-pt-rPT/strings.xml2
-rw-r--r--java/res/values-pt/strings.xml4
-rw-r--r--java/res/values-ro/strings.xml2
-rw-r--r--java/res/values-ru/strings.xml2
-rw-r--r--java/res/values-si/strings.xml2
-rw-r--r--java/res/values-sk/strings.xml4
-rw-r--r--java/res/values-sl/strings.xml2
-rw-r--r--java/res/values-sq/strings.xml2
-rw-r--r--java/res/values-sr/strings.xml2
-rw-r--r--java/res/values-sv/strings.xml2
-rw-r--r--java/res/values-sw/strings.xml6
-rw-r--r--java/res/values-ta/strings.xml2
-rw-r--r--java/res/values-te/strings.xml2
-rw-r--r--java/res/values-th/strings.xml2
-rw-r--r--java/res/values-tl/strings.xml2
-rw-r--r--java/res/values-tr/strings.xml2
-rw-r--r--java/res/values-uk/strings.xml2
-rw-r--r--java/res/values-ur/strings.xml2
-rw-r--r--java/res/values-uz/strings.xml2
-rw-r--r--java/res/values-vi/strings.xml2
-rw-r--r--java/res/values-zh-rCN/strings.xml2
-rw-r--r--java/res/values-zh-rHK/strings.xml2
-rw-r--r--java/res/values-zh-rTW/strings.xml2
-rw-r--r--java/res/values-zu/strings.xml2
-rw-r--r--java/res/values/strings.xml3
-rw-r--r--java/src/com/android/intentresolver/ChooserActionFactory.java19
-rw-r--r--java/src/com/android/intentresolver/ChooserActivity.java165
-rw-r--r--java/src/com/android/intentresolver/ChooserHelper.kt36
-rw-r--r--java/src/com/android/intentresolver/ChooserListAdapter.java18
-rw-r--r--java/src/com/android/intentresolver/ProfileAvailability.kt18
-rw-r--r--java/src/com/android/intentresolver/ResolverActivity.java11
-rw-r--r--java/src/com/android/intentresolver/ResolverListAdapter.java9
-rw-r--r--java/src/com/android/intentresolver/ResolverViewPager.java8
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java15
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ContentPreviewUi.java2
-rw-r--r--java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java7
-rw-r--r--java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java6
-rw-r--r--java/src/com/android/intentresolver/contentpreview/NoContextPreviewUi.kt2
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ShareouselContentPreviewUi.kt12
-rw-r--r--java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java7
-rw-r--r--java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java7
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/ProcessTargetIntentUpdatesInteractor.kt2
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractor.kt3
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateTargetIntentInteractor.kt2
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ComposeIconComposable.kt19
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt31
-rw-r--r--java/src/com/android/intentresolver/data/repository/DevicePolicyResources.kt43
-rw-r--r--java/src/com/android/intentresolver/emptystate/NoAppsAvailableEmptyStateProvider.java101
-rw-r--r--java/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProvider.java7
-rw-r--r--java/src/com/android/intentresolver/grid/ChooserGridAdapter.java60
-rw-r--r--java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java22
-rw-r--r--java/src/com/android/intentresolver/profiles/MultiProfilePagerAdapter.java29
-rw-r--r--java/src/com/android/intentresolver/ui/ProfilePagerResources.kt8
-rw-r--r--lint-baseline.xml2425
-rw-r--r--tests/activity/AndroidTest.xml1
-rw-r--r--tests/activity/src/com/android/intentresolver/ChooserActivityTest.java2
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/FileContentPreviewUiTest.kt40
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt284
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/TextContentPreviewUiTest.kt49
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUiTest.kt232
-rw-r--r--tests/unit/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProviderTest.kt156
130 files changed, 3287 insertions, 934 deletions
diff --git a/Android.bp b/Android.bp
index d476321c..d0d20cdb 100644
--- a/Android.bp
+++ b/Android.bp
@@ -34,6 +34,7 @@ java_defaults {
strict_updatability_linting: false,
extra_check_modules: ["SystemUILintChecker"],
warning_checks: ["MissingApacheLicenseDetector"],
+ baseline_filename: "lint-baseline.xml",
},
}
diff --git a/aconfig/FeatureFlags.aconfig b/aconfig/FeatureFlags.aconfig
index f61bce26..4d787ea2 100644
--- a/aconfig/FeatureFlags.aconfig
+++ b/aconfig/FeatureFlags.aconfig
@@ -16,13 +16,6 @@ flag {
}
flag {
- name: "scrollable_preview"
- namespace: "intentresolver"
- description: "Makes preview scrollable with multiple profiles"
- bug: "287102904"
-}
-
-flag {
name: "target_data_caching"
namespace: "intentresolver"
description: "Enables caching target icons and labels in a local DB"
diff --git a/java/res/drawable/resolver_profile_tab_bg.xml b/java/res/drawable/resolver_profile_tab_bg.xml
index 8bb23a53..97f3b7e2 100644
--- a/java/res/drawable/resolver_profile_tab_bg.xml
+++ b/java/res/drawable/resolver_profile_tab_bg.xml
@@ -25,7 +25,7 @@
</item>
<item>
- <selector android:enterFadeDuration="100">
+ <selector>
<item android:state_selected="false">
<shape android:shape="rectangle">
<corners android:radius="12dp" />
diff --git a/java/res/layout/chooser_grid.xml b/java/res/layout/chooser_grid.xml
deleted file mode 100644
index 8320b284..00000000
--- a/java/res/layout/chooser_grid.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-* Copyright 2015, 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.
-*/
--->
-<com.android.intentresolver.widget.ResolverDrawerLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center"
- app:maxCollapsedHeight="0dp"
- app:maxCollapsedHeightSmall="56dp"
- android:maxWidth="@dimen/chooser_width"
- android:id="@androidprv:id/contentPanel">
-
- <RelativeLayout
- android:id="@androidprv:id/chooser_header"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:layout_alwaysShow="true"
- android:elevation="0dp"
- android:background="@drawable/bottomsheet_background">
-
- <View
- android:id="@androidprv:id/drag"
- android:layout_width="64dp"
- android:layout_height="4dp"
- android:background="@drawable/ic_drag_handle"
- android:layout_marginTop="@dimen/chooser_edge_margin_thin"
- android:layout_marginBottom="@dimen/chooser_edge_margin_thin"
- android:layout_centerHorizontal="true"
- android:layout_alignParentTop="true" />
-
- <TextView android:id="@android:id/title"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:textAppearance="@android:style/TextAppearance.DeviceDefault.WindowTitle"
- android:gravity="center"
- android:paddingBottom="@dimen/chooser_view_spacing"
- android:paddingLeft="24dp"
- android:paddingRight="24dp"
- android:visibility="gone"
- android:layout_below="@androidprv:id/drag"
- android:layout_centerHorizontal="true"/>
- </RelativeLayout>
-
- <FrameLayout
- android:id="@androidprv:id/content_preview_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone" />
-
- <TabHost
- android:id="@androidprv:id/profile_tabhost"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_centerHorizontal="true"
- android:background="?androidprv:attr/materialColorSurfaceContainer">
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <TabWidget
- android:id="@android:id/tabs"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone">
- </TabWidget>
- <FrameLayout
- android:id="@android:id/tabcontent"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <com.android.intentresolver.ResolverViewPager
- android:id="@androidprv:id/profile_pager"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
- </FrameLayout>
- </LinearLayout>
- </TabHost>
-
-</com.android.intentresolver.widget.ResolverDrawerLayout>
diff --git a/java/res/layout/chooser_grid_preview_file.xml b/java/res/layout/chooser_grid_preview_file.xml
index 90832d23..4e8cf7ba 100644
--- a/java/res/layout/chooser_grid_preview_file.xml
+++ b/java/res/layout/chooser_grid_preview_file.xml
@@ -26,14 +26,6 @@
android:orientation="vertical"
android:background="?androidprv:attr/materialColorSurfaceContainer">
- <ViewStub
- android:id="@+id/chooser_headline_row_stub"
- android:layout="@layout/chooser_headline_row"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingHorizontal="@dimen/chooser_edge_margin_normal"
- android:layout_marginBottom="@dimen/chooser_view_spacing" />
-
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/java/res/layout/chooser_grid_preview_files_text.xml b/java/res/layout/chooser_grid_preview_files_text.xml
index e7747496..2756e800 100644
--- a/java/res/layout/chooser_grid_preview_files_text.xml
+++ b/java/res/layout/chooser_grid_preview_files_text.xml
@@ -25,14 +25,6 @@
android:orientation="vertical"
android:background="?androidprv:attr/materialColorSurfaceContainer">
- <ViewStub
- android:id="@+id/chooser_headline_row_stub"
- android:layout="@layout/chooser_headline_row"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingHorizontal="@dimen/chooser_edge_margin_normal"
- android:layout_marginBottom="@dimen/chooser_view_spacing" />
-
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/java/res/layout/chooser_grid_preview_text.xml b/java/res/layout/chooser_grid_preview_text.xml
index f3045c34..ee54c0ae 100644
--- a/java/res/layout/chooser_grid_preview_text.xml
+++ b/java/res/layout/chooser_grid_preview_text.xml
@@ -27,14 +27,6 @@
android:orientation="vertical"
android:background="?androidprv:attr/materialColorSurfaceContainer">
- <ViewStub
- android:id="@+id/chooser_headline_row_stub"
- android:layout="@layout/chooser_headline_row"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingHorizontal="@dimen/chooser_edge_margin_normal"
- android:layout_marginBottom="@dimen/chooser_view_spacing" />
-
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -122,4 +114,3 @@
<include layout="@layout/chooser_action_row" />
</LinearLayout>
-
diff --git a/java/res/layout/chooser_list_per_profile.xml b/java/res/layout/chooser_list_per_profile.xml
deleted file mode 100644
index ef82090c..00000000
--- a/java/res/layout/chooser_list_per_profile.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
- ~ Copyright (C) 2019 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.
- -->
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <androidx.recyclerview.widget.RecyclerView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- app:layoutManager="com.android.intentresolver.ChooserGridLayoutManager"
- android:id="@androidprv:id/resolver_list"
- android:clipToPadding="false"
- android:background="?androidprv:attr/materialColorSurfaceContainer"
- android:scrollbars="none"
- android:elevation="1dp"
- android:nestedScrollingEnabled="true" />
-
- <include layout="@layout/resolver_empty_states" />
-</RelativeLayout>
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 4ce4e614..688aab44 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Hervat"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Geen werkprogramme nie"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Geen persoonlike programme nie"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Maak <xliff:g id="APP">%s</xliff:g> in jou persoonlike profiel oop?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Maak <xliff:g id="APP">%s</xliff:g> in jou werkprofiel oop?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Gebruik persoonlike blaaier"</string>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
index e8c5a033..7482d692 100644
--- a/java/res/values-am/strings.xml
+++ b/java/res/values-am/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"ከቆመበት ቀጥል"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"ምንም የሥራ መተግበሪያዎች የሉም"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"ምንም የግል መተግበሪያዎች የሉም"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> በግል መገለጫዎ ውስጥ ይከፈት?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> በስራ መገለጫዎ ውስጥ ይከፈት?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"የግል አሳሽ ተጠቀም"</string>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index a5979327..451f9862 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -49,7 +49,7 @@
<string name="forward_intent_to_work" msgid="2906094223089139419">"أنت تستخدم هذا التطبيق في ملفك الشخصي للعمل"</string>
<string name="activity_resolver_use_always" msgid="8674194687637555245">"دائمًا"</string>
<string name="activity_resolver_use_once" msgid="594173435998892989">"مرة واحدة فقط"</string>
- <string name="activity_resolver_work_profiles_support" msgid="8228711455685203580">"لا يتوافق تطبيق \"<xliff:g id="APP">%1$s</xliff:g>\" مع الملف الشخصي للعمل."</string>
+ <string name="activity_resolver_work_profiles_support" msgid="8228711455685203580">"لا يتوافق تطبيق \"<xliff:g id="APP">%1$s</xliff:g>\" مع ملف العمل."</string>
<string name="pin_specific_target" msgid="5057063421361441406">"تثبيت <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="unpin_specific_target" msgid="3115158908159857777">"إزالة تثبيت <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="3857183660047569146">"تعديل"</string>
@@ -73,7 +73,7 @@
<string name="image_preview_a11y_description" msgid="297102643932491797">"صورة مصغّرة لمعاينة صورة"</string>
<string name="video_preview_a11y_description" msgid="683440858811095990">"صورة مصغّرة لمعاينة فيديو"</string>
<string name="file_preview_a11y_description" msgid="7397224827802410602">"صورة مصغّرة لمعاينة ملف"</string>
- <string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"ما مِن أشخاص مقترحين للمشاركة معهم."</string>
+ <string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"ما مِن أشخاص مقترحين للمشاركة معهم"</string>
<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>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"إلغاء الإيقاف المؤقت"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"ما مِن تطبيقات عمل."</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"ما مِن تطبيقات شخصية."</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"هل تريد فتح <xliff:g id="APP">%s</xliff:g> في ملفك الشخصي؟"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"هل تريد فتح <xliff:g id="APP">%s</xliff:g> في ملفك الشخصي للعمل؟"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"استخدام المتصفّح الشخصي"</string>
diff --git a/java/res/values-as/strings.xml b/java/res/values-as/strings.xml
index dd677968..67bbf6c8 100644
--- a/java/res/values-as/strings.xml
+++ b/java/res/values-as/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"আনপজ কৰক"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"কোনো কৰ্মস্থানৰ এপ্‌ নাই"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"কোনো ব্যক্তিগত এপ্‌ নাই"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"আপোনাৰ ব্যক্তিগত প্ৰ’ফাইলত <xliff:g id="APP">%s</xliff:g> খুলিবনে?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"আপোনাৰ কর্মস্থানৰ প্ৰ\'ফাইলত <xliff:g id="APP">%s</xliff:g> খুলিবনে?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"ব্যক্তিগত ব্ৰাউজাৰ ব্যৱহাৰ কৰক"</string>
diff --git a/java/res/values-az/strings.xml b/java/res/values-az/strings.xml
index 39e396d0..048e86e3 100644
--- a/java/res/values-az/strings.xml
+++ b/java/res/values-az/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Pauzanı bitirin"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"İş tətbiqi yoxdur"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Şəxsi tətbiq yoxdur"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Şəxsi profilinizdə <xliff:g id="APP">%s</xliff:g> tətbiqi açılsın?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"İş profilinizdə <xliff:g id="APP">%s</xliff:g> tətbiqi açılsın?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Şəxsi brauzerdən istifadə edin"</string>
diff --git a/java/res/values-b+sr+Latn/strings.xml b/java/res/values-b+sr+Latn/strings.xml
index 91dd0c13..4f016f19 100644
--- a/java/res/values-b+sr+Latn/strings.xml
+++ b/java/res/values-b+sr+Latn/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Ponovo aktiviraj"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nema poslovnih aplikacija"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nema ličnih aplikacija"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Želite da na ličnom profilu otvorite: <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Želite da na poslovnom profilu otvorite: <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Koristi lični pregledač"</string>
diff --git a/java/res/values-be/strings.xml b/java/res/values-be/strings.xml
index 2f5d8004..9ab80a2f 100644
--- a/java/res/values-be/strings.xml
+++ b/java/res/values-be/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Уключыць"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Няма працоўных праграм"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Няма асабістых праграм"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Адкрыць праграму \"<xliff:g id="APP">%s</xliff:g>\" з выкарыстаннем асабістага профілю?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Адкрыць праграму \"<xliff:g id="APP">%s</xliff:g>\" з выкарыстаннем працоўнага профілю?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Скарыстаць асабісты браўзер"</string>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index 2736cb13..a362c67c 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Отмяна на паузата"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Няма подходящи служебни приложения"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Няма подходящи лични приложения"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Искате ли да отворите <xliff:g id="APP">%s</xliff:g> в личния си потребителски профил?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Искате ли да отворите <xliff:g id="APP">%s</xliff:g> в служебния си потребителски профил?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Използване на личния браузър"</string>
diff --git a/java/res/values-bn/strings.xml b/java/res/values-bn/strings.xml
index db656a0d..83c76752 100644
--- a/java/res/values-bn/strings.xml
+++ b/java/res/values-bn/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"আনপজ করুন"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"এর জন্য কোনও অফিস অ্যাপ নেই"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"ব্যক্তিগত অ্যাপে দেখা যাবে না"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"আপনার ব্যক্তিগত প্রোফাইল থেকে <xliff:g id="APP">%s</xliff:g> খুলবেন?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"আপনার অফিস প্রোফাইল থেকে <xliff:g id="APP">%s</xliff:g> খুলবেন?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"ব্যক্তিগত ব্রাউজার ব্যবহার করুন"</string>
diff --git a/java/res/values-bs/strings.xml b/java/res/values-bs/strings.xml
index d5f76fe7..a29f3638 100644
--- a/java/res/values-bs/strings.xml
+++ b/java/res/values-bs/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Ponovo pokreni"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nema poslovnih aplikacija"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nema ličnih aplikacija"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> na ličnom profilu?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> na radnom profilu?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Koristi lični preglednik"</string>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index a3407873..daac39ef 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Reactiva"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Cap aplicació de treball"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Cap aplicació personal"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Vols obrir <xliff:g id="APP">%s</xliff:g> al teu perfil personal?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Vols obrir <xliff:g id="APP">%s</xliff:g> al teu perfil de treball?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Utilitza el navegador personal"</string>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index 93712487..4f0eca35 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Zrušit pozastavení"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Žádné pracovní aplikace"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Žádné osobní aplikace"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Otevřít aplikaci <xliff:g id="APP">%s</xliff:g> v osobním profilu?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Otevřít aplikaci <xliff:g id="APP">%s</xliff:g> v pracovním profilu?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Použít osobní prohlížeč"</string>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index 26385908..784a2efd 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Genoptag"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Der er ingen arbejdsapps"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Der er ingen personlige apps"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Vil du åbne <xliff:g id="APP">%s</xliff:g> på din personlige profil?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Vil du åbne <xliff:g id="APP">%s</xliff:g> på din arbejdsprofil?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Brug personlig browser"</string>
diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml
index 67ea5e63..07be8072 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Nicht mehr pausieren"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Keine geschäftlichen Apps"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Keine privaten Apps"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> in deinem privaten Profil öffnen?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> in deinem Arbeitsprofil öffnen?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Privaten Browser verwenden"</string>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index f88dc751..b62d6687 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Αναίρεση παύσης"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Δεν υπάρχουν εφαρμογές εργασιών"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Δεν υπάρχουν προσωπικές εφαρμογές"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Θέλετε να ανοίξετε την εφαρμογή <xliff:g id="APP">%s</xliff:g> στο προσωπικό σας προφίλ;"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Θέλετε να ανοίξετε την εφαρμογή <xliff:g id="APP">%s</xliff:g> στο προφίλ σας εργασίας;"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Χρήση προσωπικού προγράμματος περιήγησης"</string>
diff --git a/java/res/values-en-rAU/strings.xml b/java/res/values-en-rAU/strings.xml
index 90f6974a..21fcd488 100644
--- a/java/res/values-en-rAU/strings.xml
+++ b/java/res/values-en-rAU/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Unpause"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"No personal apps"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Open <xliff:g id="APP">%s</xliff:g> in your personal profile?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Open <xliff:g id="APP">%s</xliff:g> in your work profile?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Use personal browser"</string>
diff --git a/java/res/values-en-rCA/strings.xml b/java/res/values-en-rCA/strings.xml
index 90f6974a..537606cc 100644
--- a/java/res/values-en-rCA/strings.xml
+++ b/java/res/values-en-rCA/strings.xml
@@ -90,6 +90,7 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Unpause"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"No personal apps"</string>
+ <string name="resolver_no_private_apps_available" msgid="4164473548027417456">"No private apps"</string>
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Open <xliff:g id="APP">%s</xliff:g> in your personal profile?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Open <xliff:g id="APP">%s</xliff:g> in your work profile?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Use personal browser"</string>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index 90f6974a..21fcd488 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Unpause"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"No personal apps"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Open <xliff:g id="APP">%s</xliff:g> in your personal profile?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Open <xliff:g id="APP">%s</xliff:g> in your work profile?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Use personal browser"</string>
diff --git a/java/res/values-en-rIN/strings.xml b/java/res/values-en-rIN/strings.xml
index 90f6974a..21fcd488 100644
--- a/java/res/values-en-rIN/strings.xml
+++ b/java/res/values-en-rIN/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Unpause"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"No personal apps"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Open <xliff:g id="APP">%s</xliff:g> in your personal profile?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Open <xliff:g id="APP">%s</xliff:g> in your work profile?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Use personal browser"</string>
diff --git a/java/res/values-en-rXC/strings.xml b/java/res/values-en-rXC/strings.xml
index f0650785..70cafe8e 100644
--- a/java/res/values-en-rXC/strings.xml
+++ b/java/res/values-en-rXC/strings.xml
@@ -90,6 +90,7 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‏‎Unpause‎‏‎‎‏‎"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‎‎‎‏‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎‏‏‏‏‎No work apps‎‏‎‎‏‎"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‎‎‏‎‎‏‎‏‏‏‏‏‎‎‎‏‏‏‏‎No personal apps‎‏‎‎‏‎"</string>
+ <string name="resolver_no_private_apps_available" msgid="4164473548027417456">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‎‎‎No private apps‎‏‎‎‏‎"</string>
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎Open ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ in your personal profile?‎‏‎‎‏‎"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‎‏‎Open ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ in your work profile?‎‏‎‎‏‎"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎‎Use personal browser‎‏‎‎‏‎"</string>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index e79f383b..2f33f965 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Reanudar"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"El contenido no es compatible con apps de trabajo"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"El contenido no es compatible con apps personales"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"¿Quieres abrir <xliff:g id="APP">%s</xliff:g> en tu perfil personal?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"¿Quieres abrir <xliff:g id="APP">%s</xliff:g> en tu perfil de trabajo?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Usar un navegador personal"</string>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index 28b37a73..92aed933 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Reactivar"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Ninguna aplicación de trabajo"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Ninguna aplicación personal"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"¿Abrir <xliff:g id="APP">%s</xliff:g> en tu perfil personal?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"¿Abrir <xliff:g id="APP">%s</xliff:g> en tu perfil de trabajo?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Usar navegador personal"</string>
diff --git a/java/res/values-et/strings.xml b/java/res/values-et/strings.xml
index 9b4fff07..abff7aae 100644
--- a/java/res/values-et/strings.xml
+++ b/java/res/values-et/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Jätka"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Töörakendusi pole"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Isiklikke rakendusi pole"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Kas avada <xliff:g id="APP">%s</xliff:g> teie isiklikul profiilil?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Kas avada <xliff:g id="APP">%s</xliff:g> teie tööprofiilil?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Kasuta isiklikku brauserit"</string>
diff --git a/java/res/values-eu/strings.xml b/java/res/values-eu/strings.xml
index 275eb854..7570e7dc 100644
--- a/java/res/values-eu/strings.xml
+++ b/java/res/values-eu/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Berraktibatu"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Ez dago laneko aplikaziorik"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Ez dago aplikazio pertsonalik"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Profil pertsonalean ireki nahi duzu <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Laneko profilean ireki nahi duzu <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Erabili arakatzaile pertsonala"</string>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index 82a75582..66b03cfc 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -73,7 +73,7 @@
<string name="image_preview_a11y_description" msgid="297102643932491797">"تصویر کوچک پیش‌نمای تصویر"</string>
<string name="video_preview_a11y_description" msgid="683440858811095990">"تصویر کوچک پیش‌نمای ویدیو"</string>
<string name="file_preview_a11y_description" msgid="7397224827802410602">"تصویر کوچک پیش‌نمای فایل"</string>
- <string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"هیچ فردی توصیه نشده است که با او هم‌رسانی کنید"</string>
+ <string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"هیچ فردی که با او هم‌رسانی کنید توصیه نشده است"</string>
<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>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"لغو مکث"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"برنامه کاری‌ای وجود ندارد"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"برنامه شخصی‌ای وجود ندارد"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> در نمایه شخصی باز شود؟"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> در نمایه کاری باز شود؟"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"استفاده از مرورگر شخصی"</string>
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
index 80f39cfa..3b79b195 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Jatka käyttöä"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Ei työsovelluksia"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Ei henkilökohtaisia sovelluksia"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Avataanko <xliff:g id="APP">%s</xliff:g> henkilökohtaisessa profiilissa?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Avataanko <xliff:g id="APP">%s</xliff:g> työprofiilissa?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Käytä henkilökohtaista selainta"</string>
diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml
index d5064071..1959af09 100644
--- a/java/res/values-fr-rCA/strings.xml
+++ b/java/res/values-fr-rCA/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Réactiver"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Aucune application professionnelle"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Aucune application personnelle"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil personnel?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil professionnel?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Utiliser le navigateur du profil personnel"</string>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index ff0c5199..c87644a6 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -55,7 +55,7 @@
<string name="screenshot_edit" msgid="3857183660047569146">"Modifier"</string>
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # fichier}one{+ # fichier}many{+ # fichiers}other{+ # fichiers}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{+ # autre fichier}one{+ # autre fichier}many{+ # autres fichiers}other{+ # autres fichiers}}"</string>
- <string name="sharing_text" msgid="8137537443603304062">"Partage du texte…"</string>
+ <string name="sharing_text" msgid="8137537443603304062">"Texte à partager"</string>
<string name="sharing_link" msgid="2307694372813942916">"Partager le lien"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Partage de l\'image…}one{Partage de # image…}many{Partage de # d\'images…}other{Partage de # images…}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Partage de la vidéo…}one{Partage de # vidéo…}many{Partage de # de vidéos…}other{Partage de # vidéos…}}"</string>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Réactiver"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Aucune appli professionnelle"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Aucune appli personnelle"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil personnel ?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil professionnel ?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Utiliser le navigateur personnel"</string>
diff --git a/java/res/values-gl/strings.xml b/java/res/values-gl/strings.xml
index f4727877..6b8a4151 100644
--- a/java/res/values-gl/strings.xml
+++ b/java/res/values-gl/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Reactivar"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Non hai ningunha aplicación do traballo compatible"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Non hai ningunha aplicación persoal compatible"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Queres abrir <xliff:g id="APP">%s</xliff:g> no teu perfil persoal?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Queres abrir <xliff:g id="APP">%s</xliff:g> no teu perfil de traballo?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Utilizar navegador persoal"</string>
diff --git a/java/res/values-gu/strings.xml b/java/res/values-gu/strings.xml
index 22826860..5a506b50 100644
--- a/java/res/values-gu/strings.xml
+++ b/java/res/values-gu/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"ફરી ચાલુ કરો"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"કોઈ ઑફિસ માટેની ઍપ સપોર્ટ કરતી નથી"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"કોઈ વ્યક્તિગત ઍપ સપોર્ટ કરતી નથી"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"તમારી વ્યક્તિગત પ્રોફાઇલમાં <xliff:g id="APP">%s</xliff:g> ખોલીએ?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"તમારી ઑફિસની પ્રોફાઇલમાં <xliff:g id="APP">%s</xliff:g> ખોલીએ?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"વ્યક્તિગત બ્રાઉઝરનો ઉપયોગ કરો"</string>
diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml
index 933956bd..81cff031 100644
--- a/java/res/values-hi/strings.xml
+++ b/java/res/values-hi/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"चालू करें"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"यह कॉन्टेंट, ऑफ़िस के काम से जुड़े आपके किसी भी ऐप्लिकेशन पर खोला नहीं जा सकता"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"यह कॉन्टेंट आपके किसी भी निजी ऐप्लिकेशन पर खोला नहीं जा सकता"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"क्या <xliff:g id="APP">%s</xliff:g> को निजी प्रोफ़ाइल में खोलना है?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"क्या <xliff:g id="APP">%s</xliff:g> को वर्क प्रोफ़ाइल में खोलना है?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"निजी ब्राउज़र का इस्तेमाल करें"</string>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index 853deacb..ebfe6fe4 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Ponovno pokreni"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Poslovne aplikacije nisu dostupne"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Osobne aplikacije nisu dostupne"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Želite li otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> na osobnom profilu?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Želite li otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> na poslovnom profilu?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Koristi osobni preglednik"</string>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index fa4f23d2..df266e5e 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Szüneteltetés feloldása"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nincs munkahelyi alkalmazás"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nincs személyes alkalmazás"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Megnyitja a(z) <xliff:g id="APP">%s</xliff:g> alkalmazást a személyes profil használatával?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Megnyitja a(z) <xliff:g id="APP">%s</xliff:g> alkalmazást a munkaprofil használatával?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Személyes böngésző használata"</string>
diff --git a/java/res/values-hy/strings.xml b/java/res/values-hy/strings.xml
index a7830d80..8c46bd07 100644
--- a/java/res/values-hy/strings.xml
+++ b/java/res/values-hy/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Նորից միացնել"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Աշխատանքային հավելվածներ չկան"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Անձնական հավելվածներ չկան"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Բացե՞լ <xliff:g id="APP">%s</xliff:g> հավելվածը ձեր անձնական պրոֆիլում"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Բացե՞լ <xliff:g id="APP">%s</xliff:g> հավելվածը ձեր աշխատանքային պրոֆիլում"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Օգտագործել անձնական դիտարկիչը"</string>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 83d18123..a4eb3589 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -55,7 +55,7 @@
<string name="screenshot_edit" msgid="3857183660047569146">"Edit"</string>
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # file}other{+ # file}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{+ # file lainnya}other{+ # file lainnya}}"</string>
- <string name="sharing_text" msgid="8137537443603304062">"Berbagi teks"</string>
+ <string name="sharing_text" msgid="8137537443603304062">"Teks yang akan dibagikan"</string>
<string name="sharing_link" msgid="2307694372813942916">"Berbagi link"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Berbagi gambar}other{Berbagi # gambar}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Membagikan video}other{Membagikan # video}}"</string>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Batalkan jeda"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Tidak ada aplikasi kerja"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Tidak ada aplikasi pribadi"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Buka <xliff:g id="APP">%s</xliff:g> di profil pribadi?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Buka <xliff:g id="APP">%s</xliff:g> di profil kerja?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Gunakan browser pribadi"</string>
diff --git a/java/res/values-is/strings.xml b/java/res/values-is/strings.xml
index a07fc1c8..b6e6e758 100644
--- a/java/res/values-is/strings.xml
+++ b/java/res/values-is/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Ljúka hléi"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Engin vinnuforrit"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Engin forrit til einkanota"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Opna <xliff:g id="APP">%s</xliff:g> í þínu eigin sniði?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Opna <xliff:g id="APP">%s</xliff:g> í vinnusniðinu þínu?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Nota einkavafra"</string>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index a68fe2bb..c011fa3c 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Riattiva"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nessuna app di lavoro"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nessuna app personale"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Aprire <xliff:g id="APP">%s</xliff:g> nel tuo profilo personale?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Aprire <xliff:g id="APP">%s</xliff:g> nel tuo profilo di lavoro?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Usa il browser personale"</string>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 30ecfe02..c1740360 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -73,7 +73,7 @@
<string name="image_preview_a11y_description" msgid="297102643932491797">"תמונה ממוזערת של תצוגה מקדימה של תמונה"</string>
<string name="video_preview_a11y_description" msgid="683440858811095990">"תמונה ממוזערת של תצוגה מקדימה של סרטון"</string>
<string name="file_preview_a11y_description" msgid="7397224827802410602">"תמונה ממוזערת של תצוגה מקדימה של קובץ"</string>
- <string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"אין אנשים שניתן לשתף איתם"</string>
+ <string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"אין המלצות עם מי לשתף"</string>
<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>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"ביטול ההשהיה"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"אין אפליקציות לעבודה"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"אין אפליקציות לשימוש אישי"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"לפתוח את <xliff:g id="APP">%s</xliff:g> בפרופיל האישי?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"לפתוח את <xliff:g id="APP">%s</xliff:g> בפרופיל העבודה?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"בדפדפן האישי"</string>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index a9f79a48..a84118d2 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -55,7 +55,7 @@
<string name="screenshot_edit" msgid="3857183660047569146">"編集"</string>
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{他 # 件のファイル}other{他 # 件のファイル}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{その他 # ファイル}other{その他 # ファイル}}"</string>
- <string name="sharing_text" msgid="8137537443603304062">"テキストを共有中"</string>
+ <string name="sharing_text" msgid="8137537443603304062">"テキストの共有"</string>
<string name="sharing_link" msgid="2307694372813942916">"リンクを共有中"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{画像を共有しています}other{# 枚の画像を共有しています}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{動画を共有中}other{# 個の動画を共有中}}"</string>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"一時停止を解除"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"仕事用アプリはありません"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"個人用アプリはありません"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"個人用プロファイルで <xliff:g id="APP">%s</xliff:g> を開きますか?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"仕事用プロファイルで <xliff:g id="APP">%s</xliff:g> を開きますか?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"個人用ブラウザを使用"</string>
diff --git a/java/res/values-ka/strings.xml b/java/res/values-ka/strings.xml
index 86991fab..7a96944e 100644
--- a/java/res/values-ka/strings.xml
+++ b/java/res/values-ka/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"პაუზის გაუქმება"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"სამსახურის აპები არ არის"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"პირადი აპები არ არის"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"გსურთ <xliff:g id="APP">%s</xliff:g>-ის გახსნა თქვენს პირად პროფილში?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"გსურთ <xliff:g id="APP">%s</xliff:g>-ის გახსნა თქვენს სამსახურის პროფილში?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"პირადი ბრაუზერის გამოყენება"</string>
diff --git a/java/res/values-kk/strings.xml b/java/res/values-kk/strings.xml
index 2ac5fa0e..1819fc34 100644
--- a/java/res/values-kk/strings.xml
+++ b/java/res/values-kk/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Қайта қосу"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Жұмыс қолданбалары жоқ."</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Жеке қолданбалар жоқ."</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> қолданбасын жеке профиліңізде ашу керек пе?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> қолданбасын жұмыс профиліңізде ашу керек пе?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Жеке браузерді пайдалану"</string>
diff --git a/java/res/values-km/strings.xml b/java/res/values-km/strings.xml
index f0f25e41..3897044c 100644
--- a/java/res/values-km/strings.xml
+++ b/java/res/values-km/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"ឈប់ផ្អាក"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"គ្មាន​កម្មវិធី​ការងារ​ទេ"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"គ្មាន​កម្មវិធី​ផ្ទាល់ខ្លួន​ទេ"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"បើក <xliff:g id="APP">%s</xliff:g> នៅក្នុងកម្រង​ព័ត៌មាន​ផ្ទាល់​ខ្លួនរបស់អ្នកឬ?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"បើក <xliff:g id="APP">%s</xliff:g> នៅក្នុងកម្រងព័ត៌មានការងាររបស់អ្នកឬ?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"ប្រើ​កម្មវិធីរុករក​តាមអ៊ីនធឺណិត​ផ្ទាល់ខ្លួន"</string>
diff --git a/java/res/values-kn/strings.xml b/java/res/values-kn/strings.xml
index 101a1bc0..4f2795ee 100644
--- a/java/res/values-kn/strings.xml
+++ b/java/res/values-kn/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"ವಿರಾಮವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"ಯಾವುದೇ ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್‌ಗಳಿಲ್ಲ"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್‌ಗಳಿಲ್ಲ"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ <xliff:g id="APP">%s</xliff:g> ಅನ್ನು ತೆರೆಯಬೇಕೆ?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ <xliff:g id="APP">%s</xliff:g> ಅನ್ನು ತೆರೆಯಬೇಕೆ?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"ವೈಯಕ್ತಿಕ ಬ್ರೌಸರ್ ಬಳಸಿ"</string>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index 1b4f2264..5e1903af 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"일시중지 해제"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"직장 앱 없음"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"개인 앱 없음"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"개인 프로필에서 <xliff:g id="APP">%s</xliff:g> 앱을 여시겠습니까?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"직장 프로필에서 <xliff:g id="APP">%s</xliff:g> 앱을 여시겠습니까?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"개인 브라우저 사용"</string>
diff --git a/java/res/values-ky/strings.xml b/java/res/values-ky/strings.xml
index 33c58be4..56915f4b 100644
--- a/java/res/values-ky/strings.xml
+++ b/java/res/values-ky/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Иштетүү"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Жумуш колдонмолору жок"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Жеке колдонмолор жок"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> колдонмосу жеке профилде ачылсынбы?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> колдонмосу жумуш профилинде ачылсынбы?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Жеке серепчини колдонуу"</string>
diff --git a/java/res/values-lo/strings.xml b/java/res/values-lo/strings.xml
index 7a78f9a3..6a63df3d 100644
--- a/java/res/values-lo/strings.xml
+++ b/java/res/values-lo/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"ຍົກເລີກການຢຸດຊົ່ວຄາວ"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"ບໍ່ມີແອັບບ່ອນເຮັດວຽກ"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"ບໍ່ມີແອັບສ່ວນຕົວ"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"ເປີດ <xliff:g id="APP">%s</xliff:g> ໃນໂປຣໄຟລ໌ສ່ວນຕົວຂອງທ່ານບໍ?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"ເປີດ <xliff:g id="APP">%s</xliff:g> ໃນ​ໂປຣ​ໄຟລ໌​ບ່ອນ​ເຮັດ​ວຽກຂອງທ່ານບໍ?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"ໃຊ້ໂປຣແກຣມທ່ອງເວັບສ່ວນຕົວ"</string>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index a031b1ae..bedf6f9b 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Atšaukti pristabdymą"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nėra darbo programų"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nėra asmeninių programų"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Atidaryti „<xliff:g id="APP">%s</xliff:g>“ asmeniniame profilyje?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Atidaryti „<xliff:g id="APP">%s</xliff:g>“ darbo profilyje?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Naudoti asmeninę naršyklę"</string>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
index ead503a4..e405b66a 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Aktivizēt"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nav darba lietotņu"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nav personīgu lietotņu"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Vai atvērt lietotni <xliff:g id="APP">%s</xliff:g> jūsu personīgajā profilā?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Vai atvērt lietotni <xliff:g id="APP">%s</xliff:g> jūsu darba profilā?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Izmantot personīgo pārlūku"</string>
diff --git a/java/res/values-mk/strings.xml b/java/res/values-mk/strings.xml
index b1e73dea..df46dc98 100644
--- a/java/res/values-mk/strings.xml
+++ b/java/res/values-mk/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Прекини ја паузата"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Нема работни апликации"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Нема лични апликации"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Да се отвори <xliff:g id="APP">%s</xliff:g> во личниот профил?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Да се отвори <xliff:g id="APP">%s</xliff:g> во работниот профил?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Користи личен прелистувач"</string>
diff --git a/java/res/values-ml/strings.xml b/java/res/values-ml/strings.xml
index 4e80ca86..eb15922c 100644
--- a/java/res/values-ml/strings.xml
+++ b/java/res/values-ml/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"താൽക്കാലികമായി നിർത്തിയത് മാറ്റുക"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"ഔദ്യോഗിക ആപ്പുകൾ ഇല്ല"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"വ്യക്തിപര ആപ്പുകൾ ഇല്ല"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g>, നിങ്ങളുടെ വ്യക്തിപരമായ പ്രൊഫൈലിൽ തുറക്കണോ?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g>, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിൽ തുറക്കണോ?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"വ്യക്തിപരമായ ബ്രൗസർ ഉപയോഗിക്കുക"</string>
diff --git a/java/res/values-mn/strings.xml b/java/res/values-mn/strings.xml
index 77ef0edc..469afa50 100644
--- a/java/res/values-mn/strings.xml
+++ b/java/res/values-mn/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Үргэлжлүүлэх"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Ямар ч ажлын апп байхгүй байна"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Ямар ч хувийн апп байхгүй байна"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Хувийн профайл дээрээ <xliff:g id="APP">%s</xliff:g>-г нээх үү?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Ажлын профайл дээрээ <xliff:g id="APP">%s</xliff:g>-г нээх үү?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Хувийн хөтөч ашиглах"</string>
diff --git a/java/res/values-mr/strings.xml b/java/res/values-mr/strings.xml
index 93db4e04..1a9081ec 100644
--- a/java/res/values-mr/strings.xml
+++ b/java/res/values-mr/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"पुन्हा सुरू करा"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"कोणतीही कार्य ॲप्स सपोर्ट करत नाहीत"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"कोणतीही वैयक्तिक ॲप्स सपोर्ट करत नाहीत"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"तुमच्या वैयक्तिक प्रोफाइलमध्ये <xliff:g id="APP">%s</xliff:g> उघडायचे आहे का?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"तुमच्या कार्य प्रोफाइलमध्ये <xliff:g id="APP">%s</xliff:g> उघडायचे आहे का?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"वैयक्तिक ब्राउझर वापरा"</string>
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
index 968c4090..623c0df5 100644
--- a/java/res/values-ms/strings.xml
+++ b/java/res/values-ms/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Nyahjeda"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Tiada apl kerja"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Tiada apl peribadi"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Buka <xliff:g id="APP">%s</xliff:g> dalam profil peribadi anda?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Buka <xliff:g id="APP">%s</xliff:g> dalam profil kerja anda?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Gunakan penyemak imbas peribadi"</string>
diff --git a/java/res/values-my/strings.xml b/java/res/values-my/strings.xml
index d31d8a48..475a755f 100644
--- a/java/res/values-my/strings.xml
+++ b/java/res/values-my/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"ပြန်ဖွင့်ရန်"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"အလုပ်သုံးအက်ပ်များ မရှိပါ"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"ကိုယ်ပိုင်အက်ပ်များ မရှိပါ"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> ကို သင့်ကိုယ်ပိုင်ပရိုဖိုင်တွင် ဖွင့်မလား။"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> ကို သင့်အလုပ်ပရိုဖိုင်တွင် ဖွင့်မလား။"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"ကိုယ်ပိုင်ဘရောင်ဇာ သုံးရန်"</string>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index 587233b4..e455a2b6 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -55,7 +55,7 @@
<string name="screenshot_edit" msgid="3857183660047569146">"Endre"</string>
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # fil}other{+ # filer}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{+ # fil til}other{+ # filer til}}"</string>
- <string name="sharing_text" msgid="8137537443603304062">"Deler teksten"</string>
+ <string name="sharing_text" msgid="8137537443603304062">"Deler tekst"</string>
<string name="sharing_link" msgid="2307694372813942916">"Deler linken"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Deler bildet}other{Deler # bilder}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Deler videoen}other{Deler # videoer}}"</string>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Slå av pausen"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Ingen jobbapper"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Ingen personlige apper"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Vil du åpne <xliff:g id="APP">%s</xliff:g> i den personlige profilen din?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Vil du åpne <xliff:g id="APP">%s</xliff:g> i jobbprofilen din?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Bruk den personlige nettleseren"</string>
diff --git a/java/res/values-ne/strings.xml b/java/res/values-ne/strings.xml
index a800d0b0..d720cadc 100644
--- a/java/res/values-ne/strings.xml
+++ b/java/res/values-ne/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"अनपज गर्नुहोस्"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"यो सामग्री खोल्न मिल्ने कुनै पनि कामसम्बन्धी एप छैन"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"यो सामग्री खोल्न मिल्ने कुनै पनि व्यक्तिगत एप छैन"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> तपाईंको व्यक्तिगत प्रोफाइलमा खोल्ने हो?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> तपाईंको कार्य प्रोफाइलमा खोल्ने हो?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"व्यक्तिगत ब्राउजर प्रयोग गर्नुहोस्"</string>
diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
index 4f8c48b2..9611e524 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Hervatten"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Geen werk-apps"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Geen persoonlijke apps"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> openen in je persoonlijke profiel?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> openen in je werkprofiel?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Persoonlijke browser gebruiken"</string>
diff --git a/java/res/values-or/strings.xml b/java/res/values-or/strings.xml
index b41e4cd2..9d36c473 100644
--- a/java/res/values-or/strings.xml
+++ b/java/res/values-or/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"କୌଣସି ୱାର୍କ ଆପ୍ ନାହିଁ"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"କୌଣସି ବ୍ୟକ୍ତିଗତ ଆପ୍ ନାହିଁ"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g>କୁ ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲରେ ଖୋଲିବେ?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g>କୁ ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲରେ ଖୋଲିବେ?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"ବ୍ୟକ୍ତିଗତ ବ୍ରାଉଜର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
diff --git a/java/res/values-pa/strings.xml b/java/res/values-pa/strings.xml
index df920108..60a9c0f5 100644
--- a/java/res/values-pa/strings.xml
+++ b/java/res/values-pa/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"ਰੋਕ ਹਟਾਓ"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"ਕੋਈ ਕੰਮ ਸੰਬੰਧੀ ਐਪ ਨਹੀਂ"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"ਕੋਈ ਨਿੱਜੀ ਐਪ ਨਹੀਂ"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"ਕੀ ਆਪਣੇ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ <xliff:g id="APP">%s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"ਕੀ ਆਪਣੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ <xliff:g id="APP">%s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"ਨਿੱਜੀ ਬ੍ਰਾਊਜ਼ਰ ਵਰਤੋ"</string>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index a9829275..cae885f7 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Cofnij wstrzymanie"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Brak aplikacji służbowych"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Brak aplikacji osobistych"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Otworzyć aplikację <xliff:g id="APP">%s</xliff:g> w profilu osobistym?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Otworzyć aplikację <xliff:g id="APP">%s</xliff:g> w profilu służbowym?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Użyj przeglądarki osobistej"</string>
diff --git a/java/res/values-pt-rBR/strings.xml b/java/res/values-pt-rBR/strings.xml
index 255fcbe6..665de8b6 100644
--- a/java/res/values-pt-rBR/strings.xml
+++ b/java/res/values-pt-rBR/strings.xml
@@ -77,7 +77,7 @@
<string name="usb_device_resolve_prompt_warn" msgid="4254493957548169620">"Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB."</string>
<string name="resolver_personal_tab" msgid="1381052735324320565">"Pessoal"</string>
<string name="resolver_work_tab" msgid="3588325717455216412">"Trabalho"</string>
- <string name="resolver_private_tab" msgid="3707548826254095157">"Particular"</string>
+ <string name="resolver_private_tab" msgid="3707548826254095157">"Privado"</string>
<string name="resolver_personal_tab_accessibility" msgid="4467784352232582574">"Visualização pessoal"</string>
<string name="resolver_work_tab_accessibility" msgid="7581878836587799920">"Visualização de trabalho"</string>
<string name="resolver_private_tab_accessibility" msgid="2513122834337197252">"Visualização particular"</string>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Reativar"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nenhum app de trabalho"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nenhum app pessoal"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Abrir o app <xliff:g id="APP">%s</xliff:g> no seu perfil pessoal?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Abrir o app <xliff:g id="APP">%s</xliff:g> no seu perfil de trabalho?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Usar o navegador pessoal"</string>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 4b44cb11..08694c9d 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Retomar"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Sem apps de trabalho"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Sem apps pessoais"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Abrir a app <xliff:g id="APP">%s</xliff:g> no seu perfil pessoal?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Abrir a app <xliff:g id="APP">%s</xliff:g> no seu perfil de trabalho?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Usar navegador pessoal"</string>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index 255fcbe6..665de8b6 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -77,7 +77,7 @@
<string name="usb_device_resolve_prompt_warn" msgid="4254493957548169620">"Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB."</string>
<string name="resolver_personal_tab" msgid="1381052735324320565">"Pessoal"</string>
<string name="resolver_work_tab" msgid="3588325717455216412">"Trabalho"</string>
- <string name="resolver_private_tab" msgid="3707548826254095157">"Particular"</string>
+ <string name="resolver_private_tab" msgid="3707548826254095157">"Privado"</string>
<string name="resolver_personal_tab_accessibility" msgid="4467784352232582574">"Visualização pessoal"</string>
<string name="resolver_work_tab_accessibility" msgid="7581878836587799920">"Visualização de trabalho"</string>
<string name="resolver_private_tab_accessibility" msgid="2513122834337197252">"Visualização particular"</string>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Reativar"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nenhum app de trabalho"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nenhum app pessoal"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Abrir o app <xliff:g id="APP">%s</xliff:g> no seu perfil pessoal?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Abrir o app <xliff:g id="APP">%s</xliff:g> no seu perfil de trabalho?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Usar o navegador pessoal"</string>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index 1839e09a..8620e2a5 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Reactivează"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nicio aplicație pentru lucru"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nicio aplicație personală"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Deschizi <xliff:g id="APP">%s</xliff:g> în profilul personal?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Deschizi <xliff:g id="APP">%s</xliff:g> în profilul de serviciu?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Folosește browserul personal"</string>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index 31d171ff..ca852709 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Включить"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Не поддерживается рабочими приложениями."</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Не поддерживается личными приложениями."</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Открыть приложение \"<xliff:g id="APP">%s</xliff:g>\" в личном профиле?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Открыть приложение \"<xliff:g id="APP">%s</xliff:g>\" в рабочем профиле?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Использовать личный браузер"</string>
diff --git a/java/res/values-si/strings.xml b/java/res/values-si/strings.xml
index 09418f55..d8a99812 100644
--- a/java/res/values-si/strings.xml
+++ b/java/res/values-si/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"විරාම නොකරන්න"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"කාර්යාල යෙදුම් නැත"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"පුද්ගලික යෙදුම් නැත"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> ඔබගේ පුද්ගලික පැතිකඩ තුළ විවෘත කරන්නද?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> ඔබගේ කාර්යාල පැතිකඩ තුළ විවෘත කරන්නද?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"පුද්ගලික බ්‍රව්සරය භාවිත කරන්න"</string>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index ef39351f..e8ed1846 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -55,7 +55,7 @@
<string name="screenshot_edit" msgid="3857183660047569146">"Upraviť"</string>
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # súbor}few{+ # súbory}many{+ # files}other{+ # súborov}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{a # ďalší súbor}few{a # ďalšie súbory}many{+ # more files}other{a # ďalších súborov}}"</string>
- <string name="sharing_text" msgid="8137537443603304062">"Zdieľa sa textová správa"</string>
+ <string name="sharing_text" msgid="8137537443603304062">"Zdieľanie textu"</string>
<string name="sharing_link" msgid="2307694372813942916">"Zdieľa sa odkaz"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Zdieľanie obrázku}few{Zdieľanie # obrázkov}many{Sharing # images}other{Zdieľanie # obrázkov}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Zdieľa sa video}few{Zdieľajú sa # videá}many{Sharing # videos}other{Zdieľa sa # videí}}"</string>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Zrušiť pozastavenie"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Žiadne pracovné aplikácie"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Žiadne osobné aplikácie"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Chcete otvoriť <xliff:g id="APP">%s</xliff:g> v osobnom profile?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Chcete otvoriť <xliff:g id="APP">%s</xliff:g> v pracovnom profile?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Použiť osobný prehliadač"</string>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
index 559cf3d1..a0e757b0 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Znova aktiviraj"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nobena delovna aplikacija ni na voljo"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nobena osebna aplikacija"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Želite aplikacijo <xliff:g id="APP">%s</xliff:g> odpreti v osebnem profilu?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Želite aplikacijo <xliff:g id="APP">%s</xliff:g> odpreti v delovnem profilu?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Uporabi osebni brskalnik"</string>
diff --git a/java/res/values-sq/strings.xml b/java/res/values-sq/strings.xml
index cd7fffee..8043a15c 100644
--- a/java/res/values-sq/strings.xml
+++ b/java/res/values-sq/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Hiq nga pauza"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Nuk ka aplikacione pune"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Nuk ka aplikacione personale"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Të hapet <xliff:g id="APP">%s</xliff:g> në profilin tënd personal?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Të hapet <xliff:g id="APP">%s</xliff:g> në profilin tënd të punës?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Përdor shfletuesin personal"</string>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index a5d0e57b..0359c894 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Поново активирај"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Нема пословних апликација"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Нема личних апликација"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Желите да на личном профилу отворите: <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Желите да на пословном профилу отворите: <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Користи лични прегледач"</string>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index 43492b9f..a459f69c 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Återuppta"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Inga jobbappar"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Inga privata appar"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Vill du öppna <xliff:g id="APP">%s</xliff:g> i din privata profil?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Vill du öppna <xliff:g id="APP">%s</xliff:g> i din jobbprofil?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Använd privat webbläsare"</string>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
index 74405a95..63dabd19 100644
--- a/java/res/values-sw/strings.xml
+++ b/java/res/values-sw/strings.xml
@@ -55,7 +55,7 @@
<string name="screenshot_edit" msgid="3857183660047569146">"Badilisha"</string>
<string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ faili #}other{+ faili #}}"</string>
<string name="more_files" msgid="1043875756612339842">"{count,plural, =1{Faili nyingine #}other{Faili zingine #}}"</string>
- <string name="sharing_text" msgid="8137537443603304062">"Inashiriki maandishi"</string>
+ <string name="sharing_text" msgid="8137537443603304062">"Kutuma maandishi"</string>
<string name="sharing_link" msgid="2307694372813942916">"Inashiriki kiungo"</string>
<string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Inashiriki picha}other{Inashiriki picha #}}"</string>
<string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Inashiriki video}other{Inashiriki video #}}"</string>
@@ -73,7 +73,7 @@
<string name="image_preview_a11y_description" msgid="297102643932491797">"Kijipicha cha onyesho la kukagua picha"</string>
<string name="video_preview_a11y_description" msgid="683440858811095990">"Kijipicha cha onyesho la kukagua video"</string>
<string name="file_preview_a11y_description" msgid="7397224827802410602">"Kijipicha cha onyesho la kukagua faili"</string>
- <string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"Hujapendekezewa watu wa kushiriki nao"</string>
+ <string name="chooser_no_direct_share_targets" msgid="4233416657754261844">"Hujapendekezewa watu wa kuwatumia"</string>
<string name="usb_device_resolve_prompt_warn" msgid="4254493957548169620">"Programu hii haijapewa ruhusa ya kurekodi lakini inaweza kurekodi sauti kupitia kifaa hiki cha USB."</string>
<string name="resolver_personal_tab" msgid="1381052735324320565">"Binafsi"</string>
<string name="resolver_work_tab" msgid="3588325717455216412">"Kazini"</string>
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Acha kusitisha"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Hakuna programu za kazini"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Hakuna programu za binafsi"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Je, unataka kufungua <xliff:g id="APP">%s</xliff:g> katika wasifu wako binafsi?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Je, unataka kufungua <xliff:g id="APP">%s</xliff:g> katika wasifu wako wa kazi?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Tumia kivinjari cha binafsi"</string>
diff --git a/java/res/values-ta/strings.xml b/java/res/values-ta/strings.xml
index bef51c34..dcddcf0c 100644
--- a/java/res/values-ta/strings.xml
+++ b/java/res/values-ta/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"மீண்டும் இயக்கு"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"பணி ஆப்ஸ் எதுவுமில்லை"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"தனிப்பட்ட ஆப்ஸ் எதுவுமில்லை"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"உங்கள் தனிப்பட்ட கணக்கில் <xliff:g id="APP">%s</xliff:g> ஆப்ஸைத் திறக்கவா?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"உங்கள் பணிக் கணக்கில் <xliff:g id="APP">%s</xliff:g> ஆப்ஸைத் திறக்கவா?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"தனிப்பட்ட உலாவியைப் பயன்படுத்து"</string>
diff --git a/java/res/values-te/strings.xml b/java/res/values-te/strings.xml
index 30f45be5..93414ea3 100644
--- a/java/res/values-te/strings.xml
+++ b/java/res/values-te/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"అన్‌పాజ్ చేయండి"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"వర్క్ యాప్‌లు లేవు"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"వ్యక్తిగత యాప్‌లు లేవు"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g>ను మీ వ్యక్తిగత ప్రొఫైల్‌లో తెరవాలా?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g>ను మీ వర్క్ ప్రొఫైల్‌లో తెరవాలా?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"వ్యక్తిగత బ్రౌజర్‌ను ఉపయోగించండి"</string>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index 8db86fff..2deef229 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"ยกเลิกการหยุดชั่วคราว"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"ไม่มีแอปงาน"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"ไม่มีแอปส่วนตัว"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"เปิด <xliff:g id="APP">%s</xliff:g> ในโปรไฟล์ส่วนตัวไหม"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"เปิด <xliff:g id="APP">%s</xliff:g> ในโปรไฟล์งานไหม"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"ใช้เบราว์เซอร์ส่วนตัว"</string>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index 59d51005..ccf43d7b 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"I-unpause"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Walang app para sa trabaho"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Walang personal na app"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Buksan ang <xliff:g id="APP">%s</xliff:g> sa iyong personal na profile?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Buksan ang <xliff:g id="APP">%s</xliff:g> sa iyong profile sa trabaho?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Gamitin ang personal na browser"</string>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index eadfeeaa..e671cf89 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Devam ettir"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"İş uygulaması yok"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Kişisel uygulama yok"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> uygulaması kişisel profilinizde açılsın mı?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> uygulaması iş profilinizde açılsın mı?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Kişisel tarayıcıyı kullan"</string>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index a517db45..90ca8213 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Увімкнути знову"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Немає робочих додатків"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Немає особистих додатків"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Відкрити додаток <xliff:g id="APP">%s</xliff:g> в особистому профілі?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Відкрити додаток <xliff:g id="APP">%s</xliff:g> у робочому профілі?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Використати особистий веб-переглядач"</string>
diff --git a/java/res/values-ur/strings.xml b/java/res/values-ur/strings.xml
index 716a99af..9a9f1fb5 100644
--- a/java/res/values-ur/strings.xml
+++ b/java/res/values-ur/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"غیر موقوف کریں"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"کوئی ورک ایپ نہیں"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"کوئی ذاتی ایپ نہیں"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"اپنی ذاتی پروفائل میں <xliff:g id="APP">%s</xliff:g> کھولیں؟"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"اپنی دفتری پروفائل میں <xliff:g id="APP">%s</xliff:g> کھولیں؟"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"ذاتی براؤزر استعمال کریں"</string>
diff --git a/java/res/values-uz/strings.xml b/java/res/values-uz/strings.xml
index d8e0bab7..482f0a90 100644
--- a/java/res/values-uz/strings.xml
+++ b/java/res/values-uz/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Davom ettirish"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Ishga oid ilovalar topilmadi"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Shaxsiy ilovalar topilmadi"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"<xliff:g id="APP">%s</xliff:g> shaxsiy profilda ochilsinmi?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"<xliff:g id="APP">%s</xliff:g> shaxsiy profilda ochilsinmi?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Shaxsiy brauzerdan foydalanish"</string>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index a8d70cfc..beacc185 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Tiếp tục"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Không có ứng dụng công việc"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Không có ứng dụng cá nhân"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Mở <xliff:g id="APP">%s</xliff:g> trong hồ sơ cá nhân của bạn?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Mở <xliff:g id="APP">%s</xliff:g> trong hồ sơ công việc của bạn?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Dùng trình duyệt cá nhân"</string>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index 504bac6a..afe104b4 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"解除暂停"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"没有支持该内容的工作应用"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"没有支持该内容的个人应用"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"要使用个人资料打开 <xliff:g id="APP">%s</xliff:g> 吗?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"要使用工作资料打开 <xliff:g id="APP">%s</xliff:g> 吗?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"使用个人浏览器"</string>
diff --git a/java/res/values-zh-rHK/strings.xml b/java/res/values-zh-rHK/strings.xml
index c54fc4b5..e65b6dc8 100644
--- a/java/res/values-zh-rHK/strings.xml
+++ b/java/res/values-zh-rHK/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"取消暫停"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"沒有適用的工作應用程式"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"沒有適用的個人應用程式"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"要在個人設定檔中開啟「<xliff:g id="APP">%s</xliff:g>」嗎?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"要在工作設定檔中開啟「<xliff:g id="APP">%s</xliff:g>」嗎?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"使用個人瀏覽器"</string>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index 288602f4..f90ef68b 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"取消暫停"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"沒有適用的工作應用程式"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"沒有適用的個人應用程式"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"要在個人資料夾中開啟「<xliff:g id="APP">%s</xliff:g>」嗎?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"要在工作資料夾中開啟「<xliff:g id="APP">%s</xliff:g>」嗎?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"使用個人瀏覽器"</string>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index e30f51fd..25d0b97e 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -90,6 +90,8 @@
<string name="resolver_switch_on_work" msgid="8678893259344318807">"Qhubekisa"</string>
<string name="resolver_no_work_apps_available" msgid="6139818641313189903">"Awekho ama-app womsebenzi"</string>
<string name="resolver_no_personal_apps_available" msgid="8479033344701050767">"Awekho ama-app womuntu siqu"</string>
+ <!-- no translation found for resolver_no_private_apps_available (4164473548027417456) -->
+ <skip />
<string name="miniresolver_open_in_personal" msgid="8397377137465016575">"Vula i-<xliff:g id="APP">%s</xliff:g> kwiphrofayela yakho siqu?"</string>
<string name="miniresolver_open_in_work" msgid="4271638122142624693">"Vula i-<xliff:g id="APP">%s</xliff:g> kwiphrofayela yakho yomsebenzi?"</string>
<string name="miniresolver_use_personal_browser" msgid="1428911732509069292">"Sebenzisa isiphequluli somuntu siqu"</string>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 5c1210b7..17a514d7 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -295,6 +295,9 @@
<!-- Error message. This text lets the user know that their current personal apps don't support the specific content. [CHAR LIMIT=NONE] -->
<string name="resolver_no_personal_apps_available">No personal apps</string>
+ <!-- Error message. This text lets the user know that their current private apps don't support the specific content. [CHAR LIMIT=NONE] -->
+ <string name="resolver_no_private_apps_available">No private apps</string>
+
<!-- Dialog title. User must choose between opening content in a cross-profile app or same-profile browser. [CHAR LIMIT=NONE] -->
<string name="miniresolver_open_in_personal">Open <xliff:g id="app" example="YouTube">%s</xliff:g> in your personal profile?</string>
<!-- Dialog title. User must choose between opening content in a cross-profile app or same-profile browser. [CHAR LIMIT=NONE] -->
diff --git a/java/src/com/android/intentresolver/ChooserActionFactory.java b/java/src/com/android/intentresolver/ChooserActionFactory.java
index ffe83fa6..79998fbc 100644
--- a/java/src/com/android/intentresolver/ChooserActionFactory.java
+++ b/java/src/com/android/intentresolver/ChooserActionFactory.java
@@ -99,7 +99,7 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
private final Context mContext;
@Nullable private Runnable mCopyButtonRunnable;
- private Runnable mEditButtonRunnable;
+ @Nullable private Runnable mEditButtonRunnable;
private final ImmutableList<ChooserAction> mCustomActions;
private final Consumer<Boolean> mExcludeSharedTextAction;
@Nullable private final ShareResultSender mShareResultSender;
@@ -158,7 +158,7 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
ChooserActionFactory(
Context context,
@Nullable Runnable copyButtonRunnable,
- Runnable editButtonRunnable,
+ @Nullable Runnable editButtonRunnable,
List<ChooserAction> customActions,
Consumer<Boolean> onUpdateSharedTextIsExcluded,
EventLog log,
@@ -174,10 +174,12 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
mFinishCallback = finishCallback;
if (mShareResultSender != null) {
- mEditButtonRunnable = () -> {
- mShareResultSender.onActionSelected(ShareAction.SYSTEM_EDIT);
- editButtonRunnable.run();
- };
+ if (mEditButtonRunnable != null) {
+ mEditButtonRunnable = () -> {
+ mShareResultSender.onActionSelected(ShareAction.SYSTEM_EDIT);
+ editButtonRunnable.run();
+ };
+ }
if (mCopyButtonRunnable != null) {
mCopyButtonRunnable = () -> {
mShareResultSender.onActionSelected(ShareAction.SYSTEM_COPY);
@@ -281,6 +283,7 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
return clipData;
}
+ @Nullable
private static TargetInfo getEditSharingTarget(
Context context,
Intent originalIntent,
@@ -325,11 +328,13 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
return dri;
}
+ @Nullable
private static Runnable makeEditButtonRunnable(
- TargetInfo editSharingTarget,
+ @Nullable TargetInfo editSharingTarget,
Callable</* @Nullable */ View> firstVisibleImageQuery,
ActionActivityStarter activityStarter,
EventLog log) {
+ if (editSharingTarget == null) return null;
return () -> {
// Log share completion via edit.
log.logActionSelected(EventLog.SELECTION_TYPE_EDIT);
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java
index 814bf301..56873302 100644
--- a/java/src/com/android/intentresolver/ChooserActivity.java
+++ b/java/src/com/android/intentresolver/ChooserActivity.java
@@ -84,6 +84,7 @@ import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TabHost;
+import android.widget.TabWidget;
import android.widget.TextView;
import android.widget.Toast;
@@ -219,9 +220,10 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
private boolean mRegistered;
private PackageMonitor mPersonalPackageMonitor;
private PackageMonitor mWorkPackageMonitor;
- protected View mProfileView;
protected ResolverDrawerLayout mResolverDrawerLayout;
+ private TabHost mTabHost;
+ private ResolverViewPager mViewPager;
protected ChooserMultiProfilePagerAdapter mChooserMultiProfilePagerAdapter;
protected final LatencyTracker mLatencyTracker = getLatencyTracker();
@@ -306,8 +308,6 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
private final EnterTransitionAnimationDelegate mEnterTransitionAnimationDelegate =
new EnterTransitionAnimationDelegate(this, () -> mResolverDrawerLayout);
- private final View mContentView = null;
-
private final Map<Integer, ProfileRecord> mProfileRecords = new HashMap<>();
private boolean mExcludeSharedText = false;
@@ -346,6 +346,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mChooserHelper.setInitializer(this::initialize);
if (mChooserServiceFeatureFlags.chooserPayloadToggling()) {
mChooserHelper.setOnChooserRequestChanged(this::onChooserRequestChanged);
+ mChooserHelper.setOnPendingSelection(this::onPendingSelection);
}
}
@@ -407,9 +408,8 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
@Override
protected final void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- ViewPager viewPager = findViewById(com.android.internal.R.id.profile_pager);
- if (viewPager != null) {
- outState.putInt(LAST_SHOWN_TAB_KEY, viewPager.getCurrentItem());
+ if (mViewPager != null) {
+ outState.putInt(LAST_SHOWN_TAB_KEY, mViewPager.getCurrentItem());
}
}
@@ -507,8 +507,9 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mProfiles,
mProfileAvailability,
mRequest.getInitialIntents(),
- mMaxTargetsPerRow,
- mFeatureFlags);
+ mMaxTargetsPerRow);
+
+ maybeDisableRecentsScreenshot(mProfiles, mProfileAvailability);
if (!configureContentView(mTargetDataLoader)) {
mPersonalPackageMonitor = createPackageMonitor(
@@ -643,9 +644,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mRequest.getMetadataText(),
mChooserServiceFeatureFlags.chooserPayloadToggling());
updateStickyContentPreview();
- if (shouldShowStickyContentPreview()
- || mChooserMultiProfilePagerAdapter
- .getCurrentRootAdapter().getSystemRowCount() != 0) {
+ if (shouldShowStickyContentPreview()) {
getEventLog().logActionShareWithPreview(
mChooserContentPreviewUi.getPreferredContentPreview());
}
@@ -680,8 +679,22 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
Tracer.INSTANCE.markLaunched();
}
+ private void maybeDisableRecentsScreenshot(
+ ProfileHelper profileHelper, ProfileAvailability profileAvailability) {
+ for (Profile profile : profileHelper.getProfiles()) {
+ if (profile.getType() == Profile.Type.PRIVATE) {
+ if (profileAvailability.isAvailable(profile)) {
+ // Show blank screen in Recent preview if private profile is available
+ // to not leak its presence.
+ setRecentsScreenshotEnabled(false);
+ }
+ return;
+ }
+ }
+ }
+
private void onChooserRequestChanged(ChooserRequest chooserRequest) {
- // intentional reference comarison
+ // intentional reference comparison
if (mRequest == chooserRequest) {
return;
}
@@ -691,6 +704,23 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mChooserContentPreviewUi.updateModifyShareAction();
if (recreateAdapters) {
recreatePagerAdapter();
+ } else {
+ setTabsViewEnabled(true);
+ }
+ }
+
+ private void onPendingSelection() {
+ setTabsViewEnabled(false);
+ }
+
+ private void onAppTargetsLoaded(ResolverListAdapter listAdapter) {
+ if (mChooserMultiProfilePagerAdapter == null) {
+ return;
+ }
+ if (!isProfilePagerAdapterAttached()
+ && listAdapter == mChooserMultiProfilePagerAdapter.getActiveListAdapter()) {
+ mChooserMultiProfilePagerAdapter.setupViewPager(mViewPager);
+ setTabsViewEnabled(true);
}
}
@@ -731,9 +761,12 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mRequest.getShareTargetFilter()
);
+ int currentPage = mChooserMultiProfilePagerAdapter.getCurrentPage();
if (mChooserMultiProfilePagerAdapter != null) {
mChooserMultiProfilePagerAdapter.destroy();
}
+ // Update the pager adapter but do not attach it to the view till the targets are reloaded,
+ // see onChooserAppTargetsLoaded method.
mChooserMultiProfilePagerAdapter = createMultiProfilePagerAdapter(
/* context = */ this,
mProfilePagerResources,
@@ -741,10 +774,8 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mProfiles,
mProfileAvailability,
mRequest.getInitialIntents(),
- mMaxTargetsPerRow,
- mFeatureFlags);
- mChooserMultiProfilePagerAdapter.setupViewPager(
- requireViewById(com.android.internal.R.id.profile_pager));
+ mMaxTargetsPerRow);
+ mChooserMultiProfilePagerAdapter.setCurrentPage(currentPage);
if (mPersonalPackageMonitor != null) {
mPersonalPackageMonitor.unregister();
}
@@ -769,15 +800,25 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
}
postRebuildList(
mChooserMultiProfilePagerAdapter.rebuildTabs(
- mProfiles.getWorkProfilePresent()
- || mProfiles.getPrivateProfilePresent()));
+ mProfiles.getWorkProfilePresent() || mProfiles.getPrivateProfilePresent()));
+ setTabsViewEnabled(false);
+ }
+
+ private void setTabsViewEnabled(boolean isEnabled) {
+ TabWidget tabs = mTabHost.getTabWidget();
+ if (tabs != null) {
+ tabs.setEnabled(isEnabled);
+ }
+ View tabContent = mTabHost.findViewById(com.android.internal.R.id.profile_pager);
+ if (tabContent != null) {
+ tabContent.setEnabled(isEnabled);
+ }
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
- ViewPager viewPager = findViewById(com.android.internal.R.id.profile_pager);
- if (viewPager != null) {
- viewPager.setCurrentItem(savedInstanceState.getInt(LAST_SHOWN_TAB_KEY));
+ if (mViewPager != null) {
+ mViewPager.setCurrentItem(savedInstanceState.getInt(LAST_SHOWN_TAB_KEY));
}
mChooserMultiProfilePagerAdapter.clearInactiveProfileCache();
}
@@ -1084,11 +1125,10 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
getMetricsCategory());
EmptyStateProvider noAppsEmptyStateProvider = new NoAppsAvailableEmptyStateProvider(
- this,
- profileHelper.getWorkHandle(),
- profileHelper.getPersonalHandle(),
+ mProfiles,
+ mProfileAvailability,
getMetricsCategory(),
- profileHelper.getTabOwnerUserHandleForLaunch()
+ mProfilePagerResources
);
// Return composite provider, the order matters (the higher, the more priority)
@@ -1196,13 +1236,12 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
boolean rebuildCompleted = mChooserMultiProfilePagerAdapter.rebuildTabs(
mProfiles.getWorkProfilePresent());
- mLayoutId = mFeatureFlags.scrollablePreview()
- ? R.layout.chooser_grid_scrollable_preview
- : R.layout.chooser_grid;
+ mLayoutId = R.layout.chooser_grid_scrollable_preview;
setContentView(mLayoutId);
- mChooserMultiProfilePagerAdapter.setupViewPager(
- requireViewById(com.android.internal.R.id.profile_pager));
+ mTabHost = findViewById(com.android.internal.R.id.profile_tabhost);
+ mViewPager = requireViewById(com.android.internal.R.id.profile_pager);
+ mChooserMultiProfilePagerAdapter.setupViewPager(mViewPager);
boolean result = postRebuildList(rebuildCompleted);
Trace.endSection();
return result;
@@ -1269,16 +1308,13 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
}
private void setupProfileTabs() {
- TabHost tabHost = findViewById(com.android.internal.R.id.profile_tabhost);
- ViewPager viewPager = findViewById(com.android.internal.R.id.profile_pager);
-
mChooserMultiProfilePagerAdapter.setupProfileTabs(
getLayoutInflater(),
- tabHost,
- viewPager,
+ mTabHost,
+ mViewPager,
R.layout.resolver_profile_tab_button,
com.android.internal.R.id.profile_pager,
- () -> onProfileTabSelected(viewPager.getCurrentItem()),
+ () -> onProfileTabSelected(mViewPager.getCurrentItem()),
new OnProfileSelectedListener() {
@Override
public void onProfilePageSelected(@ProfileType int profileId, int pageNumber) {}
@@ -1289,8 +1325,8 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
}
});
mOnSwitchOnWorkSelectedListener = () -> {
- View workTab = tabHost.getTabWidget().getChildAt(
- mChooserMultiProfilePagerAdapter.getPageNumberForProfile(PROFILE_WORK));
+ View workTab = mTabHost.getTabWidget().getChildAt(
+ mChooserMultiProfilePagerAdapter.getPageNumberForProfile(PROFILE_WORK));
workTab.setFocusable(true);
workTab.setFocusableInTouchMode(true);
workTab.requestFocus();
@@ -1369,8 +1405,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mProfiles,
mProfileAvailability,
mRequest.getInitialIntents(),
- mMaxTargetsPerRow,
- mFeatureFlags);
+ mMaxTargetsPerRow);
}
private ChooserMultiProfilePagerAdapter createMultiProfilePagerAdapter(
@@ -1380,8 +1415,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
ProfileHelper profileHelper,
ProfileAvailability profileAvailability,
List<Intent> initialIntents,
- int maxTargetsPerRow,
- FeatureFlags featureFlags) {
+ int maxTargetsPerRow) {
Log.d(TAG, "createMultiProfilePagerAdapter");
Profile launchedAs = profileHelper.getLaunchedAsProfile();
@@ -1425,8 +1459,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
launchedAs.getType().ordinal(),
profileHelper.getWorkHandle(),
profileHelper.getCloneHandle(),
- maxTargetsPerRow,
- featureFlags);
+ maxTargetsPerRow);
}
protected EmptyStateProvider createBlockerEmptyStateProvider() {
@@ -1520,9 +1553,8 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
mResolverDrawerLayout.setPadding(mSystemWindowInsets.left, mSystemWindowInsets.top,
mSystemWindowInsets.right, 0);
}
- ViewPager viewPager = findViewById(com.android.internal.R.id.profile_pager);
- if (viewPager.isLayoutRtl()) {
- mChooserMultiProfilePagerAdapter.setupViewPager(viewPager);
+ if (mViewPager.isLayoutRtl()) {
+ mChooserMultiProfilePagerAdapter.setupViewPager(mViewPager);
}
mShouldDisplayLandscape = shouldDisplayLandscape(newConfig.orientation);
@@ -1584,9 +1616,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
getResources(),
getLayoutInflater(),
parent,
- mFeatureFlags.scrollablePreview()
- ? findViewById(R.id.chooser_headline_row_container)
- : null);
+ requireViewById(R.id.chooser_headline_row_container));
if (layout != null) {
adjustPreviewWidth(getResources().getConfiguration().orientation, layout);
@@ -1994,16 +2024,6 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
context,
new ChooserGridAdapter.ChooserActivityDelegate() {
@Override
- public boolean shouldShowTabs() {
- return mProfiles.getWorkProfilePresent();
- }
-
- @Override
- public View buildContentPreview(ViewGroup parent) {
- return createContentPreviewView(parent);
- }
-
- @Override
public void onTargetSelected(int itemIndex) {
startSelected(itemIndex, false, true);
}
@@ -2242,7 +2262,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
*/
private void handleLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
int oldTop, int oldRight, int oldBottom) {
- if (mChooserMultiProfilePagerAdapter == null) {
+ if (mChooserMultiProfilePagerAdapter == null || !isProfilePagerAdapterAttached()) {
return;
}
RecyclerView recyclerView = mChooserMultiProfilePagerAdapter.getActiveAdapterView();
@@ -2303,8 +2323,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
int top, int bottom, RecyclerView recyclerView, ChooserGridAdapter gridAdapter) {
int offset = mSystemWindowInsets != null ? mSystemWindowInsets.bottom : 0;
- int rowsToShow = gridAdapter.getSystemRowCount()
- + gridAdapter.getServiceTargetRowCount()
+ int rowsToShow = gridAdapter.getServiceTargetRowCount()
+ gridAdapter.getCallerAndRankedTargetRowCount();
// then this is most likely not a SEND_* action, so check
@@ -2359,6 +2378,10 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
return Math.min(offset, bottom - top);
}
+ private boolean isProfilePagerAdapterAttached() {
+ return mChooserMultiProfilePagerAdapter == mViewPager.getAdapter();
+ }
+
/**
* If we have a tabbed view and are showing 1 row in the current profile and an empty
* state screen in another profile, to prevent cropping of the empty state screen we show
@@ -2386,9 +2409,17 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
//TODO: move this block inside ChooserListAdapter (should be called when
// ResolverListAdapter#mPostListReadyRunnable is executed.
if (chooserListAdapter.getDisplayResolveInfoCount() == 0) {
+ if (rebuildComplete && mChooserServiceFeatureFlags.chooserPayloadToggling()) {
+ onAppTargetsLoaded(listAdapter);
+ }
chooserListAdapter.notifyDataSetChanged();
} else {
- chooserListAdapter.updateAlphabeticalList();
+ if (mChooserServiceFeatureFlags.chooserPayloadToggling()) {
+ chooserListAdapter.updateAlphabeticalList(
+ () -> onAppTargetsLoaded(listAdapter));
+ } else {
+ chooserListAdapter.updateAlphabeticalList();
+ }
}
if (rebuildComplete) {
@@ -2530,8 +2561,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
ResolverListAdapter adapter = mChooserMultiProfilePagerAdapter.getListAdapterForUserHandle(
UserHandle.of(UserHandle.myUserId()));
boolean isEmpty = adapter == null || adapter.getCount() == 0;
- return (mFeatureFlags.scrollablePreview() || mProfiles.getWorkProfilePresent())
- && (!isEmpty || shouldShowContentPreviewWhenEmpty());
+ return !isEmpty || shouldShowContentPreviewWhenEmpty();
}
/**
@@ -2632,8 +2662,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
}
private void setHorizontalScrollingEnabled(boolean enabled) {
- ResolverViewPager viewPager = findViewById(com.android.internal.R.id.profile_pager);
- viewPager.setSwipingEnabled(enabled);
+ mViewPager.setSwipingEnabled(enabled);
}
private void setVerticalScrollEnabled(boolean enabled) {
diff --git a/java/src/com/android/intentresolver/ChooserHelper.kt b/java/src/com/android/intentresolver/ChooserHelper.kt
index 25c2b40f..6317ee1d 100644
--- a/java/src/com/android/intentresolver/ChooserHelper.kt
+++ b/java/src/com/android/intentresolver/ChooserHelper.kt
@@ -28,9 +28,8 @@ import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.android.intentresolver.annotation.JavaInterop
import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.ActivityResultRepository
+import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.PendingSelectionCallbackRepository
import com.android.intentresolver.data.model.ChooserRequest
-import com.android.intentresolver.domain.interactor.UserInteractor
-import com.android.intentresolver.inject.Background
import com.android.intentresolver.ui.viewmodel.ChooserViewModel
import com.android.intentresolver.validation.Invalid
import com.android.intentresolver.validation.Valid
@@ -38,9 +37,13 @@ import com.android.intentresolver.validation.log
import dagger.hilt.android.scopes.ActivityScoped
import java.util.function.Consumer
import javax.inject.Inject
-import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
private const val TAG: String = "ChooserHelper"
@@ -79,17 +82,19 @@ class ChooserHelper
@Inject
constructor(
hostActivity: Activity,
- private val userInteractor: UserInteractor,
private val activityResultRepo: ActivityResultRepository,
- @Background private val background: CoroutineDispatcher,
+ private val pendingSelectionCallbackRepo: PendingSelectionCallbackRepository,
) : DefaultLifecycleObserver {
// This is guaranteed by Hilt, since only a ComponentActivity is injectable.
private val activity: ComponentActivity = hostActivity as ComponentActivity
private val viewModel by activity.viewModels<ChooserViewModel>()
+ // TODO: provide the following through an init object passed into [setInitialize]
private lateinit var activityInitializer: Runnable
-
+ /** Invoked when there are updates to ChooserRequest */
var onChooserRequestChanged: Consumer<ChooserRequest> = Consumer {}
+ /** Invoked when there are a new change to payload selection */
+ var onPendingSelection: Runnable = Runnable {}
init {
activity.lifecycle.addObserver(this)
@@ -130,8 +135,25 @@ constructor(
}
activity.lifecycleScope.launch {
+ val hasPendingCallbackFlow =
+ pendingSelectionCallbackRepo.pendingTargetIntent
+ .map { it != null }
+ .distinctUntilChanged()
+ .onEach { hasPendingCallback ->
+ if (hasPendingCallback) {
+ onPendingSelection.run()
+ }
+ }
activity.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
- viewModel.request.collect { onChooserRequestChanged.accept(it) }
+ viewModel.request
+ .combine(hasPendingCallbackFlow) { request, hasPendingCallback ->
+ request to hasPendingCallback
+ }
+ // only take ChooserRequest if there are no pending callbacks
+ .filter { !it.second }
+ .map { it.first }
+ .distinctUntilChanged(areEquivalent = { old, new -> old === new })
+ .collect { onChooserRequestChanged.accept(it) }
}
}
}
diff --git a/java/src/com/android/intentresolver/ChooserListAdapter.java b/java/src/com/android/intentresolver/ChooserListAdapter.java
index e8d4fdde..29b5698b 100644
--- a/java/src/com/android/intentresolver/ChooserListAdapter.java
+++ b/java/src/com/android/intentresolver/ChooserListAdapter.java
@@ -347,9 +347,16 @@ public class ChooserListAdapter extends ResolverListAdapter {
false);
}
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ notifyDataSetChanged();
+ }
+
@VisibleForTesting
@Override
public void onBindView(View view, TargetInfo info, int position) {
+ view.setEnabled(!isDestroyed());
final ViewHolder holder = (ViewHolder) view.getTag();
resetViewHolder(holder);
@@ -478,7 +485,17 @@ public class ChooserListAdapter extends ResolverListAdapter {
}
}
+ /**
+ * Group application targets
+ */
public void updateAlphabeticalList() {
+ updateAlphabeticalList(() -> {});
+ }
+
+ /**
+ * Group application targets
+ */
+ public void updateAlphabeticalList(Runnable onCompleted) {
final DisplayResolveInfoAzInfoComparator
comparator = new DisplayResolveInfoAzInfoComparator(mContext);
final List<DisplayResolveInfo> allTargets = new ArrayList<>();
@@ -523,6 +540,7 @@ public class ChooserListAdapter extends ResolverListAdapter {
mSortedList.clear();
mSortedList.addAll(newList);
notifyDataSetChanged();
+ onCompleted.run();
}
private void loadMissingLabels(List<DisplayResolveInfo> targets) {
diff --git a/java/src/com/android/intentresolver/ProfileAvailability.kt b/java/src/com/android/intentresolver/ProfileAvailability.kt
index cf3e566e..c8e78552 100644
--- a/java/src/com/android/intentresolver/ProfileAvailability.kt
+++ b/java/src/com/android/intentresolver/ProfileAvailability.kt
@@ -53,6 +53,24 @@ class ProfileAvailability(
}
}
+ /**
+ * The number of profiles which are visible. All profiles count except for private which is
+ * hidden when locked.
+ */
+ fun visibleProfileCount() =
+ runBlocking(background) {
+ val availability = userInteractor.availability.first()
+ val profiles = userInteractor.profiles.first()
+ profiles
+ .filter {
+ when (it.type) {
+ Profile.Type.PRIVATE -> availability[it] == true
+ else -> true
+ }
+ }
+ .size
+ }
+
/** Used by WorkProfilePausedEmptyStateProvider */
fun requestQuietModeState(profile: Profile, quietMode: Boolean) {
val enableProfile = !quietMode
diff --git a/java/src/com/android/intentresolver/ResolverActivity.java b/java/src/com/android/intentresolver/ResolverActivity.java
index 2f1f8ee5..4e763f94 100644
--- a/java/src/com/android/intentresolver/ResolverActivity.java
+++ b/java/src/com/android/intentresolver/ResolverActivity.java
@@ -112,6 +112,7 @@ import com.android.intentresolver.profiles.ResolverMultiProfilePagerAdapter;
import com.android.intentresolver.profiles.TabConfig;
import com.android.intentresolver.shared.model.Profile;
import com.android.intentresolver.ui.ActionTitle;
+import com.android.intentresolver.ui.ProfilePagerResources;
import com.android.intentresolver.ui.model.ActivityModel;
import com.android.intentresolver.ui.model.ResolverRequest;
import com.android.intentresolver.ui.viewmodel.ResolverViewModel;
@@ -153,6 +154,7 @@ public class ResolverActivity extends Hilt_ResolverActivity implements
@Inject public ResolverHelper mResolverHelper;
@Inject public PackageManager mPackageManager;
@Inject public DevicePolicyResources mDevicePolicyResources;
+ @Inject public ProfilePagerResources mProfilePagerResources;
@Inject public IntentForwarding mIntentForwarding;
@Inject public FeatureFlags mFeatureFlags;
@@ -963,12 +965,11 @@ public class ResolverActivity extends Hilt_ResolverActivity implements
},
getMetricsCategory());
- final EmptyStateProvider noAppsEmptyStateProvider = new NoAppsAvailableEmptyStateProvider(
- this,
- workProfileUserHandle,
- mProfiles.getPersonalHandle(),
+ EmptyStateProvider noAppsEmptyStateProvider = new NoAppsAvailableEmptyStateProvider(
+ mProfiles,
+ mProfileAvailability,
getMetricsCategory(),
- mProfiles.getTabOwnerUserHandleForLaunch()
+ mProfilePagerResources
);
// Return composite provider, the order matters (the higher, the more priority)
diff --git a/java/src/com/android/intentresolver/ResolverListAdapter.java b/java/src/com/android/intentresolver/ResolverListAdapter.java
index 80d07d2c..2a8fcfa4 100644
--- a/java/src/com/android/intentresolver/ResolverListAdapter.java
+++ b/java/src/com/android/intentresolver/ResolverListAdapter.java
@@ -448,6 +448,9 @@ public class ResolverListAdapter extends BaseAdapter {
// Send an "incomplete" list-ready while the async task is running.
postListReadyRunnable(doPostProcessing, /* rebuildCompleted */ false);
mBgExecutor.execute(() -> {
+ if (isDestroyed()) {
+ return;
+ }
List<ResolvedComponentInfo> sortedComponents = null;
//TODO: the try-catch logic here is to formally match the AsyncTask's behavior.
// Empirically, we don't need it as in the case on an exception, the app will crash and
@@ -785,6 +788,10 @@ public class ResolverListAdapter extends BaseAdapter {
mRequestedLabels.clear();
}
+ public final boolean isDestroyed() {
+ return mDestroyed.get();
+ }
+
private static ColorMatrixColorFilter getSuspendedColorMatrix() {
if (sSuspendedMatrixColorFilter == null) {
@@ -833,7 +840,7 @@ public class ResolverListAdapter extends BaseAdapter {
userHandle);
}
- public final List<Intent> getIntents() {
+ public List<Intent> getIntents() {
// TODO: immutable copy?
return mIntents;
}
diff --git a/java/src/com/android/intentresolver/ResolverViewPager.java b/java/src/com/android/intentresolver/ResolverViewPager.java
index 0496579d..891ace87 100644
--- a/java/src/com/android/intentresolver/ResolverViewPager.java
+++ b/java/src/com/android/intentresolver/ResolverViewPager.java
@@ -75,6 +75,12 @@ public class ResolverViewPager extends ViewPager {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
- return !isLayoutRtl() && mSwipingEnabled && super.onInterceptTouchEvent(ev);
+ return !isEnabled()
+ || (!isLayoutRtl() && mSwipingEnabled && super.onInterceptTouchEvent(ev));
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ return isEnabled() && super.onTouchEvent(ev);
}
}
diff --git a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
index 4cb30341..4b955c49 100644
--- a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
@@ -97,7 +97,6 @@ public final class ChooserContentPreviewUi {
@VisibleForTesting
final ContentPreviewUi mContentPreviewUi;
private final Supplier</*@Nullable*/ActionRow.Action> mModifyShareActionFactory;
- @Nullable
private View mHeadlineParent;
public ChooserContentPreviewUi(
@@ -226,15 +225,12 @@ public final class ChooserContentPreviewUi {
Resources resources,
LayoutInflater layoutInflater,
ViewGroup parent,
- @Nullable View headlineViewParent) {
+ View headlineViewParent) {
ViewGroup layout =
mContentPreviewUi.display(resources, layoutInflater, parent, headlineViewParent);
- mHeadlineParent = headlineViewParent == null ? layout : headlineViewParent;
- if (mHeadlineParent != null) {
- ContentPreviewUi.displayModifyShareAction(
- mHeadlineParent, mModifyShareActionFactory.get());
- }
+ mHeadlineParent = headlineViewParent;
+ ContentPreviewUi.displayModifyShareAction(mHeadlineParent, mModifyShareActionFactory.get());
return layout;
}
@@ -242,10 +238,7 @@ public final class ChooserContentPreviewUi {
* Update Modify Share Action, if it is inflated.
*/
public void updateModifyShareAction() {
- if (mHeadlineParent != null) {
- ContentPreviewUi.displayModifyShareAction(
- mHeadlineParent, mModifyShareActionFactory.get());
- }
+ ContentPreviewUi.displayModifyShareAction(mHeadlineParent, mModifyShareActionFactory.get());
}
private static TextContentPreviewUi createTextPreview(
diff --git a/java/src/com/android/intentresolver/contentpreview/ContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ContentPreviewUi.java
index 71d5fc0b..8eaf3568 100644
--- a/java/src/com/android/intentresolver/contentpreview/ContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/ContentPreviewUi.java
@@ -48,7 +48,7 @@ public abstract class ContentPreviewUi {
Resources resources,
LayoutInflater layoutInflater,
ViewGroup parent,
- @Nullable View headlineViewParent);
+ View headlineViewParent);
protected static void updateViewWithImage(ImageView imageView, Bitmap image) {
if (image == null) {
diff --git a/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
index d127d929..1749c6f7 100644
--- a/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
@@ -76,7 +76,7 @@ class FileContentPreviewUi extends ContentPreviewUi {
Resources resources,
LayoutInflater layoutInflater,
ViewGroup parent,
- @Nullable View headlineViewParent) {
+ View headlineViewParent) {
return displayInternal(resources, layoutInflater, parent, headlineViewParent);
}
@@ -84,12 +84,9 @@ class FileContentPreviewUi extends ContentPreviewUi {
Resources resources,
LayoutInflater layoutInflater,
ViewGroup parent,
- @Nullable View headlineViewParent) {
+ View headlineViewParent) {
mContentPreview = (ViewGroup) layoutInflater.inflate(
R.layout.chooser_grid_preview_file, parent, false);
- if (headlineViewParent == null) {
- headlineViewParent = mContentPreview;
- }
inflateHeadline(headlineViewParent);
displayHeadline(headlineViewParent, mHeadlineGenerator.getFilesHeadline(mFileCount));
diff --git a/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java
index 0367e9d5..b50f5bc8 100644
--- a/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java
@@ -108,7 +108,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi {
Resources resources,
LayoutInflater layoutInflater,
ViewGroup parent,
- @Nullable View headlineViewParent) {
+ View headlineViewParent) {
return displayInternal(layoutInflater, parent, headlineViewParent);
}
@@ -133,10 +133,10 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi {
private ViewGroup displayInternal(
LayoutInflater layoutInflater,
ViewGroup parent,
- @Nullable View headlineViewParent) {
+ View headlineViewParent) {
mContentPreviewView = (ViewGroup) layoutInflater.inflate(
R.layout.chooser_grid_preview_files_text, parent, false);
- mHeadliveView = headlineViewParent == null ? mContentPreviewView : headlineViewParent;
+ mHeadliveView = headlineViewParent;
inflateHeadline(mHeadliveView);
final ActionRow actionRow =
diff --git a/java/src/com/android/intentresolver/contentpreview/NoContextPreviewUi.kt b/java/src/com/android/intentresolver/contentpreview/NoContextPreviewUi.kt
index 31a7006c..924e6499 100644
--- a/java/src/com/android/intentresolver/contentpreview/NoContextPreviewUi.kt
+++ b/java/src/com/android/intentresolver/contentpreview/NoContextPreviewUi.kt
@@ -29,7 +29,7 @@ internal class NoContextPreviewUi(private val type: Int) : ContentPreviewUi() {
resources: Resources?,
layoutInflater: LayoutInflater?,
parent: ViewGroup?,
- headlineViewParent: View?,
+ headlineViewParent: View,
): ViewGroup? {
Log.e(TAG, "Unexpected content preview type: $type")
return null
diff --git a/java/src/com/android/intentresolver/contentpreview/ShareouselContentPreviewUi.kt b/java/src/com/android/intentresolver/contentpreview/ShareouselContentPreviewUi.kt
index 5fce711c..57a51239 100644
--- a/java/src/com/android/intentresolver/contentpreview/ShareouselContentPreviewUi.kt
+++ b/java/src/com/android/intentresolver/contentpreview/ShareouselContentPreviewUi.kt
@@ -45,21 +45,17 @@ class ShareouselContentPreviewUi : ContentPreviewUi() {
resources: Resources,
layoutInflater: LayoutInflater,
parent: ViewGroup,
- headlineViewParent: View?,
+ headlineViewParent: View,
): ViewGroup = displayInternal(parent, headlineViewParent)
- private fun displayInternal(parent: ViewGroup, headlineViewParent: View?): ViewGroup {
- if (headlineViewParent != null) {
- inflateHeadline(headlineViewParent)
- }
+ private fun displayInternal(parent: ViewGroup, headlineViewParent: View): ViewGroup {
+ inflateHeadline(headlineViewParent)
return ComposeView(parent.context).apply {
setContent {
val vm: ChooserViewModel = viewModel()
val viewModel: ShareouselViewModel = vm.shareouselViewModel
- headlineViewParent?.let {
- LaunchedEffect(viewModel) { bindHeader(viewModel, headlineViewParent) }
- }
+ LaunchedEffect(viewModel) { bindHeader(viewModel, headlineViewParent) }
MaterialTheme(
colorScheme =
diff --git a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
index a7ae81b0..ae7ddcd9 100644
--- a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
@@ -82,19 +82,16 @@ class TextContentPreviewUi extends ContentPreviewUi {
Resources resources,
LayoutInflater layoutInflater,
ViewGroup parent,
- @Nullable View headlineViewParent) {
+ View headlineViewParent) {
return displayInternal(layoutInflater, parent, headlineViewParent);
}
private ViewGroup displayInternal(
LayoutInflater layoutInflater,
ViewGroup parent,
- @Nullable View headlineViewParent) {
+ View headlineViewParent) {
ViewGroup contentPreviewLayout = (ViewGroup) layoutInflater.inflate(
R.layout.chooser_grid_preview_text, parent, false);
- if (headlineViewParent == null) {
- headlineViewParent = contentPreviewLayout;
- }
inflateHeadline(headlineViewParent);
final ActionRow actionRow =
diff --git a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
index 77252112..88311016 100644
--- a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
@@ -54,7 +54,6 @@ class UnifiedContentPreviewUi extends ContentPreviewUi {
private List<FileInfo> mFiles;
@Nullable
private ViewGroup mContentPreviewView;
- @Nullable
private View mHeadlineView;
UnifiedContentPreviewUi(
@@ -93,7 +92,7 @@ class UnifiedContentPreviewUi extends ContentPreviewUi {
Resources resources,
LayoutInflater layoutInflater,
ViewGroup parent,
- @Nullable View headlineViewParent) {
+ View headlineViewParent) {
return displayInternal(layoutInflater, parent, headlineViewParent);
}
@@ -109,10 +108,10 @@ class UnifiedContentPreviewUi extends ContentPreviewUi {
}
private ViewGroup displayInternal(
- LayoutInflater layoutInflater, ViewGroup parent, @Nullable View headlineViewParent) {
+ LayoutInflater layoutInflater, ViewGroup parent, View headlineViewParent) {
mContentPreviewView = (ViewGroup) layoutInflater.inflate(
R.layout.chooser_grid_preview_image, parent, false);
- mHeadlineView = headlineViewParent == null ? mContentPreviewView : headlineViewParent;
+ mHeadlineView = headlineViewParent;
inflateHeadline(mHeadlineView);
final ActionRow actionRow =
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/ProcessTargetIntentUpdatesInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/ProcessTargetIntentUpdatesInteractor.kt
index 04416a3d..c202eabf 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/ProcessTargetIntentUpdatesInteractor.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/ProcessTargetIntentUpdatesInteractor.kt
@@ -34,7 +34,7 @@ constructor(
repository.pendingTargetIntent.collectLatest { targetIntent ->
targetIntent ?: return@collectLatest
selectionCallback.onSelectionChanged(targetIntent)?.let { update ->
- chooserRequestInteractor.applyUpdate(update)
+ chooserRequestInteractor.applyUpdate(targetIntent, update)
}
repository.pendingTargetIntent.compareAndSet(targetIntent, null)
}
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractor.kt
index 941dfca1..dd16f0c1 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractor.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractor.kt
@@ -34,9 +34,10 @@ constructor(
private val repository: ChooserRequestRepository,
@CustomAction private val pendingIntentSender: PendingIntentSender,
) {
- fun applyUpdate(update: ShareouselUpdate) {
+ fun applyUpdate(targetIntent: Intent, update: ShareouselUpdate) {
repository.chooserRequest.update { current ->
current.copy(
+ targetIntent = targetIntent,
callerChooserTargets =
update.callerTargets.getOrDefault(current.callerChooserTargets),
modifyShareAction =
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateTargetIntentInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateTargetIntentInteractor.kt
index 429e34e9..d99d69ab 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateTargetIntentInteractor.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateTargetIntentInteractor.kt
@@ -31,7 +31,7 @@ constructor(
* sharing application, so that it can react to the new intent.
*/
fun updateTargetIntent(targetIntent: Intent) {
- chooserRequestInteractor.setTargetIntent(targetIntent)
repository.pendingTargetIntent.value = targetIntent
+ chooserRequestInteractor.setTargetIntent(targetIntent)
}
}
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ComposeIconComposable.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ComposeIconComposable.kt
index 38138225..8cf237da 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ComposeIconComposable.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ComposeIconComposable.kt
@@ -22,6 +22,7 @@ import androidx.compose.foundation.Image
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
@@ -31,11 +32,16 @@ import com.android.intentresolver.icon.ComposeIcon
import com.android.intentresolver.icon.ResourceIcon
@Composable
-fun Image(icon: ComposeIcon, modifier: Modifier = Modifier) {
+fun Image(icon: ComposeIcon, modifier: Modifier = Modifier, colorFilter: ColorFilter? = null) {
when (icon) {
- is AdaptiveIcon -> Image(icon.wrapped, modifier)
+ is AdaptiveIcon -> Image(icon.wrapped, modifier, colorFilter = colorFilter)
is BitmapIcon ->
- Image(icon.bitmap.asImageBitmap(), contentDescription = null, modifier = modifier)
+ Image(
+ icon.bitmap.asImageBitmap(),
+ contentDescription = null,
+ modifier = modifier,
+ colorFilter = colorFilter
+ )
is ResourceIcon -> {
val localContext = LocalContext.current
val wrappedContext: Context =
@@ -43,7 +49,12 @@ fun Image(icon: ComposeIcon, modifier: Modifier = Modifier) {
override fun getResources(): Resources = icon.res
}
CompositionLocalProvider(LocalContext provides wrappedContext) {
- Image(painterResource(icon.resId), contentDescription = null, modifier = modifier)
+ Image(
+ painterResource(icon.resId),
+ contentDescription = null,
+ modifier = modifier,
+ colorFilter = colorFilter
+ )
}
}
}
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 7558d994..0a431c2a 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
@@ -36,6 +36,8 @@ import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.AssistChip
+import androidx.compose.material3.AssistChipDefaults
+import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -43,8 +45,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.dimensionResource
@@ -65,6 +66,7 @@ fun Shareousel(viewModel: ShareouselViewModel) {
} else {
Spacer(
Modifier.height(dimensionResource(R.dimen.chooser_preview_image_height_tall) + 64.dp)
+ .background(MaterialTheme.colorScheme.surfaceContainer)
)
}
}
@@ -127,12 +129,7 @@ private fun ShareouselCard(viewModel: ShareouselPreviewViewModel) {
}
?: run {
// TODO: look at ScrollableImagePreviewView.setLoading()
- Box(
- modifier =
- Modifier.fillMaxHeight()
- .aspectRatio(2f / 5f)
- .border(1.dp, Color.Red, RectangleShape)
- )
+ Box(modifier = Modifier.fillMaxHeight().aspectRatio(2f / 5f))
}
},
contentType = contentType,
@@ -167,7 +164,13 @@ private fun ActionCarousel(viewModel: ShareouselViewModel) {
label = actionViewModel.label,
onClick = { actionViewModel.onClicked() },
) {
- actionViewModel.icon?.let { Image(icon = it, modifier = Modifier.size(16.dp)) }
+ actionViewModel.icon?.let {
+ Image(
+ icon = it,
+ modifier = Modifier.size(16.dp),
+ colorFilter = ColorFilter.tint(LocalContentColor.current)
+ )
+ }
}
if (idx == actions.size - 1) {
Spacer(Modifier.width(dimensionResource(R.dimen.chooser_edge_margin_normal)))
@@ -188,7 +191,15 @@ private fun ShareouselAction(
onClick = onClick,
label = { Text(label) },
leadingIcon = leadingIcon,
- modifier = modifier
+ border = null,
+ shape = RoundedCornerShape(1000.dp), // pill shape.
+ colors =
+ AssistChipDefaults.assistChipColors(
+ containerColor = MaterialTheme.colorScheme.surfaceContainerHigh,
+ labelColor = MaterialTheme.colorScheme.onSurface,
+ leadingIconContentColor = MaterialTheme.colorScheme.onSurface
+ ),
+ modifier = modifier,
)
}
diff --git a/java/src/com/android/intentresolver/data/repository/DevicePolicyResources.kt b/java/src/com/android/intentresolver/data/repository/DevicePolicyResources.kt
index c396b720..75faa068 100644
--- a/java/src/com/android/intentresolver/data/repository/DevicePolicyResources.kt
+++ b/java/src/com/android/intentresolver/data/repository/DevicePolicyResources.kt
@@ -18,6 +18,9 @@ package com.android.intentresolver.data.repository
import android.app.admin.DevicePolicyManager
import android.app.admin.DevicePolicyResources.Strings.Core.FORWARD_INTENT_TO_PERSONAL
import android.app.admin.DevicePolicyResources.Strings.Core.FORWARD_INTENT_TO_WORK
+import android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_CROSS_PROFILE_BLOCKED_TITLE
+import android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_NO_PERSONAL_APPS
+import android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_NO_WORK_APPS
import android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_PERSONAL_TAB
import android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_PERSONAL_TAB_ACCESSIBILITY
import android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_WORK_PROFILE_NOT_SUPPORTED
@@ -83,6 +86,46 @@ constructor(
)
}
+ val noPersonalApps by lazy {
+ requireNotNull(
+ policyResources.getString(RESOLVER_NO_PERSONAL_APPS) {
+ resources.getString(R.string.resolver_no_personal_apps_available)
+ }
+ )
+ }
+
+ val noWorkApps by lazy {
+ requireNotNull(
+ policyResources.getString(RESOLVER_NO_WORK_APPS) {
+ resources.getString(R.string.resolver_no_work_apps_available)
+ }
+ )
+ }
+
+ val crossProfileBlocked by lazy {
+ requireNotNull(
+ policyResources.getString(RESOLVER_CROSS_PROFILE_BLOCKED_TITLE) {
+ resources.getString(R.string.resolver_cross_profile_blocked)
+ }
+ )
+ }
+
+ fun toPersonalBlockedByPolicyMessage(sendAction: Boolean): String {
+ return if (sendAction) {
+ resources.getString(R.string.resolver_cant_share_with_personal_apps_explanation)
+ } else {
+ resources.getString(R.string.resolver_cant_access_personal_apps_explanation)
+ }
+ }
+
+ fun toWorkBlockedByPolicyMessage(sendAction: Boolean): String {
+ return if (sendAction) {
+ resources.getString(R.string.resolver_cant_share_with_work_apps_explanation)
+ } else {
+ resources.getString(R.string.resolver_cant_access_work_apps_explanation)
+ }
+ }
+
fun getWorkProfileNotSupportedMessage(launcherName: String): String {
return requireNotNull(
policyResources.getString(
diff --git a/java/src/com/android/intentresolver/emptystate/NoAppsAvailableEmptyStateProvider.java b/java/src/com/android/intentresolver/emptystate/NoAppsAvailableEmptyStateProvider.java
index 7bfea4f8..af9d56d1 100644
--- a/java/src/com/android/intentresolver/emptystate/NoAppsAvailableEmptyStateProvider.java
+++ b/java/src/com/android/intentresolver/emptystate/NoAppsAvailableEmptyStateProvider.java
@@ -16,24 +16,22 @@
package com.android.intentresolver.emptystate;
-import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_NO_PERSONAL_APPS;
-import static android.app.admin.DevicePolicyResources.Strings.Core.RESOLVER_NO_WORK_APPS;
+
+import static com.android.intentresolver.shared.model.Profile.Type.PERSONAL;
+
+import static java.util.Objects.requireNonNull;
import android.app.admin.DevicePolicyEventLogger;
-import android.app.admin.DevicePolicyManager;
-import android.content.Context;
-import android.content.pm.ResolveInfo;
import android.os.UserHandle;
import android.stats.devicepolicy.nano.DevicePolicyEnums;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import com.android.intentresolver.R;
-import com.android.intentresolver.ResolvedComponentInfo;
+import com.android.intentresolver.ProfileAvailability;
+import com.android.intentresolver.ProfileHelper;
import com.android.intentresolver.ResolverListAdapter;
-
-import java.util.List;
+import com.android.intentresolver.shared.model.Profile;
+import com.android.intentresolver.ui.ProfilePagerResources;
/**
* Chooser/ResolverActivity empty state provider that returns empty state which is shown when
@@ -41,77 +39,40 @@ import java.util.List;
*/
public class NoAppsAvailableEmptyStateProvider implements EmptyStateProvider {
- @NonNull
- private final Context mContext;
- @Nullable
- private final UserHandle mWorkProfileUserHandle;
- @Nullable
- private final UserHandle mPersonalProfileUserHandle;
- @NonNull
- private final String mMetricsCategory;
- @NonNull
- private final UserHandle mTabOwnerUserHandleForLaunch;
-
- public NoAppsAvailableEmptyStateProvider(@NonNull Context context,
- @Nullable UserHandle workProfileUserHandle,
- @Nullable UserHandle personalProfileUserHandle, @NonNull String metricsCategory,
- @NonNull UserHandle tabOwnerUserHandleForLaunch) {
- mContext = context;
- mWorkProfileUserHandle = workProfileUserHandle;
- mPersonalProfileUserHandle = personalProfileUserHandle;
+ @NonNull private final String mMetricsCategory;
+ private final ProfilePagerResources mProfilePagerResources;
+ private final ProfileHelper mProfileHelper;
+ private final ProfileAvailability mProfileAvailability;
+
+ public NoAppsAvailableEmptyStateProvider(
+ ProfileHelper profileHelper,
+ ProfileAvailability profileAvailability,
+ @NonNull String metricsCategory,
+ ProfilePagerResources profilePagerResources) {
+ mProfileHelper = profileHelper;
+ mProfileAvailability = profileAvailability;
mMetricsCategory = metricsCategory;
- mTabOwnerUserHandleForLaunch = tabOwnerUserHandleForLaunch;
+ mProfilePagerResources = profilePagerResources;
}
- @Nullable
+ @NonNull
@Override
- @SuppressWarnings("ReferenceEquality")
public EmptyState getEmptyState(ResolverListAdapter resolverListAdapter) {
UserHandle listUserHandle = resolverListAdapter.getUserHandle();
-
- if (mWorkProfileUserHandle != null
- && (mTabOwnerUserHandleForLaunch.equals(listUserHandle)
- || !hasAppsInOtherProfile(resolverListAdapter))) {
-
- String title;
- if (listUserHandle == mPersonalProfileUserHandle) {
- title = mContext.getSystemService(
- DevicePolicyManager.class).getResources().getString(
- RESOLVER_NO_PERSONAL_APPS,
- () -> mContext.getString(R.string.resolver_no_personal_apps_available));
- } else {
- title = mContext.getSystemService(
- DevicePolicyManager.class).getResources().getString(
- RESOLVER_NO_WORK_APPS,
- () -> mContext.getString(R.string.resolver_no_work_apps_available));
- }
-
+ if (mProfileAvailability.visibleProfileCount() == 1) {
+ return new DefaultEmptyState();
+ } else {
+ Profile.Type profileType =
+ requireNonNull(mProfileHelper.findProfileType(listUserHandle));
+ String title = mProfilePagerResources.noAppsMessage(profileType);
return new NoAppsAvailableEmptyState(
- title, mMetricsCategory,
- /* isPersonalProfile= */ listUserHandle == mPersonalProfileUserHandle
+ title,
+ mMetricsCategory,
+ /* isPersonalProfile= */ profileType == PERSONAL
);
- } else if (mWorkProfileUserHandle == null) {
- // Return default empty state without tracking
- return new DefaultEmptyState();
}
-
- return null;
}
- private boolean hasAppsInOtherProfile(ResolverListAdapter adapter) {
- if (mWorkProfileUserHandle == null) {
- return false;
- }
- List<ResolvedComponentInfo> resolversForIntent =
- adapter.getResolversForUser(mTabOwnerUserHandleForLaunch);
- for (ResolvedComponentInfo info : resolversForIntent) {
- ResolveInfo resolveInfo = info.getResolveInfoAt(0);
- if (resolveInfo.targetUserId != UserHandle.USER_CURRENT) {
- return true;
- }
- }
- return false;
- }
public static class DefaultEmptyState implements EmptyState {
@Override
diff --git a/java/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProvider.java b/java/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProvider.java
index e6d5d1c4..2b4a7ada 100644
--- a/java/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProvider.java
+++ b/java/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProvider.java
@@ -34,8 +34,8 @@ import com.android.intentresolver.shared.model.User;
import java.util.List;
/**
- * Empty state provider that does not allow cross profile sharing, it will return a blocker
- * in case if the profile of the current tab is not the same as the profile of the calling app.
+ * Empty state provider that informs about a lack of cross profile sharing. It will return
+ * an empty state in case there are no intents which can be forwarded to another profile.
*/
public class NoCrossProfileEmptyStateProvider implements EmptyStateProvider {
@@ -79,7 +79,8 @@ public class NoCrossProfileEmptyStateProvider implements EmptyStateProvider {
// Allow access to the tab when launched by the same user as the tab owner
// or when there is at least one target which is permitted for cross-profile.
- if (launchedAsSameUser || anyCrossProfileAllowedIntents(adapter, tabOwnerHandle)) {
+ if (launchedAsSameUser || anyCrossProfileAllowedIntents(adapter,
+ /* source = */ launchedAs.getHandle())) {
return null;
}
diff --git a/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java b/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java
index ba76a4a0..7cf9d2e9 100644
--- a/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java
+++ b/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java
@@ -66,15 +66,6 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
* out of `ChooserGridAdapter` altogether.
*/
public interface ChooserActivityDelegate {
- /** @return whether we're showing a tabbed (multi-profile) UI. */
- boolean shouldShowTabs();
-
- /**
- * @return a content preview {@link View} that's appropriate for the caller's share
- * content, constructed for display in the provided {@code parent} group.
- */
- View buildContentPreview(ViewGroup parent);
-
/** Notify the client that the item with the selected {@code itemIndex} was selected. */
void onTargetSelected(int itemIndex);
@@ -87,7 +78,6 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
private static final int VIEW_TYPE_DIRECT_SHARE = 0;
private static final int VIEW_TYPE_NORMAL = 1;
- private static final int VIEW_TYPE_CONTENT_PREVIEW = 2;
private static final int VIEW_TYPE_AZ_LABEL = 4;
private static final int VIEW_TYPE_CALLER_AND_RANK = 5;
private static final int VIEW_TYPE_FOOTER = 6;
@@ -149,9 +139,7 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
- if (mFeatureFlags.scrollablePreview()) {
- mRecyclerView = recyclerView;
- }
+ mRecyclerView = recyclerView;
}
@Override
@@ -197,8 +185,7 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
public int getRowCount() {
return (int) (
- getSystemRowCount()
- + getServiceTargetRowCount()
+ getServiceTargetRowCount()
+ getCallerAndRankedTargetRowCount()
+ getAzLabelRowCount()
+ Math.ceil(
@@ -207,29 +194,6 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
);
}
- /**
- * Whether the "system" row of targets is displayed.
- * This area includes the content preview (if present) and action row.
- */
- public int getSystemRowCount() {
- // For the tabbed case we show the sticky content preview above the tabs,
- // please refer to shouldShowStickyContentPreview
- if (mChooserActivityDelegate.shouldShowTabs()
- || mFeatureFlags.scrollablePreview()) {
- return 0;
- }
-
- if (!mShouldShowContentPreview) {
- return 0;
- }
-
- if (mChooserListAdapter == null || mChooserListAdapter.getCount() == 0) {
- return 0;
- }
-
- return 1;
- }
-
public int getFooterRowCount() {
return 1;
}
@@ -260,15 +224,13 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
return -1;
}
- return getSystemRowCount()
- + getServiceTargetRowCount()
+ return getServiceTargetRowCount()
+ getCallerAndRankedTargetRowCount();
}
@Override
public int getItemCount() {
- return getSystemRowCount()
- + getServiceTargetRowCount()
+ return getServiceTargetRowCount()
+ getCallerAndRankedTargetRowCount()
+ getAzLabelRowCount()
+ mChooserListAdapter.getAlphaTargetCount()
@@ -279,12 +241,6 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
switch (viewType) {
- case VIEW_TYPE_CONTENT_PREVIEW:
- return new ItemViewHolder(
- mChooserActivityDelegate.buildContentPreview(parent),
- viewType,
- null,
- null);
case VIEW_TYPE_AZ_LABEL:
return new ItemViewHolder(
createAzLabelView(parent),
@@ -355,10 +311,8 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
@Override
public int getItemViewType(int position) {
- int count;
-
- int countSum = (count = getSystemRowCount());
- if (count > 0 && position < countSum) return VIEW_TYPE_CONTENT_PREVIEW;
+ int count = 0;
+ int countSum = count;
countSum += (count = getServiceTargetRowCount());
if (count > 0 && position < countSum) return VIEW_TYPE_DIRECT_SHARE;
@@ -555,8 +509,6 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter<RecyclerView.
}
int getListPosition(int position) {
- position -= getSystemRowCount();
-
final int serviceCount = mChooserListAdapter.getServiceTargetCount();
final int serviceRows = (int) Math.ceil((float) serviceCount / mMaxTargetsPerRow);
if (position < serviceRows) {
diff --git a/java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java b/java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java
index 4d0f4a49..8aee0da1 100644
--- a/java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java
+++ b/java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java
@@ -27,7 +27,6 @@ import androidx.viewpager.widget.PagerAdapter;
import com.android.intentresolver.ChooserListAdapter;
import com.android.intentresolver.ChooserRecyclerViewAccessibilityDelegate;
-import com.android.intentresolver.FeatureFlags;
import com.android.intentresolver.R;
import com.android.intentresolver.emptystate.EmptyStateProvider;
import com.android.intentresolver.grid.ChooserGridAdapter;
@@ -56,8 +55,7 @@ public class ChooserMultiProfilePagerAdapter extends MultiProfilePagerAdapter<
@ProfileType int defaultProfile,
UserHandle workProfileUserHandle,
UserHandle cloneProfileUserHandle,
- int maxTargetsPerRow,
- FeatureFlags featureFlags) {
+ int maxTargetsPerRow) {
this(
context,
new ChooserProfileAdapterBinder(maxTargetsPerRow),
@@ -67,8 +65,7 @@ public class ChooserMultiProfilePagerAdapter extends MultiProfilePagerAdapter<
defaultProfile,
workProfileUserHandle,
cloneProfileUserHandle,
- new BottomPaddingOverrideSupplier(context),
- featureFlags);
+ new BottomPaddingOverrideSupplier(context));
}
private ChooserMultiProfilePagerAdapter(
@@ -80,10 +77,9 @@ public class ChooserMultiProfilePagerAdapter extends MultiProfilePagerAdapter<
@ProfileType int defaultProfile,
UserHandle workProfileUserHandle,
UserHandle cloneProfileUserHandle,
- BottomPaddingOverrideSupplier bottomPaddingOverrideSupplier,
- FeatureFlags featureFlags) {
+ BottomPaddingOverrideSupplier bottomPaddingOverrideSupplier) {
super(
- gridAdapter -> gridAdapter.getListAdapter(),
+ gridAdapter -> gridAdapter.getListAdapter(),
adapterBinder,
tabs,
emptyStateProvider,
@@ -91,7 +87,7 @@ public class ChooserMultiProfilePagerAdapter extends MultiProfilePagerAdapter<
defaultProfile,
workProfileUserHandle,
cloneProfileUserHandle,
- () -> makeProfileView(context, featureFlags),
+ () -> makeProfileView(context),
bottomPaddingOverrideSupplier);
mAdapterBinder = adapterBinder;
mBottomPaddingOverrideSupplier = bottomPaddingOverrideSupplier;
@@ -116,12 +112,10 @@ public class ChooserMultiProfilePagerAdapter extends MultiProfilePagerAdapter<
}
}
- private static ViewGroup makeProfileView(
- Context context, FeatureFlags featureFlags) {
+ private static ViewGroup makeProfileView(Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
- ViewGroup rootView = featureFlags.scrollablePreview()
- ? (ViewGroup) inflater.inflate(R.layout.chooser_list_per_profile_wrap, null, false)
- : (ViewGroup) inflater.inflate(R.layout.chooser_list_per_profile, null, false);
+ ViewGroup rootView =
+ (ViewGroup) inflater.inflate(R.layout.chooser_list_per_profile_wrap, null, false);
RecyclerView recyclerView = rootView.findViewById(com.android.internal.R.id.resolver_list);
recyclerView.setAccessibilityDelegateCompat(
new ChooserRecyclerViewAccessibilityDelegate(recyclerView));
diff --git a/java/src/com/android/intentresolver/profiles/MultiProfilePagerAdapter.java b/java/src/com/android/intentresolver/profiles/MultiProfilePagerAdapter.java
index 48de37de..11a6caca 100644
--- a/java/src/com/android/intentresolver/profiles/MultiProfilePagerAdapter.java
+++ b/java/src/com/android/intentresolver/profiles/MultiProfilePagerAdapter.java
@@ -302,15 +302,7 @@ public class MultiProfilePagerAdapter<
viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
- mCurrentPage = position;
- if (!mLoadedPages.contains(position)) {
- rebuildActiveTab(true);
- mLoadedPages.add(position);
- }
- if (mOnProfileSelectedListener != null) {
- mOnProfileSelectedListener.onProfilePageSelected(
- getProfileForPageNumber(position), position);
- }
+ MultiProfilePagerAdapter.this.onPageSelected(position);
}
@Override
@@ -325,6 +317,18 @@ public class MultiProfilePagerAdapter<
mLoadedPages.add(mCurrentPage);
}
+ private void onPageSelected(int position) {
+ mCurrentPage = position;
+ if (!mLoadedPages.contains(position)) {
+ rebuildActiveTab(true);
+ mLoadedPages.add(position);
+ }
+ if (mOnProfileSelectedListener != null) {
+ mOnProfileSelectedListener.onProfilePageSelected(
+ getProfileForPageNumber(position), position);
+ }
+ }
+
public void clearInactiveProfileCache() {
forEachInactivePage(pageNumber -> mLoadedPages.remove(pageNumber));
}
@@ -351,6 +355,13 @@ public class MultiProfilePagerAdapter<
return mCurrentPage;
}
+ /**
+ * Set active adapter page. A support method for the poayload reselection logic.
+ */
+ public void setCurrentPage(int page) {
+ onPageSelected(page);
+ }
+
public final @ProfileType int getActiveProfile() {
return getProfileForPageNumber(getCurrentPage());
}
diff --git a/java/src/com/android/intentresolver/ui/ProfilePagerResources.kt b/java/src/com/android/intentresolver/ui/ProfilePagerResources.kt
index baab9a4c..0d07af8f 100644
--- a/java/src/com/android/intentresolver/ui/ProfilePagerResources.kt
+++ b/java/src/com/android/intentresolver/ui/ProfilePagerResources.kt
@@ -50,4 +50,12 @@ constructor(
Profile.Type.PRIVATE -> privateTabAccessibilityLabel
}
}
+
+ fun noAppsMessage(type: Profile.Type): String {
+ return when (type) {
+ Profile.Type.PERSONAL -> devicePolicyResources.noPersonalApps
+ Profile.Type.WORK -> devicePolicyResources.noWorkApps
+ Profile.Type.PRIVATE -> resources.getString(R.string.resolver_no_private_apps_available)
+ }
+ }
}
diff --git a/lint-baseline.xml b/lint-baseline.xml
new file mode 100644
index 00000000..c970b7a7
--- /dev/null
+++ b/lint-baseline.xml
@@ -0,0 +1,2425 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.4.0-alpha08" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha08">
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainLooper(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="421"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainLooper(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="431"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainLooper(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="517"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainLooper(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="526"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainLooper(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="722"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainLooper(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="733"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainThreadHandler())) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1684"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainThreadHandler().post(() -> {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="2199"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" context.getMainExecutor(),"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="192"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" }, getApplicationContext().getMainExecutor());"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/IntentForwarderActivity.java"
+ line="161"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainLooper(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="297"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainLooper(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="307"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainLooper(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="374"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" getMainLooper(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="383"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NonInjectedMainThread"
+ message="Replace with injected `@Main Executor`."
+ errorLine1=" runnable -> context.getMainThreadHandler().post(runnable));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverListAdapter.java"
+ line="127"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongCommentType"
+ message="This block comment looks like it was intended to be a javadoc comment"
+ errorLine1=" * {@link MultiProfilePagerAdapter.OnProfileSelectedListener}. The only apparent distinctions"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="821"
+ column="8"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.intentresolver.data.model.ANDROID_APP_SCHEME"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ui/model/ActivityModel.kt"
+ line="23"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.intentresolver.data.model.ChooserRequest"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ui/viewmodel/ChooserRequestReader.kt"
+ line="45"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.intentresolver.data.model.ChooserRequest"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ui/viewmodel/ChooserViewModel.kt"
+ line="25"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.intentresolver.data.repository.ChooserRequestRepository"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ui/viewmodel/ChooserViewModel.kt"
+ line="26"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The ui layer may not depend on the data layer."
+ errorLine1="import com.android.intentresolver.data.repository.DevicePolicyResources"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ui/ProfilePagerResources.kt"
+ line="21"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.intentresolver.ui.viewmodel.readAlternateIntents"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallback.kt"
+ line="40"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="CleanArchitectureDependencyViolation"
+ message="The domain layer may not depend on the ui layer."
+ errorLine1="import com.android.intentresolver.ui.viewmodel.readChooserActions"
+ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallback.kt"
+ line="41"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" (UsageStatsManager) userContext.getSystemService(Context.USAGE_STATS_SERVICE));"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/model/AbstractResolverComparator.java"
+ line="136"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" .getSystemService(AppPredictionManager::class.java)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/shortcuts/AppPredictorFactory.kt"
+ line="66"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" (UserManager) context.getSystemService(Context.USER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="289"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" getContext().getSystemService(LauncherApps.class).pinShortcuts("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserTargetActionsDialogFragment.java"
+ line="226"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" List&lt;ShortcutManager.ShareShortcutInfo> targets = contextAsUser.getSystemService("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserTargetActionsDialogFragment.java"
+ line="233"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" .getSystemService(ACTIVITY_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserTargetActionsDialogFragment.java"
+ line="279"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" context.getSystemService(ActivityManager::class.java)?.launcherLargeIconDensity"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/icons/DefaultTargetDataLoader.kt"
+ line="47"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return getSystemService(DevicePolicyManager.class).getResources().getString("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/IntentForwarderActivity.java"
+ line="165"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return getSystemService(DevicePolicyManager.class).getResources().getString("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/IntentForwarderActivity.java"
+ line="171"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return getSystemService(UserManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/IntentForwarderActivity.java"
+ line="402"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" LauncherApps launcherApps = context.getSystemService(LauncherApps.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/icons/LoadDirectShareIconTask.java"
+ line="100"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return mContext.getSystemService(DevicePolicyManager.class).getResources().getString("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProvider.java"
+ line="127"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return mContext.getSystemService(DevicePolicyManager.class).getResources().getString("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProvider.java"
+ line="135"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" (UserManager) mContext.getSystemService(Context.USER_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverListAdapter.java"
+ line="503"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" private val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/shortcuts/ShortcutLoader.kt"
+ line="77"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" selectedProfileContext.getSystemService(Context.SHORTCUT_SERVICE) as ShortcutManager?"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/shortcuts/ShortcutLoader.kt"
+ line="209"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" final ActivityManager am = (ActivityManager) ctx.getSystemService(ACTIVITY_SERVICE);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/SimpleIconFactory.java"
+ line="98"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" return requireNotNull(context.getSystemService(serviceType.java))"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/data/repository/UserScopedService.kt"
+ line="65"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="NonInjectedService"
+ message="Use `@Inject` to get system-level service handles instead of `Context.getSystemService()`"
+ errorLine1=" String title = mContext.getSystemService(DevicePolicyManager.class)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/emptystate/WorkProfilePausedEmptyStateProvider.java"
+ line="83"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a GlobalSettings instead"
+ errorLine1=" return Settings.Global.getInt(getContentResolver(),"
+ errorLine2=" ~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/IntentForwarderActivity.java"
+ line="280"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return Settings.Secure.getString(resolver, name)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/platform/PlatformSecureSettings.kt"
+ line="32"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return runCatching { Settings.Secure.getInt(resolver, name) }.getOrNull()"
+ errorLine2=" ~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/platform/PlatformSecureSettings.kt"
+ line="36"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return runCatching { Settings.Secure.getLong(resolver, name) }.getOrNull()"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/platform/PlatformSecureSettings.kt"
+ line="40"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return runCatching { Settings.Secure.getFloat(resolver, name) }.getOrNull()"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/platform/PlatformSecureSettings.kt"
+ line="44"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="StaticSettingsProvider"
+ message="`@Inject` a SecureSettings instead"
+ errorLine1=" return Settings.Secure.getString(resolver, name)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/SecureSettings.kt"
+ line="25"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="CanvasSize"
+ message="Calling `Canvas.getWidth()` is usually wrong; you should be calling `getWidth()` instead"
+ errorLine1=" int xPos = canvas.getWidth() / 2;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/widget/RoundedRectImageView.java"
+ line="134"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="CanvasSize"
+ message="Calling `Canvas.getHeight()` is usually wrong; you should be calling `getHeight()` instead"
+ errorLine1=" int yPos = (int) ((canvas.getHeight() / 2.0f)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/widget/RoundedRectImageView.java"
+ line="135"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="CustomViewStyleable"
+ message="By convention, the declare-styleable (`ResolverDrawerLayout_LayoutParams`) for a layout parameter class (`LayoutParams`) is expected to be the surrounding class (`ResolverDrawerLayout`) plus &quot;`_Layout`&quot;, e.g. `ResolverDrawerLayout_Layout`. (Various editor features rely on this convention.)"
+ errorLine1=" R.styleable.ResolverDrawerLayout_LayoutParams);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/widget/ResolverDrawerLayout.java"
+ line="1222"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="InconsistentLayout"
+ message="The id &quot;edit&quot; in layout &quot;image_preview_image_item&quot; is missing from the following layout configurations: layout (present in layout-h480dp)"
+ errorLine1=" android:id=&quot;@+id/edit&quot;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout-h480dp/image_preview_image_item.xml"
+ line="58"
+ column="9"
+ message="Occurrence in layout-h480dp"/>
+ </issue>
+
+ <issue
+ id="MissingConstraints"
+ message="This view is not constrained vertically: at runtime it will jump to the top unless you add a vertical constraint"
+ errorLine1=" &lt;TextView"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_headline_row.xml"
+ line="27"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="MissingConstraints"
+ message="This view is not constrained horizontally: at runtime it will jump to the left unless you add a horizontal constraint"
+ errorLine1=" &lt;com.android.intentresolver.widget.RoundedRectImageView"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout-h480dp/image_preview_image_item.xml"
+ line="24"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout&apos;s root element)"
+ errorLine1=" R.layout.resolver_different_item_header, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1197"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout&apos;s root element)"
+ errorLine1=" ? (ViewGroup) inflater.inflate(R.layout.chooser_list_per_profile_wrap, null, false)"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java"
+ line="123"
+ column="88"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout&apos;s root element)"
+ errorLine1=" : (ViewGroup) inflater.inflate(R.layout.chooser_list_per_profile, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java"
+ line="124"
+ column="83"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout&apos;s root element)"
+ errorLine1=" R.layout.resolver_different_item_header, null, false);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="853"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="InflateParams"
+ message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout&apos;s root element)"
+ errorLine1=" R.layout.resolver_list_per_profile, null, false),"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/profiles/ResolverMultiProfilePagerAdapter.java"
+ line="80"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="ManifestOrder"
+ message="`&lt;uses-sdk>` tag appears after `&lt;application>` tag"
+ errorLine1=" &lt;uses-sdk android:minSdkVersion=&quot;VanillaIceCream&quot; android:targetSdkVersion=&quot;16&quot;/>"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/packages/modules/IntentResolver/IntentResolver-core/android_common/e18b8e8d84cb9f664aa09a397b08c165/manifest_fixer/AndroidManifest.xml"
+ line="22"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="MissingInflatedId"
+ message="`@layout/chooser_dialog` does not contain a declaration with id `title`"
+ errorLine1=" TextView title = v.findViewById(com.android.internal.R.id.title);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserTargetActionsDialogFragment.java"
+ line="133"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="MissingInflatedId"
+ message="`@layout/chooser_dialog` does not contain a declaration with id `icon`"
+ errorLine1=" ImageView icon = v.findViewById(com.android.internal.R.id.icon);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserTargetActionsDialogFragment.java"
+ line="134"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="MissingInflatedId"
+ message="`@layout/chooser_dialog` does not contain a declaration with id `listContainer`"
+ errorLine1=" RecyclerView rv = v.findViewById(com.android.internal.R.id.listContainer);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserTargetActionsDialogFragment.java"
+ line="135"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getActiveListAdapter().handlePackagesChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="437"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getActiveListAdapter().hasFilteredItem()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="559"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" int count = mChooserMultiProfilePagerAdapter.getActiveListAdapter().getUnfilteredCount();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="761"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (mChooserMultiProfilePagerAdapter.getActiveListAdapter().getOtherProfile() != null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="766"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" final TargetInfo target = mChooserMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="771"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getActiveListAdapter().getFilteredPosition() >= 0;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="900"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" .getActiveListAdapter().getFilteredItem()))"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="909"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" int count = mChooserMultiProfilePagerAdapter.getActiveListAdapter().getCount();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1133"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" TargetInfo target = mChooserMultiProfilePagerAdapter.getActiveListAdapter().getItem(i);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1136"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (mChooserMultiProfilePagerAdapter.getActiveListAdapter() == null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1155"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getActiveListAdapter();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1206"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" int count = mChooserMultiProfilePagerAdapter.getActiveListAdapter().getUnfilteredCount();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1217"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getActiveListAdapter().handlePackagesChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1483"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getActiveListAdapter().addServiceResults("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1623"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getActiveListAdapter();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1699"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" TargetInfo target = mChooserMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1724"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getActiveListAdapter().hasFilteredItem()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1731"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getActiveListAdapter();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1801"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getActiveListAdapter();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1838"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getCurrentUserHandle());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1886"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mChooserMultiProfilePagerAdapter.getCurrentUserHandle());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1914"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" .getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="1981"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (mChooserMultiProfilePagerAdapter.getCurrentUserHandle().equals("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="2041"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (listProfileUserHandle.equals(mChooserMultiProfilePagerAdapter.getCurrentUserHandle())) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="2288"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (mChooserMultiProfilePagerAdapter.getActiveListAdapter() == adapter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserActivity.java"
+ line="2351"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" final ViewHolder vh = (ViewHolder) v.getTag();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java"
+ line="414"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" final ViewHolder vh = (ViewHolder) v.getTag();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java"
+ line="414"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" vh.text.setLines(2);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java"
+ line="415"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" vh.text.setHorizontallyScrolling(false);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java"
+ line="416"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" vh.text2.setVisibility(View.GONE);"
+ errorLine2=" ~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java"
+ line="417"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" private void resetViewHolder(ViewHolder holder) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="432"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.reset();"
+ errorLine2=" ~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="433"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.itemView.setBackground(holder.defaultItemViewBackground);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="434"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.itemView.setBackground(holder.defaultItemViewBackground);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="434"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ((BadgeTextView) holder.text).setBadgeDrawable(null);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="437"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.text.setBackground(null);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="439"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.text.setPaddingRelative(0, 0, 0, 0);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="440"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" private void updateContentDescription(ViewHolder holder, String description) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="443"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.itemView.setContentDescription(description);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="444"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" private void bindPlaceholder(ViewHolder holder) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="447"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.itemView.setBackground(null);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="448"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" private void bindGroupIndicator(ViewHolder holder, Drawable indicator) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="451"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ((BadgeTextView) holder.text).setBadgeDrawable(indicator);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="453"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.text.setPaddingRelative(0, 0, /*end = */indicator.getIntrinsicWidth(), 0);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="455"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.text.setBackground(indicator);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="456"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" private void bindPinnedIndicator(ViewHolder holder, Drawable indicator) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="460"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.text.setPaddingRelative(/*start = */indicator.getIntrinsicWidth(), 0, 0, 0);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="461"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" holder.text.setBackground(indicator);"
+ errorLine2=" ~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="462"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" getPageAdapterForIndex(i).setAzLabelVisibility(!isCollapsed);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java"
+ line="115"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" getActiveListAdapter().notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java"
+ line="135"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" getPageAdapterForIndex(i).setFooterHeight(height);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java"
+ line="150"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ChooserGridAdapter adapter = getPageAdapterForIndex(i);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/profiles/ChooserMultiProfilePagerAdapter.java"
+ line="157"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" /* instance_id = 3 */ mInstanceId.getId(),"
+ errorLine2=" ~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/logging/EventLogImpl.java"
+ line="96"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" /* instance_id = 3 */ mInstanceId.getId(),"
+ errorLine2=" ~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/logging/EventLogImpl.java"
+ line="118"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" /* instance_id = 3 */ mInstanceId.getId(),"
+ errorLine2=" ~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/logging/EventLogImpl.java"
+ line="142"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" /* instance_id = 3 */ mInstanceId.getId(),"
+ errorLine2=" ~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/logging/EventLogImpl.java"
+ line="200"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This class should only be accessed from tests or within private scope"
+ errorLine1=" private final ResolverListAdapter.ViewHolder mWrappedViewHolder;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/grid/ItemViewHolder.java"
+ line="36"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mWrappedViewHolder = new ResolverListAdapter.ViewHolder(itemView);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/grid/ItemViewHolder.java"
+ line="46"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMultiProfilePagerAdapter.getActiveListAdapter().handlePackagesChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="313"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" &amp;&amp; mMultiProfilePagerAdapter.getActiveListAdapter() != null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="323"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMultiProfilePagerAdapter.getActiveListAdapter().onDestroy();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="324"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" MetricsLogger.action(this, mMultiProfilePagerAdapter.getActiveListAdapter().hasFilteredItem()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="415"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMultiProfilePagerAdapter.getActiveListAdapter().handlePackagesChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="540"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ResolverListAdapter currentListAdapter = mMultiProfilePagerAdapter.getActiveListAdapter();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="560"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ResolveInfo ri = mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="572"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" TargetInfo target = mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="582"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMultiProfilePagerAdapter.getActiveListAdapter().hasFilteredItem()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="596"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" &amp;&amp; mMultiProfilePagerAdapter.getActiveListAdapter().getUnfilteredResolveList()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="627"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" final int N = mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="713"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMultiProfilePagerAdapter.getActiveListAdapter().getOtherProfile() != null;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="720"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ResolveInfo r = mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="729"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" set[N] = mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="737"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" final int otherProfileMatch = mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="739"
+ column="77"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="761"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" .mResolverListController.setLastChosen(intent, filter, bestMatch);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="762"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMultiProfilePagerAdapter.getActiveListAdapter();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="868"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" int count = mMultiProfilePagerAdapter.getActiveListAdapter().getCount();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1143"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" TargetInfo target = mMultiProfilePagerAdapter.getActiveListAdapter().getItem(i);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1146"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mMultiProfilePagerAdapter.getActiveListAdapter().getFilteredPosition() >= 0;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1172"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" .getActiveListAdapter().getFilteredItem()))"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1181"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (!mMultiProfilePagerAdapter.getCurrentUserHandle().equals(getUser())) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1217"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ri = mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1233"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" startActivityAsUser(in, mMultiProfilePagerAdapter.getCurrentUserHandle());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1326"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (mMultiProfilePagerAdapter.getActiveListAdapter() == null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1334"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" new ResolverListAdapter.ViewHolder(icon).bindIcon(otherProfileResolveInfo);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1399"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" new ResolverListAdapter.ViewHolder(icon).bindIcon(otherProfileResolveInfo);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1399"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" int count = mMultiProfilePagerAdapter.getActiveListAdapter().getUnfilteredCount();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1472"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" int count = mMultiProfilePagerAdapter.getActiveListAdapter().getUnfilteredCount();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1534"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (mMultiProfilePagerAdapter.getActiveListAdapter().getOtherProfile() != null) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1539"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" final TargetInfo target = mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1544"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ResolverListAdapter activeListAdapter = mMultiProfilePagerAdapter.getActiveListAdapter();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1687"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" int filteredPosition = mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1754"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" if (mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1795"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" ResolveInfo ri = mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1828"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" final TargetInfo ti = ra.mMultiProfilePagerAdapter.getActiveListAdapter()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverActivity.java"
+ line="1896"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" return mResolverListController.getScore(target);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverListAdapter.java"
+ line="212"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mResolverListController.addResolveListDedupe(currentResolveList,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverListAdapter.java"
+ line="329"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mResolverListController.filterIneligibleActivities(currentResolveList, true);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverListAdapter.java"
+ line="362"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" return mResolverListController.filterLowPriority("
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverListAdapter.java"
+ line="384"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="VisibleForTests"
+ message="This method should only be accessed from tests or within private scope"
+ errorLine1=" mLastChosen = mResolverListController.getLastChosen();"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ResolverListAdapter.java"
+ line="410"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="SupportAnnotationUsage"
+ message="This annotation does not apply for type java.lang.Object; expected int"
+ errorLine1=" @ContentPreviewType"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/contentpreview/PreviewDataProvider.kt"
+ line="230"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ExpiredTargetSdkVersion"
+ message="Google Play requires that apps target API level 33 or higher."
+ errorLine1=" &lt;uses-sdk android:minSdkVersion=&quot;VanillaIceCream&quot; android:targetSdkVersion=&quot;16&quot;/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="./out/soong/.intermediates/packages/modules/IntentResolver/IntentResolver-core/android_common/e18b8e8d84cb9f664aa09a397b08c165/manifest_fixer/AndroidManifest.xml"
+ line="22"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls unbindService"
+ errorLine1=" mContext.unbindService(mConnection);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/model/ResolverRankerServiceResolverComparator.java"
+ line="308"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="BindServiceOnMainThread"
+ message="This method should be annotated with `@WorkerThread` because it calls bindServiceAsUser"
+ errorLine1=" context.bindServiceAsUser(intent, mConnection, Context.BIND_AUTO_CREATE, UserHandle.SYSTEM);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/model/ResolverRankerServiceResolverComparator.java"
+ line="333"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java"
+ line="139"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java"
+ line="145"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/widget/ScrollableActionRow.kt"
+ line="94"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NotifyDataSetChanged"
+ message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
+ errorLine1=" notifyDataSetChanged()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/widget/ScrollableImagePreviewView.kt"
+ line="316"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiverAsUser("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/data/BroadcastSubscriber.kt"
+ line="63"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RegisterReceiverViaContext"
+ message="Register `BroadcastReceiver` using `BroadcastDispatcher` instead of `Context`"
+ errorLine1=" context.registerReceiverAsUser("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/WorkProfileAvailabilityManager.java"
+ line="74"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow&lt;FileInfo>(replay = records.size).apply {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/contentpreview/PreviewDataProvider.kt"
+ line="91"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" val reportFlow = MutableSharedFlow&lt;Any>(replay = 2)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/widget/ScrollableImagePreviewView.kt"
+ line="660"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow&lt;Array&lt;DisplayResolveInfo>?>("
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/shortcuts/ShortcutLoader.kt"
+ line="82"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SharedFlowCreation"
+ message="`MutableSharedFlow()` creates a new shared flow, which has poor performance characteristics"
+ errorLine1=" MutableSharedFlow&lt;ShortcutData?>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/shortcuts/ShortcutLoader.kt"
+ line="87"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="SlowUserIdQuery"
+ message="Use `UserTracker.getUserId()` instead of `ActivityManager.getCurrentUser()`"
+ errorLine1=" userHandle == UserHandle.of(ActivityManager.getCurrentUser()),"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/shortcuts/ShortcutLoader.kt"
+ line="104"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="SlowUserInfoQuery"
+ message="Use `UserTracker.getUserInfo()` instead of `UserManager.getUserInfo()`"
+ errorLine1=" val originUserInfo = userManager.getUserInfo(contentUserHint)"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/IntentForwarding.kt"
+ line="51"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="SlowUserInfoQuery"
+ message="Use `UserTracker.getUserInfo()` instead of `UserManager.getUserInfo()`"
+ errorLine1=" withContext(backgroundDispatcher) { userManager.getUserInfo(user.identifier) }"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/data/repository/UserRepository.kt"
+ line="267"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" mBitmap = Bitmap.createBitmap(mMaxSize, mMaxSize, Bitmap.Config.ALPHA_8);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/SimpleIconFactory.java"
+ line="172"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" bitmap.getHeight(), Bitmap.Config.ARGB_8888);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/SimpleIconFactory.java"
+ line="297"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="SoftwareBitmap"
+ message="Replace software bitmap with `Config.HARDWARE`"
+ errorLine1=" Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/SimpleIconFactory.java"
+ line="343"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_alignParentTop`"
+ errorLine1=" android:layout_alignParentTop=&quot;true&quot;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_grid_scrollable_preview.xml"
+ line="99"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="ObsoleteLayoutParam"
+ message="Invalid layout param in a `LinearLayout`: `layout_centerHorizontal`"
+ errorLine1=" android:layout_centerHorizontal=&quot;true&quot;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_grid_scrollable_preview.xml"
+ line="100"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="This field leaks a context object"
+ errorLine1=" protected final Context mContext;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/icons/BaseLoadIconTask.java"
+ line="29"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="This `AsyncTask` class should be static or leaks might occur (anonymous android.os.AsyncTask)"
+ errorLine1=" new AsyncTask&lt;Void, Void, List&lt;DisplayResolveInfo>>() {"
+ errorLine2=" ^">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/ChooserListAdapter.java"
+ line="488"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="StaticFieldLeak"
+ message="This field leaks a context object"
+ errorLine1=" private final Context mContext;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/icons/LoadLabelTask.java"
+ line="32"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UseCompoundDrawables"
+ message="This tag and its children can be replaced by one `&lt;TextView/>` and a compound drawable"
+ errorLine1=" &lt;LinearLayout"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_dialog.xml"
+ line="29"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
+ errorLine1=" android:background=&quot;?androidprv:attr/materialColorSurfaceContainer&quot;>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_grid_preview_file.xml"
+ line="27"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
+ errorLine1=" android:background=&quot;?androidprv:attr/materialColorSurfaceContainer&quot;>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_grid_preview_files_text.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
+ errorLine1=" android:background=&quot;?androidprv:attr/materialColorSurfaceContainer&quot;>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_grid_preview_image.xml"
+ line="27"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="Overdraw"
+ message="Possible overdraw: Root element paints background `?androidprv:attr/materialColorSurfaceContainer` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)"
+ errorLine1=" android:background=&quot;?androidprv:attr/materialColorSurfaceContainer&quot;>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_grid_preview_text.xml"
+ line="28"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="RedundantNamespace"
+ message="This namespace declaration is redundant"
+ errorLine1=" &lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/drawable/chooser_direct_share_icon_placeholder.xml"
+ line="20"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RedundantNamespace"
+ message="This namespace declaration is redundant"
+ errorLine1=" xmlns:aapt=&quot;http://schemas.android.com/aapt&quot;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/drawable/chooser_direct_share_icon_placeholder.xml"
+ line="21"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="RedundantNamespace"
+ message="This namespace declaration is redundant"
+ errorLine1=" &lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/resolve_list_item.xml"
+ line="40"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="RedundantNamespace"
+ message="This namespace declaration is redundant"
+ errorLine1=" xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/resolver_list_per_profile.xml"
+ line="23"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="UnusedNamespace"
+ message="Unused namespace declaration xmlns:android; already declared on the root element"
+ errorLine1=" &lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/resolve_list_item.xml"
+ line="40"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnusedNamespace"
+ message="Unused namespace declaration xmlns:android; already declared on the root element"
+ errorLine1=" xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/resolver_list_per_profile.xml"
+ line="23"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace &quot;...&quot; with ellipsis character (…, &amp;#8230;) ?"
+ errorLine1=" &lt;string name=&quot;whichApplication&quot; msgid=&quot;2309561338625872614&quot;>&quot;... በመጠቀም ድርጊቱን አጠናቅ&quot;&lt;/string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/values-am/strings.xml"
+ line="19"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace &quot;...&quot; with ellipsis character (…, &amp;#8230;) ?"
+ errorLine1=" &lt;string name=&quot;whichApplication&quot; msgid=&quot;2309561338625872614&quot;>&quot;Wykonaj czynność przez...&quot;&lt;/string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/values-pl/strings.xml"
+ line="19"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace &quot;...&quot; with ellipsis character (…, &amp;#8230;) ?"
+ errorLine1=" &lt;string name=&quot;whichViewApplication&quot; msgid=&quot;7660051361612888119&quot;>&quot;...ဖြင့် ဖွင့်မည်&quot;&lt;/string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/values-my/strings.xml"
+ line="22"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace &quot;...&quot; with ellipsis character (…, &amp;#8230;) ?"
+ errorLine1=" &lt;string name=&quot;whichEditApplication&quot; msgid=&quot;5097563012157950614&quot;>&quot;...နှင့် တည်းဖြတ်ရန်&quot;&lt;/string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/values-my/strings.xml"
+ line="30"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="TypographyEllipsis"
+ message="Replace &quot;...&quot; with ellipsis character (…, &amp;#8230;) ?"
+ errorLine1=" &lt;string name=&quot;whichSendToApplication&quot; msgid=&quot;2724450540348806267&quot;>&quot;Sūtīšana, izmantojot...&quot;&lt;/string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/values-lv/strings.xml"
+ line="36"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="ClickableViewAccessibility"
+ message="Custom view `ResolverDrawerLayout` overrides `onTouchEvent` but not `performClick`"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/src/com/android/intentresolver/widget/ResolverDrawerLayout.java"
+ line="403"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView android:id=&quot;@android:id/icon&quot;"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_dialog.xml"
+ line="37"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView android:id=&quot;@android:id/icon&quot;"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_dialog_item.xml"
+ line="30"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView android:id=&quot;@android:id/icon&quot;"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_grid_item.xml"
+ line="32"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_grid_preview_file.xml"
+ line="47"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_grid_preview_text.xml"
+ line="112"
+ column="8"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/image_preview_image_item.xml"
+ line="43"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout-h480dp/image_preview_image_item.xml"
+ line="46"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout-h480dp/image_preview_image_item.xml"
+ line="68"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/miniresolver.xml"
+ line="39"
+ column="10"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView android:id=&quot;@android:id/icon&quot;"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/resolve_grid_item.xml"
+ line="32"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView android:id=&quot;@android:id/icon&quot;"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/resolve_list_item.xml"
+ line="30"
+ column="6"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/resolver_list_with_default.xml"
+ line="44"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="ContentDescription"
+ message="Missing `contentDescription` attribute on image"
+ errorLine1=" &lt;ImageView"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/resolver_list_with_default.xml"
+ line="79"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="HardcodedText"
+ message="Hardcoded string &quot;App name&quot;, should use `@string` resource"
+ errorLine1=" android:text=&quot;App name&quot;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/chooser_dialog.xml"
+ line="46"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="RelativeOverlap"
+ message="`@androidprv:id/button_open` can overlap `@androidprv:id/use_same_profile_browser` if @string/activity_resolver_use_once, @string/whichViewApplicationLabel grow due to localized text expansion"
+ errorLine1=" &lt;Button"
+ errorLine2=" ~~~~~~">
+ <location
+ file="packages/modules/IntentResolver/java/res/layout/miniresolver.xml"
+ line="100"
+ column="14"/>
+ </issue>
+
+</issues>
diff --git a/tests/activity/AndroidTest.xml b/tests/activity/AndroidTest.xml
index 6c9d4953..04e4e69f 100644
--- a/tests/activity/AndroidTest.xml
+++ b/tests/activity/AndroidTest.xml
@@ -27,6 +27,7 @@
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.intentresolver.tests" />
<option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+ <option name="instrumentation-arg" key="thisisignored" value="thisisignored --no-window-animation" />
<option name="hidden-api-checks" value="false"/>
</test>
</configuration>
diff --git a/tests/activity/src/com/android/intentresolver/ChooserActivityTest.java b/tests/activity/src/com/android/intentresolver/ChooserActivityTest.java
index cfbb1c0b..66f7650d 100644
--- a/tests/activity/src/com/android/intentresolver/ChooserActivityTest.java
+++ b/tests/activity/src/com/android/intentresolver/ChooserActivityTest.java
@@ -88,7 +88,6 @@ import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
-import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.provider.DeviceConfig;
@@ -2229,7 +2228,6 @@ public class ChooserActivityTest {
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_SCROLLABLE_PREVIEW)
public void testWorkTab_previewIsScrollable() {
markOtherProfileAvailability(/* workAvailable= */ true, /* cloneAvailable= */ false);
List<ResolvedComponentInfo> personalResolvedComponentInfos =
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/FileContentPreviewUiTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/FileContentPreviewUiTest.kt
index a540dfa2..0e4e36ab 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/FileContentPreviewUiTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/FileContentPreviewUiTest.kt
@@ -61,47 +61,27 @@ class FileContentPreviewUiTest {
@Test
fun test_display_titleAndMetadataIsDisplayed() {
val layoutInflater = LayoutInflater.from(context)
- val gridLayout = layoutInflater.inflate(R.layout.chooser_grid, null, false) as ViewGroup
+ val gridLayout =
+ layoutInflater.inflate(R.layout.chooser_grid_scrollable_preview, null, false)
+ as ViewGroup
+ val headlineRow = gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
+
+ assertThat(headlineRow.findViewById<View>(R.id.headline)).isNull()
+ assertThat(headlineRow.findViewById<View>(R.id.metadata)).isNull()
val previewView =
testSubject.display(
context.resources,
layoutInflater,
gridLayout,
- /*headlineViewParent=*/ null
+ headlineRow,
)
assertThat(previewView).isNotNull()
- val headlineView = previewView?.findViewById<TextView>(R.id.headline)
- assertThat(headlineView).isNotNull()
- assertThat(headlineView?.text).isEqualTo(text)
- val metadataView = previewView?.findViewById<TextView>(R.id.metadata)
- assertThat(metadataView?.text).isEqualTo(testMetadataText)
- }
-
- @Test
- fun test_displayWithExternalHeaderView() {
- val layoutInflater = LayoutInflater.from(context)
- val gridLayout =
- layoutInflater.inflate(R.layout.chooser_grid_scrollable_preview, null, false)
- as ViewGroup
- val externalHeaderView =
- gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
-
- assertThat(externalHeaderView.findViewById<View>(R.id.headline)).isNull()
- assertThat(externalHeaderView.findViewById<View>(R.id.metadata)).isNull()
-
- val previewView =
- testSubject.display(context.resources, layoutInflater, gridLayout, externalHeaderView)
-
- assertThat(previewView).isNotNull()
- assertThat(previewView.findViewById<View>(R.id.headline)).isNull()
- assertThat(previewView.findViewById<View>(R.id.metadata)).isNull()
-
- val headlineView = externalHeaderView.findViewById<TextView>(R.id.headline)
+ val headlineView = headlineRow.findViewById<TextView>(R.id.headline)
assertThat(headlineView).isNotNull()
assertThat(headlineView?.text).isEqualTo(text)
- val metadataView = externalHeaderView.findViewById<TextView>(R.id.metadata)
+ val metadataView = headlineRow.findViewById<TextView>(R.id.metadata)
assertThat(metadataView?.text).isEqualTo(testMetadataText)
}
}
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt
index 259ffdac..da0ddd12 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt
@@ -52,9 +52,13 @@ class FilesPlusTextContentPreviewUiTest {
private val actionFactory =
object : ChooserContentPreviewUi.ActionFactory {
override fun getEditButtonRunnable(): Runnable? = null
+
override fun getCopyButtonRunnable(): Runnable? = null
+
override fun createCustomActions(): List<ActionRow.Action> = emptyList()
+
override fun getModifyShareAction(): ActionRow.Action? = null
+
override fun getExcludeSharedTextAction(): Consumer<Boolean> = Consumer<Boolean> {}
}
private val imageLoader = mock<ImageLoader>()
@@ -70,200 +74,106 @@ class FilesPlusTextContentPreviewUiTest {
get() = getInstrumentation().context
@Test
- fun test_displayImagesPlusTextWithoutUriMetadata_showImagesHeadline() {
+ fun test_displayImagesPlusTextWithoutUriMetadataHeader_showImagesHeadline() {
val sharedFileCount = 2
- val previewView = testLoadingHeadline("image/*", sharedFileCount)
-
- verify(headlineGenerator, times(1)).getImagesHeadline(sharedFileCount)
- verifyPreviewHeadline(previewView, HEADLINE_IMAGES)
- verifyPreviewMetadata(previewView, testMetadataText)
- verifySharedText(previewView)
- }
-
- @Test
- fun test_displayImagesPlusTextWithoutUriMetadataExternalHeader_showImagesHeadline() {
- val sharedFileCount = 2
- val (previewView, headerParent) = testLoadingExternalHeadline("image/*", sharedFileCount)
+ val (previewView, headlineRow) = testLoadingHeadline("image/*", sharedFileCount)
+ assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
verify(headlineGenerator, times(1)).getImagesHeadline(sharedFileCount)
- verifyInternalHeadlineAbsence(previewView)
- verifyPreviewHeadline(headerParent, HEADLINE_IMAGES)
- verifyPreviewMetadata(headerParent, testMetadataText)
+ verifyPreviewHeadline(headlineRow, HEADLINE_IMAGES)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
verifySharedText(previewView)
}
@Test
- fun test_displayVideosPlusTextWithoutUriMetadata_showVideosHeadline() {
+ fun test_displayVideosPlusTextWithoutUriMetadataHeader_showVideosHeadline() {
val sharedFileCount = 2
- val previewView = testLoadingHeadline("video/*", sharedFileCount)
+ val (previewView, headlineRow) = testLoadingHeadline("video/*", sharedFileCount)
verify(headlineGenerator, times(1)).getVideosHeadline(sharedFileCount)
- verifyPreviewHeadline(previewView, HEADLINE_VIDEOS)
- verifyPreviewMetadata(previewView, testMetadataText)
- verifySharedText(previewView)
- }
-
- @Test
- fun test_displayVideosPlusTextWithoutUriMetadataExternalHeader_showVideosHeadline() {
- val sharedFileCount = 2
- val (previewView, headerParent) = testLoadingExternalHeadline("video/*", sharedFileCount)
-
- verify(headlineGenerator, times(1)).getVideosHeadline(sharedFileCount)
- verifyInternalHeadlineAbsence(previewView)
- verifyPreviewHeadline(headerParent, HEADLINE_VIDEOS)
- verifyPreviewMetadata(headerParent, testMetadataText)
- verifySharedText(previewView)
- }
-
- @Test
- fun test_displayDocsPlusTextWithoutUriMetadata_showFilesHeadline() {
- val sharedFileCount = 2
- val previewView = testLoadingHeadline("application/pdf", sharedFileCount)
-
- verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
- verifyPreviewHeadline(previewView, HEADLINE_FILES)
- verifyPreviewMetadata(previewView, testMetadataText)
- verifySharedText(previewView)
- }
-
- @Test
- fun test_displayDocsPlusTextWithoutUriMetadataExternalHeader_showFilesHeadline() {
- val sharedFileCount = 2
- val (previewView, headerParent) =
- testLoadingExternalHeadline("application/pdf", sharedFileCount)
-
- verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
- verifyInternalHeadlineAbsence(previewView)
- verifyPreviewHeadline(headerParent, HEADLINE_FILES)
- verifyPreviewMetadata(headerParent, testMetadataText)
+ assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
+ verifyPreviewHeadline(headlineRow, HEADLINE_VIDEOS)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
verifySharedText(previewView)
}
@Test
- fun test_displayMixedContentPlusTextWithoutUriMetadata_showFilesHeadline() {
+ fun test_displayDocsPlusTextWithoutUriMetadataHeader_showFilesHeadline() {
val sharedFileCount = 2
- val previewView = testLoadingHeadline("*/*", sharedFileCount)
+ val (previewView, headlineRow) = testLoadingHeadline("application/pdf", sharedFileCount)
verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
- verifyPreviewHeadline(previewView, HEADLINE_FILES)
- verifyPreviewMetadata(previewView, testMetadataText)
+ assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
+ verifyPreviewHeadline(headlineRow, HEADLINE_FILES)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
verifySharedText(previewView)
}
@Test
- fun test_displayMixedContentPlusTextWithoutUriMetadataExternalHeader_showFilesHeadline() {
+ fun test_displayMixedContentPlusTextWithoutUriMetadataHeader_showFilesHeadline() {
val sharedFileCount = 2
- val (previewView, headerParent) = testLoadingExternalHeadline("*/*", sharedFileCount)
+ val (previewView, headlineRow) = testLoadingHeadline("*/*", sharedFileCount)
verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
- verifyInternalHeadlineAbsence(previewView)
- verifyPreviewHeadline(headerParent, HEADLINE_FILES)
- verifyPreviewMetadata(headerParent, testMetadataText)
- verifySharedText(previewView)
- }
-
- @Test
- fun test_displayImagesPlusTextWithUriMetadataSet_showImagesHeadline() {
- val loadedFileMetadata = createFileInfosWithMimeTypes("image/png", "image/jpeg")
- val sharedFileCount = loadedFileMetadata.size
- val previewView = testLoadingHeadline("image/*", sharedFileCount, loadedFileMetadata)
-
- verify(headlineGenerator, times(1)).getImagesHeadline(sharedFileCount)
- verifyPreviewHeadline(previewView, HEADLINE_IMAGES)
- verifyPreviewMetadata(previewView, testMetadataText)
+ assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
+ verifyPreviewHeadline(headlineRow, HEADLINE_FILES)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
verifySharedText(previewView)
}
@Test
- fun test_displayImagesPlusTextWithUriMetadataSetExternalHeader_showImagesHeadline() {
+ fun test_displayImagesPlusTextWithUriMetadataSetHeader_showImagesHeadline() {
val loadedFileMetadata = createFileInfosWithMimeTypes("image/png", "image/jpeg")
val sharedFileCount = loadedFileMetadata.size
- val (previewView, headerParent) =
- testLoadingExternalHeadline("image/*", sharedFileCount, loadedFileMetadata)
+ val (previewView, headlineRow) =
+ testLoadingHeadline("image/*", sharedFileCount, loadedFileMetadata)
verify(headlineGenerator, times(1)).getImagesHeadline(sharedFileCount)
- verifyInternalHeadlineAbsence(previewView)
- verifyPreviewHeadline(headerParent, HEADLINE_IMAGES)
- verifyPreviewMetadata(headerParent, testMetadataText)
- verifySharedText(previewView)
- }
-
- @Test
- fun test_displayVideosPlusTextWithUriMetadataSet_showVideosHeadline() {
- val loadedFileMetadata = createFileInfosWithMimeTypes("video/mp4", "video/mp4")
- val sharedFileCount = loadedFileMetadata.size
- val previewView = testLoadingHeadline("video/*", sharedFileCount, loadedFileMetadata)
-
- verify(headlineGenerator, times(1)).getVideosHeadline(sharedFileCount)
- verifyPreviewHeadline(previewView, HEADLINE_VIDEOS)
- verifyPreviewMetadata(previewView, testMetadataText)
+ assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
+ verifyPreviewHeadline(headlineRow, HEADLINE_IMAGES)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
verifySharedText(previewView)
}
@Test
- fun test_displayVideosPlusTextWithUriMetadataSetExternalHeader_showVideosHeadline() {
+ fun test_displayVideosPlusTextWithUriMetadataSetHeader_showVideosHeadline() {
val loadedFileMetadata = createFileInfosWithMimeTypes("video/mp4", "video/mp4")
val sharedFileCount = loadedFileMetadata.size
- val (previewView, headerParent) =
- testLoadingExternalHeadline("video/*", sharedFileCount, loadedFileMetadata)
+ val (previewView, headlineRow) =
+ testLoadingHeadline("video/*", sharedFileCount, loadedFileMetadata)
verify(headlineGenerator, times(1)).getVideosHeadline(sharedFileCount)
- verifyInternalHeadlineAbsence(previewView)
- verifyPreviewHeadline(headerParent, HEADLINE_VIDEOS)
- verifyPreviewMetadata(headerParent, testMetadataText)
- verifySharedText(previewView)
- }
-
- @Test
- fun test_displayImagesAndVideosPlusTextWithUriMetadataSet_showFilesHeadline() {
- val loadedFileMetadata = createFileInfosWithMimeTypes("image/png", "video/mp4")
- val sharedFileCount = loadedFileMetadata.size
- val previewView = testLoadingHeadline("*/*", sharedFileCount, loadedFileMetadata)
-
- verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
- verifyPreviewHeadline(previewView, HEADLINE_FILES)
- verifyPreviewMetadata(previewView, testMetadataText)
+ assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
+ verifyPreviewHeadline(headlineRow, HEADLINE_VIDEOS)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
verifySharedText(previewView)
}
@Test
- fun test_displayImagesAndVideosPlusTextWithUriMetadataSetExternalHeader_showFilesHeadline() {
+ fun test_displayImagesAndVideosPlusTextWithUriMetadataSetHeader_showFilesHeadline() {
val loadedFileMetadata = createFileInfosWithMimeTypes("image/png", "video/mp4")
val sharedFileCount = loadedFileMetadata.size
- val (previewView, headerParent) =
- testLoadingExternalHeadline("*/*", sharedFileCount, loadedFileMetadata)
+ val (previewView, headlineRow) =
+ testLoadingHeadline("*/*", sharedFileCount, loadedFileMetadata)
verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
- verifyInternalHeadlineAbsence(previewView)
- verifyPreviewHeadline(headerParent, HEADLINE_FILES)
- verifyPreviewMetadata(headerParent, testMetadataText)
+ assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
+ verifyPreviewHeadline(headlineRow, HEADLINE_FILES)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
verifySharedText(previewView)
}
@Test
- fun test_displayDocsPlusTextWithUriMetadataSet_showFilesHeadline() {
+ fun test_displayDocsPlusTextWithUriMetadataSetHeader_showFilesHeadline() {
val loadedFileMetadata = createFileInfosWithMimeTypes("application/pdf", "application/pdf")
val sharedFileCount = loadedFileMetadata.size
- val previewView =
+ val (previewView, headlineRow) =
testLoadingHeadline("application/pdf", sharedFileCount, loadedFileMetadata)
verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
- verifyPreviewHeadline(previewView, HEADLINE_FILES)
- verifyPreviewMetadata(previewView, testMetadataText)
- verifySharedText(previewView)
- }
-
- @Test
- fun test_displayDocsPlusTextWithUriMetadataSetExternalHeader_showFilesHeadline() {
- val loadedFileMetadata = createFileInfosWithMimeTypes("application/pdf", "application/pdf")
- val sharedFileCount = loadedFileMetadata.size
- val (previewView, headerParent) =
- testLoadingExternalHeadline("application/pdf", sharedFileCount, loadedFileMetadata)
-
- verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
- verifyInternalHeadlineAbsence(previewView)
- verifyPreviewHeadline(headerParent, HEADLINE_FILES)
- verifyPreviewMetadata(headerParent, testMetadataText)
+ assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
+ verifyPreviewHeadline(headlineRow, HEADLINE_FILES)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
verifySharedText(previewView)
}
@@ -284,26 +194,33 @@ class FilesPlusTextContentPreviewUiTest {
testMetadataText,
)
val layoutInflater = LayoutInflater.from(context)
- val gridLayout = layoutInflater.inflate(R.layout.chooser_grid, null, false) as ViewGroup
+ val gridLayout =
+ layoutInflater.inflate(R.layout.chooser_grid_scrollable_preview, null, false)
+ as ViewGroup
+ val headlineRow = gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
- val previewView =
- testSubject.display(context.resources, LayoutInflater.from(context), gridLayout, null)
+ testSubject.display(
+ context.resources,
+ LayoutInflater.from(context),
+ gridLayout,
+ headlineRow
+ )
verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
verify(headlineGenerator, never()).getImagesHeadline(sharedFileCount)
- verifyPreviewHeadline(previewView, HEADLINE_FILES)
- verifyPreviewMetadata(previewView, testMetadataText)
+ verifyPreviewHeadline(headlineRow, HEADLINE_FILES)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
testSubject.updatePreviewMetadata(createFileInfosWithMimeTypes("image/png", "image/jpg"))
verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
verify(headlineGenerator, times(1)).getImagesHeadline(sharedFileCount)
- verifyPreviewHeadline(previewView, HEADLINE_IMAGES)
- verifyPreviewMetadata(previewView, testMetadataText)
+ verifyPreviewHeadline(headlineRow, HEADLINE_IMAGES)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
}
@Test
- fun test_uriMetadataIsMoreSpecificThanIntentMimeTypeExternalHeader_headlineGetsUpdated() {
+ fun test_uriMetadataIsMoreSpecificThanIntentMimeTypeHeader_headlineGetsUpdated() {
val sharedFileCount = 2
val testSubject =
FilesPlusTextContentPreviewUi(
@@ -322,14 +239,13 @@ class FilesPlusTextContentPreviewUiTest {
val gridLayout =
layoutInflater.inflate(R.layout.chooser_grid_scrollable_preview, null, false)
as ViewGroup
- val externalHeaderView =
- gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
+ val headlineRow = gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
- assertWithMessage("External headline should not be inflated by default")
- .that(externalHeaderView.findViewById<View>(R.id.headline))
+ assertWithMessage("Headline should not be inflated by default")
+ .that(headlineRow.findViewById<View>(R.id.headline))
.isNull()
- assertWithMessage("External metadata should not be inflated by default")
- .that(externalHeaderView.findViewById<View>(R.id.metadata))
+ assertWithMessage("Metadata should not be inflated by default")
+ .that(headlineRow.findViewById<View>(R.id.metadata))
.isNull()
val previewView =
@@ -337,57 +253,27 @@ class FilesPlusTextContentPreviewUiTest {
context.resources,
LayoutInflater.from(context),
gridLayout,
- externalHeaderView
+ headlineRow
)
verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
verify(headlineGenerator, never()).getImagesHeadline(sharedFileCount)
- verifyInternalHeadlineAbsence(previewView)
- verifyPreviewHeadline(externalHeaderView, HEADLINE_FILES)
- verifyPreviewMetadata(externalHeaderView, testMetadataText)
+ assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
+ verifyPreviewHeadline(headlineRow, HEADLINE_FILES)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
testSubject.updatePreviewMetadata(createFileInfosWithMimeTypes("image/png", "image/jpg"))
verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount)
verify(headlineGenerator, times(1)).getImagesHeadline(sharedFileCount)
- verifyPreviewHeadline(externalHeaderView, HEADLINE_IMAGES)
- verifyPreviewMetadata(externalHeaderView, testMetadataText)
+ verifyPreviewHeadline(headlineRow, HEADLINE_IMAGES)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
}
private fun testLoadingHeadline(
intentMimeType: String,
sharedFileCount: Int,
loadedFileMetadata: List<FileInfo>? = null,
- ): ViewGroup? {
- val testSubject =
- FilesPlusTextContentPreviewUi(
- testScope,
- /*isSingleImage=*/ false,
- sharedFileCount,
- SHARED_TEXT,
- intentMimeType,
- actionFactory,
- imageLoader,
- DefaultMimeTypeClassifier,
- headlineGenerator,
- testMetadataText,
- )
- val layoutInflater = LayoutInflater.from(context)
- val gridLayout = layoutInflater.inflate(R.layout.chooser_grid, null, false) as ViewGroup
-
- loadedFileMetadata?.let(testSubject::updatePreviewMetadata)
- return testSubject.display(
- context.resources,
- LayoutInflater.from(context),
- gridLayout,
- /*headlineViewParent=*/ null
- )
- }
-
- private fun testLoadingExternalHeadline(
- intentMimeType: String,
- sharedFileCount: Int,
- loadedFileMetadata: List<FileInfo>? = null,
): Pair<ViewGroup?, View> {
val testSubject =
FilesPlusTextContentPreviewUi(
@@ -406,15 +292,14 @@ class FilesPlusTextContentPreviewUiTest {
val gridLayout =
layoutInflater.inflate(R.layout.chooser_grid_scrollable_preview, null, false)
as ViewGroup
- val externalHeaderView =
- gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
+ val headlineRow = gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
- assertWithMessage("External headline should not be inflated by default")
- .that(externalHeaderView.findViewById<View>(R.id.headline))
+ assertWithMessage("Headline should not be inflated by default")
+ .that(headlineRow.findViewById<View>(R.id.headline))
.isNull()
- assertWithMessage("External metadata should not be inflated by default")
- .that(externalHeaderView.findViewById<View>(R.id.metadata))
+ assertWithMessage("Metadata should not be inflated by default")
+ .that(headlineRow.findViewById<View>(R.id.metadata))
.isNull()
loadedFileMetadata?.let(testSubject::updatePreviewMetadata)
@@ -422,8 +307,8 @@ class FilesPlusTextContentPreviewUiTest {
context.resources,
LayoutInflater.from(context),
gridLayout,
- externalHeaderView
- ) to externalHeaderView
+ headlineRow
+ ) to headlineRow
}
private fun createFileInfosWithMimeTypes(vararg mimeTypes: String): List<FileInfo> {
@@ -453,13 +338,4 @@ class FilesPlusTextContentPreviewUiTest {
private fun verifySharedText(previewView: ViewGroup?) {
verifyTextViewText(previewView, R.id.content_preview_text, SHARED_TEXT)
}
-
- private fun verifyInternalHeadlineAbsence(previewView: ViewGroup?) {
- assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
- assertWithMessage(
- "Preview headline should not be inflated when an external headline is used"
- )
- .that(previewView?.findViewById<View>(R.id.headline))
- .isNull()
- }
}
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/TextContentPreviewUiTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/TextContentPreviewUiTest.kt
index 1c96070c..9a15f90a 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/TextContentPreviewUiTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/TextContentPreviewUiTest.kt
@@ -44,9 +44,13 @@ class TextContentPreviewUiTest {
private val actionFactory =
object : ChooserContentPreviewUi.ActionFactory {
override fun getEditButtonRunnable(): Runnable? = null
+
override fun getCopyButtonRunnable(): Runnable? = null
+
override fun createCustomActions(): List<ActionRow.Action> = emptyList()
+
override fun getModifyShareAction(): ActionRow.Action? = null
+
override fun getExcludeSharedTextAction(): Consumer<Boolean> = Consumer<Boolean> {}
}
private val imageLoader = mock<ImageLoader>()
@@ -76,56 +80,35 @@ class TextContentPreviewUiTest {
@Test
fun test_display_headlineIsDisplayed() {
val layoutInflater = LayoutInflater.from(context)
- val gridLayout = layoutInflater.inflate(R.layout.chooser_grid, null, false) as ViewGroup
+ val gridLayout =
+ layoutInflater.inflate(R.layout.chooser_grid_scrollable_preview, null, false)
+ as ViewGroup
+ val headlineRow = gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
val previewView =
testSubject.display(
context.resources,
layoutInflater,
gridLayout,
- /*headlineViewParent=*/ null
+ headlineRow,
)
assertThat(previewView).isNotNull()
- val headlineView = previewView?.findViewById<TextView>(R.id.headline)
+ val headlineView = headlineRow.findViewById<TextView>(R.id.headline)
assertThat(headlineView).isNotNull()
assertThat(headlineView?.text).isEqualTo(text)
- val metadataView = previewView?.findViewById<TextView>(R.id.metadata)
+ val metadataView = headlineRow.findViewById<TextView>(R.id.metadata)
assertThat(metadataView).isNotNull()
assertThat(metadataView?.text).isEqualTo(testMetadataText)
}
@Test
- fun test_displayWithExternalHeaderView_externalHeaderIsDisplayed() {
+ fun test_display_albumHeadlineOverride() {
val layoutInflater = LayoutInflater.from(context)
val gridLayout =
layoutInflater.inflate(R.layout.chooser_grid_scrollable_preview, null, false)
as ViewGroup
- val externalHeaderView =
- gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
-
- assertThat(externalHeaderView.findViewById<View>(R.id.headline)).isNull()
- assertThat(externalHeaderView.findViewById<View>(R.id.metadata)).isNull()
-
- val previewView =
- testSubject.display(context.resources, layoutInflater, gridLayout, externalHeaderView)
-
- assertThat(previewView).isNotNull()
- assertThat(previewView.findViewById<View>(R.id.headline)).isNull()
- assertThat(previewView.findViewById<View>(R.id.metadata)).isNull()
-
- val headlineView = externalHeaderView.findViewById<TextView>(R.id.headline)
- assertThat(headlineView).isNotNull()
- assertThat(headlineView?.text).isEqualTo(text)
- val metadataView = externalHeaderView.findViewById<TextView>(R.id.metadata)
- assertThat(metadataView).isNotNull()
- assertThat(metadataView?.text).isEqualTo(testMetadataText)
- }
-
- @Test
- fun test_display_albumHeadlineOverride() {
- val layoutInflater = LayoutInflater.from(context)
- val gridLayout = layoutInflater.inflate(R.layout.chooser_grid, null, false) as ViewGroup
+ val headlineRow = gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
val albumSubject =
TextContentPreviewUi(
@@ -145,14 +128,14 @@ class TextContentPreviewUiTest {
context.resources,
layoutInflater,
gridLayout,
- /*headlineViewParent=*/ null
+ headlineRow,
)
assertThat(previewView).isNotNull()
- val headlineView = previewView?.findViewById<TextView>(R.id.headline)
+ val headlineView = headlineRow.findViewById<TextView>(R.id.headline)
assertThat(headlineView).isNotNull()
assertThat(headlineView?.text).isEqualTo(albumHeadline)
- val metadataView = previewView?.findViewById<TextView>(R.id.metadata)
+ val metadataView = headlineRow.findViewById<TextView>(R.id.metadata)
assertThat(metadataView).isNotNull()
assertThat(metadataView?.text).isEqualTo(testMetadataText)
}
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUiTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUiTest.kt
index faeaf133..98e6c381 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUiTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUiTest.kt
@@ -67,233 +67,100 @@ class UnifiedContentPreviewUiTest {
get() = getInstrumentation().context
@Test
- fun test_displayImagesWithoutUriMetadata_showImagesHeadline() {
- testLoadingHeadline("image/*", files = null) { previewView ->
+ fun test_displayImagesWithoutUriMetadataHeader_showImagesHeadline() {
+ testLoadingHeadline("image/*", files = null) { headlineRow ->
verify(headlineGenerator, times(1)).getImagesHeadline(2)
- verifyPreviewHeadline(previewView, IMAGE_HEADLINE)
- verifyPreviewMetadata(previewView, testMetadataText)
+ verifyPreviewHeadline(headlineRow, IMAGE_HEADLINE)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
}
}
@Test
- fun test_displayImagesWithoutUriMetadataExternalHeader_showImagesHeadline() {
- testLoadingExternalHeadline("image/*", files = null) { externalHeaderView ->
- verify(headlineGenerator, times(1)).getImagesHeadline(2)
- verifyPreviewHeadline(externalHeaderView, IMAGE_HEADLINE)
- verifyPreviewMetadata(externalHeaderView, testMetadataText)
- }
- }
-
- @Test
- fun test_displayVideosWithoutUriMetadata_showImagesHeadline() {
- testLoadingHeadline("video/*", files = null) { previewView ->
+ fun test_displayVideosWithoutUriMetadataHeader_showImagesHeadline() {
+ testLoadingHeadline("video/*", files = null) { headlineRow ->
verify(headlineGenerator, times(1)).getVideosHeadline(2)
- verifyPreviewHeadline(previewView, VIDEO_HEADLINE)
- verifyPreviewMetadata(previewView, testMetadataText)
- }
- }
-
- @Test
- fun test_displayVideosWithoutUriMetadataExternalHeader_showImagesHeadline() {
- testLoadingExternalHeadline("video/*", files = null) { externalHeaderView ->
- verify(headlineGenerator, times(1)).getVideosHeadline(2)
- verifyPreviewHeadline(externalHeaderView, VIDEO_HEADLINE)
- verifyPreviewMetadata(externalHeaderView, testMetadataText)
- }
- }
-
- @Test
- fun test_displayDocumentsWithoutUriMetadata_showImagesHeadline() {
- testLoadingHeadline("application/pdf", files = null) { previewView ->
- verify(headlineGenerator, times(1)).getFilesHeadline(2)
- verifyPreviewHeadline(previewView, FILES_HEADLINE)
- verifyPreviewMetadata(previewView, testMetadataText)
- }
- }
-
- @Test
- fun test_displayDocumentsWithoutUriMetadataExternalHeader_showImagesHeadline() {
- testLoadingExternalHeadline("application/pdf", files = null) { externalHeaderView ->
- verify(headlineGenerator, times(1)).getFilesHeadline(2)
- verifyPreviewHeadline(externalHeaderView, FILES_HEADLINE)
- verifyPreviewMetadata(externalHeaderView, testMetadataText)
+ verifyPreviewHeadline(headlineRow, VIDEO_HEADLINE)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
}
}
@Test
- fun test_displayMixedContentWithoutUriMetadata_showImagesHeadline() {
- testLoadingHeadline("*/*", files = null) { previewView ->
+ fun test_displayDocumentsWithoutUriMetadataHeader_showImagesHeadline() {
+ testLoadingHeadline("application/pdf", files = null) { headlineRow ->
verify(headlineGenerator, times(1)).getFilesHeadline(2)
- verifyPreviewHeadline(previewView, FILES_HEADLINE)
- verifyPreviewMetadata(previewView, testMetadataText)
+ verifyPreviewHeadline(headlineRow, FILES_HEADLINE)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
}
}
@Test
- fun test_displayMixedContentWithoutUriMetadataExternalHeader_showImagesHeadline() {
- testLoadingExternalHeadline("*/*", files = null) { externalHeader ->
+ fun test_displayMixedContentWithoutUriMetadataHeader_showImagesHeadline() {
+ testLoadingHeadline("*/*", files = null) { headlineRow ->
verify(headlineGenerator, times(1)).getFilesHeadline(2)
- verifyPreviewHeadline(externalHeader, FILES_HEADLINE)
- verifyPreviewMetadata(externalHeader, testMetadataText)
- }
- }
-
- @Test
- fun test_displayImagesWithUriMetadataSet_showImagesHeadline() {
- val uri = Uri.parse("content://pkg.app/image.png")
- val files =
- listOf(
- FileInfo.Builder(uri).withMimeType("image/png").build(),
- FileInfo.Builder(uri).withMimeType("image/jpeg").build(),
- )
- testLoadingHeadline("image/*", files) { preivewView ->
- verify(headlineGenerator, times(1)).getImagesHeadline(2)
- verifyPreviewHeadline(preivewView, IMAGE_HEADLINE)
+ verifyPreviewHeadline(headlineRow, FILES_HEADLINE)
+ verifyPreviewMetadata(headlineRow, testMetadataText)
}
}
@Test
- fun test_displayImagesWithUriMetadataSetExternalHeader_showImagesHeadline() {
+ fun test_displayImagesWithUriMetadataSetHeader_showImagesHeadline() {
val uri = Uri.parse("content://pkg.app/image.png")
val files =
listOf(
FileInfo.Builder(uri).withMimeType("image/png").build(),
FileInfo.Builder(uri).withMimeType("image/jpeg").build(),
)
- testLoadingExternalHeadline("image/*", files) { externalHeader ->
+ testLoadingHeadline("image/*", files) { headlineRow ->
verify(headlineGenerator, times(1)).getImagesHeadline(2)
- verifyPreviewHeadline(externalHeader, IMAGE_HEADLINE)
- }
- }
-
- @Test
- fun test_displayVideosWithUriMetadataSet_showImagesHeadline() {
- val uri = Uri.parse("content://pkg.app/image.png")
- val files =
- listOf(
- FileInfo.Builder(uri).withMimeType("video/mp4").build(),
- FileInfo.Builder(uri).withMimeType("video/mp4").build(),
- )
- testLoadingHeadline("video/*", files) { previewView ->
- verify(headlineGenerator, times(1)).getVideosHeadline(2)
- verifyPreviewHeadline(previewView, VIDEO_HEADLINE)
+ verifyPreviewHeadline(headlineRow, IMAGE_HEADLINE)
}
}
@Test
- fun test_displayVideosWithUriMetadataSetExternalHeader_showImagesHeadline() {
+ fun test_displayVideosWithUriMetadataSetHeader_showImagesHeadline() {
val uri = Uri.parse("content://pkg.app/image.png")
val files =
listOf(
FileInfo.Builder(uri).withMimeType("video/mp4").build(),
FileInfo.Builder(uri).withMimeType("video/mp4").build(),
)
- testLoadingExternalHeadline("video/*", files) { externalHeader ->
+ testLoadingHeadline("video/*", files) { headlineRow ->
verify(headlineGenerator, times(1)).getVideosHeadline(2)
- verifyPreviewHeadline(externalHeader, VIDEO_HEADLINE)
- }
- }
-
- @Test
- fun test_displayImagesAndVideosWithUriMetadataSet_showImagesHeadline() {
- val uri = Uri.parse("content://pkg.app/image.png")
- val files =
- listOf(
- FileInfo.Builder(uri).withMimeType("image/png").build(),
- FileInfo.Builder(uri).withMimeType("video/mp4").build(),
- )
- testLoadingHeadline("*/*", files) { previewView ->
- verify(headlineGenerator, times(1)).getFilesHeadline(2)
- verifyPreviewHeadline(previewView, FILES_HEADLINE)
+ verifyPreviewHeadline(headlineRow, VIDEO_HEADLINE)
}
}
@Test
- fun test_displayImagesAndVideosWithUriMetadataSetExternalHeader_showImagesHeadline() {
+ fun test_displayImagesAndVideosWithUriMetadataSetHeader_showImagesHeadline() {
val uri = Uri.parse("content://pkg.app/image.png")
val files =
listOf(
FileInfo.Builder(uri).withMimeType("image/png").build(),
FileInfo.Builder(uri).withMimeType("video/mp4").build(),
)
- testLoadingExternalHeadline("*/*", files) { externalHeader ->
+ testLoadingHeadline("*/*", files) { headlineRow ->
verify(headlineGenerator, times(1)).getFilesHeadline(2)
- verifyPreviewHeadline(externalHeader, FILES_HEADLINE)
+ verifyPreviewHeadline(headlineRow, FILES_HEADLINE)
}
}
@Test
- fun test_displayDocumentsWithUriMetadataSet_showImagesHeadline() {
+ fun test_displayDocumentsWithUriMetadataSetHeader_showImagesHeadline() {
val uri = Uri.parse("content://pkg.app/image.png")
val files =
listOf(
FileInfo.Builder(uri).withMimeType("application/pdf").build(),
FileInfo.Builder(uri).withMimeType("application/pdf").build(),
)
- testLoadingHeadline("application/pdf", files) { previewView ->
+ testLoadingHeadline("application/pdf", files) { headlineRow ->
verify(headlineGenerator, times(1)).getFilesHeadline(2)
- verifyPreviewHeadline(previewView, FILES_HEADLINE)
- }
- }
-
- @Test
- fun test_displayDocumentsWithUriMetadataSetExternalHeader_showImagesHeadline() {
- val uri = Uri.parse("content://pkg.app/image.png")
- val files =
- listOf(
- FileInfo.Builder(uri).withMimeType("application/pdf").build(),
- FileInfo.Builder(uri).withMimeType("application/pdf").build(),
- )
- testLoadingExternalHeadline("application/pdf", files) { externalHeader ->
- verify(headlineGenerator, times(1)).getFilesHeadline(2)
- verifyPreviewHeadline(externalHeader, FILES_HEADLINE)
+ verifyPreviewHeadline(headlineRow, FILES_HEADLINE)
}
}
private fun testLoadingHeadline(
intentMimeType: String,
files: List<FileInfo>?,
- verificationBlock: (ViewGroup?) -> Unit,
- ) {
- testScope.runTest {
- val endMarker = FileInfo.Builder(Uri.EMPTY).build()
- val emptySourceFlow = MutableSharedFlow<FileInfo>(replay = 1)
- val testSubject =
- UnifiedContentPreviewUi(
- testScope,
- /*isSingleImage=*/ false,
- intentMimeType,
- actionFactory,
- imageLoader,
- DefaultMimeTypeClassifier,
- object : TransitionElementStatusCallback {
- override fun onTransitionElementReady(name: String) = Unit
- override fun onAllTransitionElementsReady() = Unit
- },
- files?.let { it.asFlow() } ?: emptySourceFlow.takeWhile { it !== endMarker },
- /*itemCount=*/ 2,
- headlineGenerator,
- testMetadataText,
- )
- val layoutInflater = LayoutInflater.from(context)
- val gridLayout = layoutInflater.inflate(R.layout.chooser_grid, null, false) as ViewGroup
-
- val previewView =
- testSubject.display(
- context.resources,
- LayoutInflater.from(context),
- gridLayout,
- /*headlineViewParent=*/ null
- )
- emptySourceFlow.tryEmit(endMarker)
-
- verificationBlock(previewView)
- }
- }
-
- private fun testLoadingExternalHeadline(
- intentMimeType: String,
- files: List<FileInfo>?,
verificationBlock: (View?) -> Unit,
) {
testScope.runTest {
@@ -320,26 +187,20 @@ class UnifiedContentPreviewUiTest {
val gridLayout =
layoutInflater.inflate(R.layout.chooser_grid_scrollable_preview, null, false)
as ViewGroup
- val externalHeaderView =
- gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
+ val headlineRow = gridLayout.requireViewById<View>(R.id.chooser_headline_row_container)
- assertWithMessage("External headline should not be inflated by default")
- .that(externalHeaderView.findViewById<View>(R.id.headline))
+ assertWithMessage("Headline row should not be inflated by default")
+ .that(headlineRow.findViewById<View>(R.id.headline))
.isNull()
- val previewView =
- testSubject.display(
- context.resources,
- LayoutInflater.from(context),
- gridLayout,
- externalHeaderView,
- )
-
+ testSubject.display(
+ context.resources,
+ LayoutInflater.from(context),
+ gridLayout,
+ headlineRow,
+ )
emptySourceFlow.tryEmit(endMarker)
-
- verifyInternalHeadlineAbsence(previewView)
- verifyInternalMetadataAbsence(previewView)
- verificationBlock(externalHeaderView)
+ verificationBlock(headlineRow)
}
}
@@ -361,21 +222,4 @@ class UnifiedContentPreviewUiTest {
private fun verifyPreviewMetadata(headerViewParent: View?, expectedText: CharSequence) {
verifyTextViewText(headerViewParent, R.id.metadata, expectedText)
}
-
- private fun verifyInternalHeadlineAbsence(previewView: ViewGroup?) {
- assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
- assertWithMessage(
- "Preview headline should not be inflated when an external headline is used"
- )
- .that(previewView?.findViewById<View>(R.id.headline))
- .isNull()
- }
- private fun verifyInternalMetadataAbsence(previewView: ViewGroup?) {
- assertWithMessage("Preview parent should not be null").that(previewView).isNotNull()
- assertWithMessage(
- "Preview metadata should not be inflated when an external metadata is used"
- )
- .that(previewView?.findViewById<View>(R.id.metadata))
- .isNull()
- }
}
diff --git a/tests/unit/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProviderTest.kt b/tests/unit/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProviderTest.kt
new file mode 100644
index 00000000..fe3e844b
--- /dev/null
+++ b/tests/unit/src/com/android/intentresolver/emptystate/NoCrossProfileEmptyStateProviderTest.kt
@@ -0,0 +1,156 @@
+/*
+ * 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.emptystate
+
+import android.content.Intent
+import com.android.intentresolver.ProfileHelper
+import com.android.intentresolver.ResolverListAdapter
+import com.android.intentresolver.annotation.JavaInterop
+import com.android.intentresolver.data.repository.FakeUserRepository
+import com.android.intentresolver.domain.interactor.UserInteractor
+import com.android.intentresolver.inject.FakeIntentResolverFlags
+import com.android.intentresolver.shared.model.User
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import org.junit.Test
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyList
+import org.mockito.kotlin.argumentCaptor
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
+import org.mockito.kotlin.same
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+
+@OptIn(JavaInterop::class)
+class NoCrossProfileEmptyStateProviderTest {
+
+ private val personalUser = User(0, User.Role.PERSONAL)
+ private val workUser = User(10, User.Role.WORK)
+ private val flags = FakeIntentResolverFlags()
+ private val personalBlocker = mock<EmptyState>()
+ private val workBlocker = mock<EmptyState>()
+
+ private val userRepository = FakeUserRepository(listOf(personalUser, workUser))
+
+ private val personalIntents = listOf(Intent("PERSONAL"))
+ private val personalListAdapter =
+ mock<ResolverListAdapter> {
+ on { userHandle } doReturn personalUser.handle
+ on { intents } doReturn personalIntents
+ }
+ private val workIntents = listOf(Intent("WORK"))
+ private val workListAdapter =
+ mock<ResolverListAdapter> {
+ on { userHandle } doReturn workUser.handle
+ on { intents } doReturn workIntents
+ }
+
+ // Pretend that no intent can ever be forwarded
+ val crossProfileIntentsChecker =
+ mock<CrossProfileIntentsChecker> {
+ on {
+ hasCrossProfileIntents(
+ /* intents = */ anyList(),
+ /* source = */ anyInt(),
+ /* target = */ anyInt()
+ )
+ } doReturn false
+ }
+ private val sourceUserId = argumentCaptor<Int>()
+ private val targetUserId = argumentCaptor<Int>()
+
+ @Test
+ fun testPersonalToWork() {
+ val userInteractor = UserInteractor(userRepository, launchedAs = personalUser.handle)
+
+ val profileHelper =
+ ProfileHelper(
+ userInteractor,
+ CoroutineScope(Dispatchers.Unconfined),
+ Dispatchers.Unconfined,
+ flags
+ )
+
+ val provider =
+ NoCrossProfileEmptyStateProvider(
+ /* profileHelper = */ profileHelper,
+ /* noWorkToPersonalEmptyState = */ personalBlocker,
+ /* noPersonalToWorkEmptyState = */ workBlocker,
+ /* crossProfileIntentsChecker = */ crossProfileIntentsChecker
+ )
+
+ // Personal to personal, not blocked
+ assertThat(provider.getEmptyState(personalListAdapter)).isNull()
+ // Not called because sourceUser == targetUser
+ verify(crossProfileIntentsChecker, never())
+ .hasCrossProfileIntents(anyList(), anyInt(), anyInt())
+
+ // Personal to work, blocked
+ assertThat(provider.getEmptyState(workListAdapter)).isSameInstanceAs(workBlocker)
+
+ verify(crossProfileIntentsChecker, times(1))
+ .hasCrossProfileIntents(
+ same(workIntents),
+ sourceUserId.capture(),
+ targetUserId.capture()
+ )
+ assertThat(sourceUserId.firstValue).isEqualTo(personalUser.id)
+ assertThat(targetUserId.firstValue).isEqualTo(workUser.id)
+ }
+
+ @Test
+ fun testWorkToPersonal() {
+ val userInteractor = UserInteractor(userRepository, launchedAs = workUser.handle)
+
+ val profileHelper =
+ ProfileHelper(
+ userInteractor,
+ CoroutineScope(Dispatchers.Unconfined),
+ Dispatchers.Unconfined,
+ flags
+ )
+
+ val provider =
+ NoCrossProfileEmptyStateProvider(
+ /* profileHelper = */ profileHelper,
+ /* noWorkToPersonalEmptyState = */ personalBlocker,
+ /* noPersonalToWorkEmptyState = */ workBlocker,
+ /* crossProfileIntentsChecker = */ crossProfileIntentsChecker
+ )
+
+ // Work to work, not blocked
+ assertThat(provider.getEmptyState(workListAdapter)).isNull()
+ // Not called because sourceUser == targetUser
+ verify(crossProfileIntentsChecker, never())
+ .hasCrossProfileIntents(anyList(), anyInt(), anyInt())
+
+ // Work to personal, blocked
+ assertThat(provider.getEmptyState(personalListAdapter)).isSameInstanceAs(personalBlocker)
+
+ verify(crossProfileIntentsChecker, times(1))
+ .hasCrossProfileIntents(
+ same(personalIntents),
+ sourceUserId.capture(),
+ targetUserId.capture()
+ )
+ assertThat(sourceUserId.firstValue).isEqualTo(workUser.id)
+ assertThat(targetUserId.firstValue).isEqualTo(personalUser.id)
+ }
+}