diff options
130 files changed, 3287 insertions, 934 deletions
@@ -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<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 "`_Layout`", 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 "edit" in layout "image_preview_image_item" is missing from the following layout configurations: layout (present in layout-h480dp)" + errorLine1=" android:id="@+id/edit"" + 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=" <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=" <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'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'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'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'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'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="`<uses-sdk>` tag appears after `<application>` tag" + errorLine1=" <uses-sdk android:minSdkVersion="VanillaIceCream" android:targetSdkVersion="16"/>" + 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=" && 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=" && 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=" <uses-sdk android:minSdkVersion="VanillaIceCream" android:targetSdkVersion="16"/>" + 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<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<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<Array<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<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="true"" + 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="true"" + 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<Void, Void, List<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 `<TextView/>` and a compound drawable" + errorLine1=" <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="?androidprv:attr/materialColorSurfaceContainer">" + 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="?androidprv:attr/materialColorSurfaceContainer">" + 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="?androidprv:attr/materialColorSurfaceContainer">" + 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="?androidprv:attr/materialColorSurfaceContainer">" + 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=" <vector xmlns:android="http://schemas.android.com/apk/res/android"" + 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="http://schemas.android.com/aapt"" + 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=" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"" + 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="http://schemas.android.com/apk/res/android"" + 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=" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"" + 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="http://schemas.android.com/apk/res/android"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/IntentResolver/java/res/layout/resolver_list_per_profile.xml" + line="23" + column="9"/> + </issue> + + <issue + id="TypographyEllipsis" + message="Replace "..." with ellipsis character (…, &#8230;) ?" + errorLine1=" <string name="whichApplication" msgid="2309561338625872614">"... በመጠቀም ድርጊቱን አጠናቅ"</string>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/IntentResolver/java/res/values-am/strings.xml" + line="19" + column="65"/> + </issue> + + <issue + id="TypographyEllipsis" + message="Replace "..." with ellipsis character (…, &#8230;) ?" + errorLine1=" <string name="whichApplication" msgid="2309561338625872614">"Wykonaj czynność przez..."</string>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/IntentResolver/java/res/values-pl/strings.xml" + line="19" + column="65"/> + </issue> + + <issue + id="TypographyEllipsis" + message="Replace "..." with ellipsis character (…, &#8230;) ?" + errorLine1=" <string name="whichViewApplication" msgid="7660051361612888119">"...ဖြင့် ဖွင့်မည်"</string>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/IntentResolver/java/res/values-my/strings.xml" + line="22" + column="69"/> + </issue> + + <issue + id="TypographyEllipsis" + message="Replace "..." with ellipsis character (…, &#8230;) ?" + errorLine1=" <string name="whichEditApplication" msgid="5097563012157950614">"...နှင့် တည်းဖြတ်ရန်"</string>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/IntentResolver/java/res/values-my/strings.xml" + line="30" + column="69"/> + </issue> + + <issue + id="TypographyEllipsis" + message="Replace "..." with ellipsis character (…, &#8230;) ?" + errorLine1=" <string name="whichSendToApplication" msgid="2724450540348806267">"Sūtīšana, izmantojot..."</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=" <ImageView android:id="@android:id/icon"" + 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=" <ImageView android:id="@android:id/icon"" + 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=" <ImageView android:id="@android:id/icon"" + 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=" <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=" <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=" <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=" <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=" <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=" <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=" <ImageView android:id="@android:id/icon"" + 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=" <ImageView android:id="@android:id/icon"" + 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=" <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=" <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 "App name", should use `@string` resource" + errorLine1=" android:text="App name"" + 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=" <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) + } +} |