Merge "Update the imports to androidx.test.filters.*" into main
diff --git a/Android.bp b/Android.bp
index 598beb6..c4b9ad3 100644
--- a/Android.bp
+++ b/Android.bp
@@ -59,8 +59,6 @@
sdk_version: "system_current",
min_sdk_version: "29",
-
- lint: { strict_updatability_linting: true }
}
platform_compat_config {
@@ -68,39 +66,32 @@
src: ":DocumentsUI",
}
-filegroup {
- name: "DocumentsUI-srcs",
- srcs: [
- "src/**/*.java",
- ":statslog-docsui-java-gen",
- ],
-}
-
java_library {
name: "docsui-statsd",
srcs: [
":statslog-docsui-java-gen",
],
- lint: { strict_updatability_linting: true }
+ libs: [
+ "androidx.annotation_annotation",
+ ],
+ lint: {
+ strict_updatability_linting: true,
+ },
}
genrule {
name: "statslog-docsui-java-gen",
tools: ["stats-log-api-gen"],
cmd: "$(location stats-log-api-gen) --java $(out) --module docsui" +
- " --javaPackage com.android.documentsui --javaClass DocumentsStatsLog --minApiLevel 29",
+ " --javaPackage com.android.documentsui --javaClass DocumentsStatsLog --minApiLevel 29",
out: ["com/android/documentsui/DocumentsStatsLog.java"],
}
android_library {
- name: "DocumentsUI-res-lib",
+ name: "DocumentsUI-lib",
+ defaults: ["documentsui_defaults"],
- manifest: "AndroidManifest.xml",
-
- static_libs: [
- "androidx.appcompat_appcompat",
- "com.google.android.material_material",
- ],
+ manifest: "AndroidManifestLib.xml",
resource_dirs: [
"res",
@@ -110,40 +101,31 @@
"--auto-add-overlay",
],
+ srcs: [
+ "src/**/*.java",
+ ":statslog-docsui-java-gen",
+ ],
+
sdk_version: "system_current",
target_sdk_version: "33",
min_sdk_version: "29",
- lint: { strict_updatability_linting: true }
+ lint: {
+ baseline_filename: "lint-baseline.xml",
+ },
}
android_library {
- name: "DocumentsUIUnitTests-res-lib",
+ name: "DocumentsUIManifestLib",
+ defaults: ["documentsui_defaults"],
- manifest: "AndroidManifestForUnitTests.xml",
+ manifest: "AndroidManifest.xml",
- static_libs: [
- "androidx.appcompat_appcompat",
- "com.google.android.material_material",
- "modules-utils-build_system",
- ],
-
- resource_dirs: [
- "res",
- ],
-
- licenses: [
- "Android-Apache-2.0",
- "packages_apps_DocumentsUI_res_drawable_pd_license",
- ],
-
- aaptflags: [
- "--auto-add-overlay",
- ],
+ resource_dirs: [],
+ libs: ["DocumentsUI-lib"],
sdk_version: "system_current",
target_sdk_version: "33",
min_sdk_version: "29",
- lint: { strict_updatability_linting: true }
}
android_app {
@@ -153,13 +135,8 @@
manifest: "AndroidManifest.xml",
- srcs: [
- ":DocumentsUI-srcs",
- ],
-
- resource_dirs: [
- "res",
- ],
+ static_libs: ["DocumentsUI-lib"],
+ resource_dirs: [],
licenses: [
"Android-Apache-2.0",
@@ -170,6 +147,4 @@
min_sdk_version: "29",
updatable: true,
- lint: { strict_updatability_linting: true }
}
-
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ef86ab7..7680234 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -40,6 +40,9 @@
<uses-permission android:name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND"/>
+ <!-- Permissions required for reading device configs -->
+ <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/>
+
<application
android:name=".DocumentsApplication"
android:label="@string/app_label"
diff --git a/AndroidManifestForUnitTests.xml b/AndroidManifestLib.xml
similarity index 100%
rename from AndroidManifestForUnitTests.xml
rename to AndroidManifestLib.xml
diff --git a/lint-baseline.xml b/lint-baseline.xml
index c7db331..a89103e 100644
--- a/lint-baseline.xml
+++ b/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-dev" type="baseline" dependencies="true" variant="all" version="8.0.0-dev">
+<issues format="6" by="lint 8.4.0-alpha01" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha01">
<issue
id="NewApi"
diff --git a/perf-tests/Android.bp b/perf-tests/Android.bp
index d98c36c..4cf6c65 100644
--- a/perf-tests/Android.bp
+++ b/perf-tests/Android.bp
@@ -8,7 +8,6 @@
manifest: "AndroidManifest.xml",
srcs: [
- ":DocumentsUIPerfTests-files",
"src/**/*.java",
],
@@ -23,6 +22,7 @@
],
static_libs: [
+ "DocumentsUIPerfTests-lib",
"androidx.legacy_legacy-support-v4",
"androidx.test.rules",
"androidx.test.espresso.core",
diff --git a/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java b/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java
index 33ef73e..f7c295d 100644
--- a/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java
+++ b/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java
@@ -24,12 +24,12 @@
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
-import android.test.suitebuilder.annotation.LargeTest;
+
+import androidx.test.filters.LargeTest;
import com.android.documentsui.BaseActivity.EventListener;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.files.FilesActivity;
-import com.android.documentsui.ActivityTest;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java b/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java
index 6dd8044..8054c38 100644
--- a/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java
+++ b/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java
@@ -26,8 +26,8 @@
import android.support.test.jank.GfxMonitor;
import android.support.test.jank.JankTest;
import android.support.test.jank.JankTestBase;
-import android.test.suitebuilder.annotation.LargeTest;
+import androidx.test.filters.LargeTest;
import androidx.test.uiautomator.UiDevice;
import androidx.test.uiautomator.UiScrollable;
diff --git a/res/layout-sw720dp/item_doc_list.xml b/res/layout-sw720dp/item_doc_list.xml
index da91796..3013f31 100644
--- a/res/layout-sw720dp/item_doc_list.xml
+++ b/res/layout-sw720dp/item_doc_list.xml
@@ -95,12 +95,13 @@
android:orientation="horizontal">
<ImageView
- android:id="@+id/icon_briefcase"
+ android:id="@+id/icon_profile_badge"
android:layout_height="@dimen/briefcase_icon_size"
android:layout_width="@dimen/briefcase_icon_size"
android:layout_marginEnd="@dimen/briefcase_icon_margin"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_briefcase"
+ android:tint="?android:attr/colorAccent"
android:contentDescription="@string/a11y_work"/>
<TextView
diff --git a/res/layout/item_dir_grid.xml b/res/layout/item_dir_grid.xml
index 8720c37..bd690d4 100644
--- a/res/layout/item_dir_grid.xml
+++ b/res/layout/item_dir_grid.xml
@@ -81,11 +81,12 @@
</FrameLayout>
<ImageView
- android:id="@+id/icon_briefcase"
+ android:id="@+id/icon_profile_badge"
android:layout_height="@dimen/briefcase_icon_size"
android:layout_width="@dimen/briefcase_icon_size"
android:layout_marginEnd="@dimen/briefcase_icon_margin"
android:src="@drawable/ic_briefcase"
+ android:tint="?android:attr/colorAccent"
android:contentDescription="@string/a11y_work"/>
<TextView
diff --git a/res/layout/item_doc_grid.xml b/res/layout/item_doc_grid.xml
index 5e2e938..d654571 100644
--- a/res/layout/item_doc_grid.xml
+++ b/res/layout/item_doc_grid.xml
@@ -146,7 +146,7 @@
android:paddingEnd="12dp">
<ImageView
- android:id="@+id/icon_briefcase"
+ android:id="@+id/icon_profile_badge"
android:layout_height="@dimen/briefcase_icon_size"
android:layout_width="@dimen/briefcase_icon_size"
android:layout_marginEnd="@dimen/briefcase_icon_margin"
@@ -154,6 +154,7 @@
android:layout_alignBottom="@android:id/title"
android:gravity="center_vertical"
android:src="@drawable/ic_briefcase"
+ android:tint="?android:attr/colorAccent"
android:contentDescription="@string/a11y_work"/>
<TextView
@@ -161,7 +162,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
- android:layout_toEndOf="@+id/icon_briefcase"
+ android:layout_toEndOf="@+id/icon_profile_badge"
android:singleLine="true"
android:ellipsize="end"
android:textAlignment="viewStart"
diff --git a/res/layout/item_doc_list.xml b/res/layout/item_doc_list.xml
index 0942c4b..77494a2 100644
--- a/res/layout/item_doc_list.xml
+++ b/res/layout/item_doc_list.xml
@@ -92,12 +92,13 @@
android:layout_weight="1">
<ImageView
- android:id="@+id/icon_briefcase"
+ android:id="@+id/icon_profile_badge"
android:layout_height="@dimen/briefcase_icon_size"
android:layout_width="@dimen/briefcase_icon_size"
android:layout_marginEnd="@dimen/briefcase_icon_margin"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_briefcase"
+ android:tint="?android:attr/colorAccent"
android:contentDescription="@string/a11y_work" />
<TextView
diff --git a/res/layout/item_photo_grid.xml b/res/layout/item_photo_grid.xml
index 5cf6850..4581d3d 100644
--- a/res/layout/item_photo_grid.xml
+++ b/res/layout/item_photo_grid.xml
@@ -104,7 +104,7 @@
</FrameLayout>
<FrameLayout
- android:id="@+id/icon_briefcase"
+ android:id="@+id/icon_profile_badge"
android:layout_width="@dimen/button_touch_size"
android:layout_height="@dimen/button_touch_size"
android:layout_alignParentBottom="true"
@@ -116,6 +116,7 @@
android:layout_height="@dimen/briefcase_icon_size_photo"
android:layout_width="@dimen/briefcase_icon_size_photo"
android:src="@drawable/ic_briefcase_white"
+ android:tint="?android:attr/colorAccent"
android:padding="5dp"
android:background="@drawable/circle_button_background"
android:layout_gravity="center"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index b37f8de..7c2e20c 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Kan op die oomblik nie inhoud laai nie"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Werkapps is onderbreek"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Skakel werkprogramme aan"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> apps word gepouseer"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Skakel <xliff:g id="PROFILE">%1$s</xliff:g> apps aan"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Kan nie werklêers kies nie"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Jou IT-administrateur laat jou nie toe om van \'n persoonlike program af by werklêers in te gaan nie"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Kan nie persoonlike lêers kies nie"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Jou IT-administrateur laat jou nie toe om van \'n werkprogram af by persoonlike lêers in te gaan nie"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Kan nie <xliff:g id="PROFILE">%1$s</xliff:g> lêers kies nie"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Jou IT-admin laat jou nie toe om toegang tot <xliff:g id="PROFILE_0">%1$s</xliff:g> lêers vanaf ’n <xliff:g id="PROFILE_1">%2$s</xliff:g> app te kry nie"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Kan nie in jou werkprofiel stoor nie"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Jou IT-administrateur laat jou nie toe om jou persoonlike lêers in jou werkprofiel te stoor nie"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Kan nie in \'n persoonlike lêer stoor nie"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Jou IT-administrateur laat jou nie toe om werklêers in jou persoonlike lêer te stoor nie"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Kan nie in <xliff:g id="PROFILE">%1$s</xliff:g> profiel stoor nie"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Jou IT-admin laat jou nie toe om <xliff:g id="PROFILE_0">%1$s</xliff:g> lêers in jou <xliff:g id="PROFILE_1">%2$s</xliff:g> profiel te stoor nie"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Hierdie handeling word nie toegelaat nie"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Kontak jou IT-administrateur om meer te wete te kom"</string>
<string name="root_recent" msgid="1080156975424341623">"Onlangs"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nuwe naam"</string>
<string name="preview_file" msgid="4056622696305432343">"Voorbeskou die lêer <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Voorbeskou die werklêer <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Voorbeskou <xliff:g id="PROFILE">%1$s</xliff:g> lêer <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Blaai deur lêers in ander programme"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anoniem"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Gebruik hierdie vouer"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Kan nie hierdie vouer gebruik nie"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Kies \'n ander vouer om jou privaatheid te beskerm"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Skep nuwe vouer"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Deursoek hierdie foon"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Deursoek hierdie toestel"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Vee soekgeskiedenis uit: <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Persoonlik"</string>
<string name="work_tab" msgid="7265359366883747413">"Werk"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index e68194b..428783c 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"አሁን ይዘትን መጫን አልተቻለም"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"የስራ መተግበሪያዎች ባሉበት ቆመዋል"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"የሥራ መተግበሪያዎችን አብራ"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> መተግበሪያዎች ባሉበት ቆመዋል"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"የ<xliff:g id="PROFILE">%1$s</xliff:g> መተግበሪያዎችን ያብሩ"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"የሥራ ፋይሎችን መምረጥ አይቻልም"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"የእርስዎ አይቲ አስተዳዳሪ ከግል መተግበሪያ የሥራ ፋይሎችን እንዲደርሱ አይፈቅዱልዎትም"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"የግል ፋይሎችን መምረጥ አይቻልም"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"የእርስዎ አይቲ አስተዳዳሪ ከሥራ መተግበሪያ የግል ፋይሎችን እንዲደርሱባቸው አይፈቅዱልዎትም"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> ፋይሎችን መምረጥ አልተቻለም"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"የአይቲ አስተዳዳሪዎ የ<xliff:g id="PROFILE_0">%1$s</xliff:g> ፋይሎችን ከ<xliff:g id="PROFILE_1">%2$s</xliff:g> መተግበሪያ እንዲደርሱ አይፈቅድም"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"ወደ ሥራ መገለጫ ማስቀመጥ አይቻልም"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"የእርስዎ አይቲ አስተዳዳሪ ወደ የእርስዎ የግል ፋይሎችን ወደ የእርስዎ የሥራ ፋይሎች እንዲያስቀምጡ አይፈቅዱልዎትም"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"ወደ የግል መገለጫ ማስቀመጥ አይቻልም"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"የእርስዎ አይቲ አስተዳዳሪ ወደ የእርስዎ የግል መገለጫ የሥራ ፋይሎችን እርስዎ እንዲያስቀምጡ አይፈቅዱልዎትም"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"ወደ <xliff:g id="PROFILE">%1$s</xliff:g> መግለጫ ማስቀመጥ አይችሉም"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"የአይቲ አስተዳዳሪዎ የ<xliff:g id="PROFILE_0">%1$s</xliff:g> ፋይሎችን ወደ <xliff:g id="PROFILE_1">%2$s</xliff:g> መግለጫዎ እንዲያስቀምጡ አይፈቅድልዎትም"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"ይህ እርምጃ አይፈቀድም"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"የበለጠ ለመረዳት የእርስዎን አይቲ አስተዳዳሪ ያነጋግሩ"</string>
<string name="root_recent" msgid="1080156975424341623">"የቅርብ ጊዜ"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"አዲስ ስም"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> ፋይሉን በቅድመ ዕይታ ይመልከቱ"</string>
<string name="preview_work_file" msgid="4495643735563487273">"የሥራ ፋይሉን <xliff:g id="FILENAME">%1$s</xliff:g> በቅድመ ዕይታ አሳይ"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> ፋይሉን <xliff:g id="FILENAME">%2$s</xliff:g> በቅድመ ዕይታ ይመልከቱ"</string>
<string name="apps_row_title" msgid="3340490016663092925">"ፋይሎችን በሌሎች መተግበሪያዎች ውስጥ ያስሱ"</string>
<string name="anonymous_application" msgid="7633027057951625862">"ስም-አልባ"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ይህን አቃፊ ተጠቀም"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ይህን አቃፊ መጠቀም አይቻልም"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"ግላዊነትዎን ለመጠበቅ ሲባል ሌላ አቃፊ ይምረጡ"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"አዲስ አቃፊ ፍጠር"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ይህን ስልክ ይፈልጉ"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ይህንን መሣሪያ ይፈልጉ"</string>
<string name="delete_search_history" msgid="2202015025607694515">"የፍለጋ ታሪክ ይሰርዙ <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"የግል"</string>
<string name="work_tab" msgid="7265359366883747413">"ሥራ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index e13b308..0c5432a 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"يتعذر تحميل المحتوى في الوقت الحالي"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"تطبيقات العمل متوقفة مؤقتًا"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"تفعيل تطبيقات العمل"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"تطبيقات <xliff:g id="PROFILE">%1$s</xliff:g> متوقفة مؤقتًا"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"تفعيل تطبيقات <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"لا يمكن اختيار ملفات العمل"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"لا يسمح لك مشرف تكنولوجيا المعلومات بالوصول إلى ملفات العمل من تطبيق شخصي."</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"لا يمكن اختيار ملفات شخصية"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"لا يسمح لك مشرف تكنولوجيا المعلومات بالوصول إلى الملفات الشخصية من تطبيق عمل."</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"يتعذّر اختيار ملفات <xliff:g id="PROFILE">%1$s</xliff:g>."</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"لا يسمح لك مشرف تكنولوجيا المعلومات في مؤسستك بالوصول إلى ملفات <xliff:g id="PROFILE_0">%1$s</xliff:g> من خلال تطبيق <xliff:g id="PROFILE_1">%2$s</xliff:g>."</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"لا يمكن حفظ الملفات في الملف الشخصي للعمل"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"لا يسمح لك مشرف تكنولوجيا المعلومات بحفظ الملفات الشخصية في ملفك الشخصي للعمل."</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"لا يمكن حفظ الملفات في الملف الشخصي"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"لا يسمح لك مشرف تكنولوجيا المعلومات بحفظ ملفات العمل في ملفك الشخصي."</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"يتعذّر الحفظ في ملف <xliff:g id="PROFILE">%1$s</xliff:g>."</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"لا يسمح لك مشرف تكنولوجيا المعلومات في مؤسستك بحفظ ملفات <xliff:g id="PROFILE_0">%1$s</xliff:g> في ملف <xliff:g id="PROFILE_1">%2$s</xliff:g>."</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"هذا الإجراء غير مسموح به."</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"لمعرفة مزيد من المعلومات، يمكنك التواصل مع مشرف تكنولوجيا المعلومات."</string>
<string name="root_recent" msgid="1080156975424341623">"المحتوى المستخدَم أو المعدَّل مؤخرًا"</string>
@@ -354,6 +360,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"اسم جديد"</string>
<string name="preview_file" msgid="4056622696305432343">"معاينة الملف <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"معاينة ملف العمل <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"معاينة الملف \"<xliff:g id="FILENAME">%2$s</xliff:g>\" في <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"تصفّح الملفات في تطبيقات أخرى"</string>
<string name="anonymous_application" msgid="7633027057951625862">"مجهول"</string>
<string name="open_tree_button" msgid="6402871398424497776">"استخدام هذا المجلد"</string>
@@ -362,7 +369,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"لا يمكن استخدام هذا المجلد"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"لحماية خصوصيتك، اختَر مجلدًا آخر"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"إنشاء مجلد جديد"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"البحث في هذا الهاتف"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"البحث في هذا الجهاز"</string>
<string name="delete_search_history" msgid="2202015025607694515">"حذف سجلّ البحث <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"شخصي"</string>
<string name="work_tab" msgid="7265359366883747413">"للعمل"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 2c5c059..285cd0b 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"এই মুহূৰ্তত সমল ল\'ড কৰিব নোৱাৰি"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"কৰ্মস্থানৰ এপ্সমূহ পজ কৰা আছে"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"কৰ্মস্থানৰ এপ্সমূহ অন কৰক"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> এপ্ পজ কৰা আছে"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> এপ্ অন কৰক"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"কৰ্মস্থানৰ ফাইলসমূহ বাছনি কৰিব নোৱাৰি"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"আপোনাৰ আইটি প্ৰশাসকে আপোনাক কোনো ব্যক্তিগত এপৰ পৰা কর্মস্থানৰ ফাইলসমূহলৈ এক্সেছ কৰিবলৈ অনুমতি নিদিয়ে"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"ব্যক্তিগত ফাইলসমূহ বাছনি কৰিব নোৱাৰি"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"আপোনাৰ আইটি প্ৰশাসকে আপোনাক কোনো কৰ্মস্থানৰ এপৰ পৰা ব্যক্তিগত ফাইলসমূহলৈ এক্সেছ কৰিবলৈ অনুমতি নিদিয়ে"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g>ৰ ফাইলসমূহ বাছনি কৰিব নোৱাৰি"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"আপোনাৰ আইটি প্ৰশাসকে আপোনাক কোনো <xliff:g id="PROFILE_1">%2$s</xliff:g> এপৰ পৰা <xliff:g id="PROFILE_0">%1$s</xliff:g>ৰ ফাইলসমূহ এক্সেছ কৰিবলৈ নিদিয়ে"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"কৰ্মস্থানৰ প্ৰ\'ফাইলত ছেভ কৰিব নোৱাৰি"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"আপোনাৰ আইটি প্ৰশাসকে আপোনাক আপোনাৰ কর্মস্থানৰ প্ৰ\'ফাইলত ব্যক্তিগত ফাইলসমূহ ছেভ কৰিবলৈ অনুমতি নিদিয়ে"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"ব্যক্তিগত প্ৰফাইলত ছেভ কৰিব নোৱাৰি"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"আপোনাৰ আইটি প্ৰশাসকে আপোনাক আপোনাৰ ব্যক্তিগত প্ৰ\'ফাইলত কৰ্মস্থানৰ ফাইলসমূহ ছেভ কৰিবলৈ অনুমতি নিদিয়ে"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> প্ৰ’ফাইলত ছেভ কৰিব নোৱাৰি"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"আপোনাৰ আইটি প্ৰশাসকে আপোনাক আপোনাৰ <xliff:g id="PROFILE_1">%2$s</xliff:g> প্ৰ’ফাইলত <xliff:g id="PROFILE_0">%1$s</xliff:g>ৰ ফাইলসমূহ ছেভ কৰিবলৈ নিদিয়ে"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"এই কাৰ্যটোৰ অনুমতি নাই"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"অধিক জানিবলৈ আপোনাৰ আইটি প্ৰশাসকৰ সৈতে যোগাযোগ কৰক"</string>
<string name="root_recent" msgid="1080156975424341623">"শেহতীয়া"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"নতুন নাম"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> ফাইলটো পূৰ্বদৰ্শন কৰক"</string>
<string name="preview_work_file" msgid="4495643735563487273">"কৰ্মস্থানৰ ফাইলটো <xliff:g id="FILENAME">%1$s</xliff:g> পূৰ্বদৰ্শন কৰক"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g>ৰ <xliff:g id="FILENAME">%2$s</xliff:g> ফাইলটো পূৰ্বদৰ্শন কৰক"</string>
<string name="apps_row_title" msgid="3340490016663092925">"অন্য এপত ফাইল ব্ৰাউজ কৰক"</string>
<string name="anonymous_application" msgid="7633027057951625862">"পৰিচয়বিহীন"</string>
<string name="open_tree_button" msgid="6402871398424497776">"এই ফ\'ল্ডাৰটো ব্যৱহাৰ কৰক"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"এই ফ’ল্ডাৰটো ব্যৱহাৰ কৰিব নোৱাৰি"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"আপোনাৰ গোপনীয়তা সুৰক্ষিত কৰিবলৈ অন্য এটা ফ’ল্ডাৰ বাছনি কৰক"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"নতুন ফ\'ল্ডাৰ সৃষ্টি কৰক"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"এই ফ’নটো সন্ধান কৰক"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"এই ডিভাইচটো সন্ধান কৰক"</string>
<string name="delete_search_history" msgid="2202015025607694515">"সন্ধান ইতিহাস মচক <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"ব্যক্তিগত"</string>
<string name="work_tab" msgid="7265359366883747413">"কৰ্মস্থান"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 440a310..dfba630 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Məzmun hazırda yüklənmir"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"İş tətbiqləri durdurulub"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"İş tətbiqlərini aktiv edin"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> tətbiqləri durdurulub"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> tətbiqlərini aktiv edin"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"İş faylları seçmək olmur"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT admininiz şəxsi tətbiqdən iş fayllarına giriş icazəsi vermir"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Şəxsi faylları seçmək olmur"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT admininiz iş tətbiqindən şəxsi fayllara giriş icazəsi vermir"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> fayllarını seçmək olmur"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT admini <xliff:g id="PROFILE_1">%2$s</xliff:g> tətbiqindən <xliff:g id="PROFILE_0">%1$s</xliff:g> fayllarına giriş icazəsi vermir"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"İş profilində saxlamaq olmur"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT admininiz şəxsi fayllarınızı iş profilinizdə saxlamağa icazə vermir"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Şəxsi profildə saxlamaq olmur"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT admininiz iş fayllarınızı şəxsi profilinizdə saxlamağa icazə vermir"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> profilində yadda saxlamaq olmur"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT admini <xliff:g id="PROFILE_0">%1$s</xliff:g> fayllarını <xliff:g id="PROFILE_1">%2$s</xliff:g> profilində yadda saxlamağa icazə vermir"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Bu əməliyyata icazə verilmir"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Ətraflı məlumat üçün IT admininiz ilə əlaqə saxlayın"</string>
<string name="root_recent" msgid="1080156975424341623">"Son"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Yeni ad"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> faylını önizləyin"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> adlı iş faylına əvvəlcədən baxın"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> faylını (<xliff:g id="FILENAME">%2$s</xliff:g>) önizləyin"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Faylları digər tətbiqlərdə axtarın"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonim"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Bu qovluğu istifadə edin"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Bu qovluğu istifadə etmək mümkün deyil"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Məxfiliyinizi qorumaq üçün başqa qovluq seçin"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Yeni qovluq yaradın"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Bu telefonu axtarın"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Bu cihazda axtarın"</string>
<string name="delete_search_history" msgid="2202015025607694515">"<xliff:g id="TEXT">%1$s</xliff:g> üçün axtarış tarixçəsini silin"</string>
<string name="personal_tab" msgid="3878576287868528503">"Şəxsi"</string>
<string name="work_tab" msgid="7265359366883747413">"İş"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index d0c07ef..a131e26 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Učitavanje sadržaja trenutno nije moguće"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Poslovne aplikacije su pauzirane"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Uključi poslovne aplikacije"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Pauzirane su aplikacije profila: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Uključi aplikacije profila: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Ne možete da izaberete poslovne fajlove"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT administrator vam ne dozvoljava da pristupate datotekama za posao iz lične aplikacije"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Izbor ličnih datoteka nije uspeo"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT administrator vam ne dozvoljava da pristupate ličnim datotekama iz poslovne aplikacije"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Ne možete da izaberete fajlove sa profila: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT administrator ne dozvoljava da fajlovima na profilu: <xliff:g id="PROFILE_0">%1$s</xliff:g> pristupate iz aplikacije profila: <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Ne možete da sačuvate na poslovnom profilu"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT administrator vam ne dozvoljava da čuvate lične datoteke na poslovnom profilu"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Ne možete da sačuvate na ličnom profilu"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT administrator vam ne dozvoljava da čuvate datoteke za posao na ličnom profilu"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Ne možete da čuvate na profilu: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT administrator ne dozvoljava da fajlove sa profila: <xliff:g id="PROFILE_0">%1$s</xliff:g> čuvate na profilu: <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Ova radnja nije dozvoljena"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Obratite se IT administratoru da biste saznali više"</string>
<string name="root_recent" msgid="1080156975424341623">"Nedavno"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Novi naziv"</string>
<string name="preview_file" msgid="4056622696305432343">"Pregledajte datoteku <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Pregledajte datoteku za posao <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Pregledajte fajl <xliff:g id="FILENAME">%2$s</xliff:g> sa profila: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Pregledajte datoteke u drugim aplikacijama"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonimna"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Koristi ovaj folder"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Ne možete da koristite ovaj folder"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Da biste zaštitili privatnost, odaberite neki drugi folder"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Napravi novi folder"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Pretražite ovaj telefon"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Pretraži ovaj uređaj"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Izbrišite istoriju pretrage <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Lično"</string>
<string name="work_tab" msgid="7265359366883747413">"Posao"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 3443572..4c2a98c 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Зараз немагчыма загрузіць змесціва"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Працоўныя праграмы прыпынены"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Уключыць працоўныя праграмы"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Праграмы тыпу \"<xliff:g id="PROFILE">%1$s</xliff:g>\" прыпынены"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Уключыць праграмы тыпу \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Не ўдалося выбраць працоўныя файлы"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Ваш ІТ-адміністратар забараняе мець доступ да працоўных файлаў з асабістай праграмы"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Не ўдалося выбраць асабістыя файлы"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Ваш ІТ-адміністратар забараняе мець доступ да асабістых файлаў з працоўнай праграмы"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Выбіраць файлы тыпу \"<xliff:g id="PROFILE">%1$s</xliff:g>\" нельга"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT-адміністратар не дазваляе вам атрымліваць доступ да файлаў тыпу \"<xliff:g id="PROFILE_0">%1$s</xliff:g>\" праз праграму тыпу \"<xliff:g id="PROFILE_1">%2$s</xliff:g>\""</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Не ўдалося захаваць у працоўным профілі"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Ваш ІТ-адміністратар забараняе захоўваць асабістыя файлы ў працоўным профілі"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Не ўдалося захаваць у асабістым профілі"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Ваш ІТ-адміністратар забараняе захоўваць працоўныя файлы ў асабістым профілі"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Захоўваць файлы ў профілі тыпу \"<xliff:g id="PROFILE">%1$s</xliff:g>\" нельга"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT-адміністратар не дазваляе вам захоўваць у вашым профілі (тып: <xliff:g id="PROFILE_1">%2$s</xliff:g>) файлы тыпу \"<xliff:g id="PROFILE_0">%1$s</xliff:g>\""</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Недапушчальнае дзеянне"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Каб даведацца больш, звярніцеся да ІT-адміністратара"</string>
<string name="root_recent" msgid="1080156975424341623">"Апошнія"</string>
@@ -310,6 +316,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Новая назва"</string>
<string name="preview_file" msgid="4056622696305432343">"Папярэдні прагляд файла \"<xliff:g id="FILENAME">%1$s</xliff:g>\""</string>
<string name="preview_work_file" msgid="4495643735563487273">"Перадпрагляд працоўнага файла \"<xliff:g id="FILENAME">%1$s</xliff:g>\""</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Папярэдні прагляд файла тыпу \"<xliff:g id="PROFILE">%1$s</xliff:g>\", які мае назву \"<xliff:g id="FILENAME">%2$s</xliff:g>\""</string>
<string name="apps_row_title" msgid="3340490016663092925">"Пошук файлаў у іншых праграмах"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Ананімная"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Выкарыстоўваць гэту папку"</string>
@@ -318,7 +325,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Не ўдалося скарыстаць гэту папку"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Для аховы вашай прыватнасці выберыце іншую папку"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Стварыць новую папку"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Пошук на гэтым тэлефоне"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Пошук на гэтай прыладзе"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Выдаліць гісторыю пошуку <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Асабісты"</string>
<string name="work_tab" msgid="7265359366883747413">"Працоўны"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 8f9ae67..2313b50 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Понастоящем съдържанието не може да се зареди"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Служебните приложения са поставени на пауза"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Включване на служебните приложения"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> приложения са поставени на пауза"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Включване на <xliff:g id="PROFILE">%1$s</xliff:g> приложения"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Избирането на служебни файлове не е възможно"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Системният ви администратор не разрешава достъпа до служебните ви файлове от лично приложение"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Избирането на лични файлове не е възможно"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Системният ви администратор не разрешава достъпа до личните ви файлове от служебно приложение"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Не можете да избирате <xliff:g id="PROFILE">%1$s</xliff:g> файлове"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Системният ви администратор не разрешава достъп до <xliff:g id="PROFILE_0">%1$s</xliff:g> файлове от <xliff:g id="PROFILE_1">%2$s</xliff:g> приложение"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Запазването в служебния потребителски профил не е възможно"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Системният ви администратор не разрешава да запазвате лични файлове в служебния си потребителски профил"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Запазването в личния потребителски профил не е възможно"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Системният ви администратор не разрешава да запазвате служебни файлове в личния си потребителски профил"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Не можете да запазвате в <xliff:g id="PROFILE">%1$s</xliff:g> потребителски профил"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Системният ви администратор не разрешава да запазвате <xliff:g id="PROFILE_0">%1$s</xliff:g> файлове в <xliff:g id="PROFILE_1">%2$s</xliff:g> потребителски профил"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Това действие не е разрешено"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"За да научите повече, обърнете се към системния си администратор"</string>
<string name="root_recent" msgid="1080156975424341623">"Скорошни"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Ново име"</string>
<string name="preview_file" msgid="4056622696305432343">"Визуализация на файла <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Визуализация на служебния файл <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Визуализация на <xliff:g id="PROFILE">%1$s</xliff:g> файл <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Преглед на файлове в други приложения"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Анонимно"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Използване на тази папка"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Тази папка не може да се използва"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Изберете друга папка, за да защитите поверителността си"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Създаване на нова папка"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Търсете в този телефон"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Търсете в това устройство"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Изтриване на <xliff:g id="TEXT">%1$s</xliff:g> от историята на търсенията"</string>
<string name="personal_tab" msgid="3878576287868528503">"Лични"</string>
<string name="work_tab" msgid="7265359366883747413">"Служебни"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 9cb1344..f51afc5 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"এই মুহূর্তে কন্টেন্ট লোড করা যাবে না"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"অফিসের অ্যাপ পজ করা আছে"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"অফিসের অ্যাপ চালু করুন"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> অ্যাপ পজ করা হয়েছে"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> অ্যাপ চালু করুন"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"অফিসের ফাইল বেছে নেওয়া যাচ্ছে না"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"আপনার আইটি অ্যাডমিন আপনাকে ব্যক্তিগত অ্যাপ থেকে অফিসের ফাইল অ্যাক্সেস করতে দেয় না"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"ব্যক্তিগত ফাইল বেছে নেওয়া যাচ্ছে না"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"আপনার আইটি অ্যাডমিন আপনাকে অফিস অ্যাপ থেকে ব্যক্তিগত ফাইল অ্যাক্সেস করতে দেয় না"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> ফাইল বেছে নিতে পারে না"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"আপনার আইটি অ্যাডমিন আপনাকে <xliff:g id="PROFILE_1">%2$s</xliff:g> অ্যাপ থেকে <xliff:g id="PROFILE_0">%1$s</xliff:g> ফাইল অ্যাক্সেস করার অনুমতি দেয় না"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"অফিস প্রোফাইলে সেভ করা যাচ্ছে না"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"আপনার আইটি অ্যাডমিন আপনাকে অফিস প্রোফাইলে ব্যক্তিগত ফাইল সেভ করার অনুমতি দেয় না"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"ব্যক্তিগত প্রোফাইলে সেভ করা যাচ্ছে না"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"আপনার আইটি অ্যাডমিন আপনাকে ব্যক্তিগত প্রোফাইলে অফিসের ফাইল সেভ করার অনুমতি দেয় না"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> প্রোফাইলে সেভ করতে পারে না"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"আপনার আইটি অ্যাডমিন আপনার <xliff:g id="PROFILE_1">%2$s</xliff:g> প্রোফাইলে <xliff:g id="PROFILE_0">%1$s</xliff:g> ফাইল সেভ করার অনুমতি দেয় না"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"এটি করা যাবে না"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"আরও জানতে, আপনার আইটি অ্যাডমিনের সাথে যোগাযোগ করুন"</string>
<string name="root_recent" msgid="1080156975424341623">"সাম্প্রতিক"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"নতুন নাম"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> ফাইলের প্রিভিউ দেখুন"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> অফিস ফাইলের প্রিভিউ দেখুন"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="FILENAME">%2$s</xliff:g> <xliff:g id="PROFILE">%1$s</xliff:g> ফাইলের প্রিভিউ দেখুন"</string>
<string name="apps_row_title" msgid="3340490016663092925">"অন্যান্য অ্যাপে ফাইল ব্রাউজ করুন"</string>
<string name="anonymous_application" msgid="7633027057951625862">"বেনামী"</string>
<string name="open_tree_button" msgid="6402871398424497776">"এই ফোল্ডার ব্যবহার করুন"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"এই ফোল্ডার ব্যবহার করা যাচ্ছে না"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"আপনার গোপনীয়তা সুরক্ষিত রাখতে, অন্য ফোল্ডার বেছে নিন"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"নতুন ফোল্ডার তৈরি করুন"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"এই ফোনে খুঁজুন"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"এই ডিভাইসে খুঁজুন"</string>
<string name="delete_search_history" msgid="2202015025607694515">"সার্চের ইতিহাস মুছুন <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"ব্যক্তিগত"</string>
<string name="work_tab" msgid="7265359366883747413">"অফিস"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 3e2af17..645188d 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Trenutno nije moguće učitati sadržaj"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Poslovne aplikacije su pauzirane"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Uključi poslovne aplikacije"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Aplikacije profila \"<xliff:g id="PROFILE">%1$s</xliff:g>\" su pauzirane"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Uključi aplikacije profila \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Nije moguće odabrati poslovne fajlove"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT administrator vam ne dozvoljava da pristupate poslovnim fajlovima iz lične aplikacije"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Nije moguće odabrati lične fajlove"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT administrator vam ne dozvoljava da pristupate ličnim fajlovima iz poslovne aplikacije"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Nije moguće odabrati fajlove s profila \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT administrator vam ne dozvoljava da pristupite fajlovima s profila \"<xliff:g id="PROFILE_0">%1$s</xliff:g>\" iz aplikacije profila \"<xliff:g id="PROFILE_1">%2$s</xliff:g>\""</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Nije moguće sačuvati na radni profil"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT administrator vam ne dozvoljava da pohranjujete lične fajlove na radni profil"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Nije moguće sačuvati na lični profil"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT administrator vam ne dozvoljava da pohranjujete poslovne fajlove na lični profil"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Nije moguće sačuvati na profil \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT administrator vam ne dozvoljava da sačuvate fajlove s profila \"<xliff:g id="PROFILE_0">%1$s</xliff:g>\" na profil \"<xliff:g id="PROFILE_1">%2$s</xliff:g>\""</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Ta radnja nije dopuštena"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Da saznate više, kontaktirajte IT administratora"</string>
<string name="root_recent" msgid="1080156975424341623">"Nedavno"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Novo ime"</string>
<string name="preview_file" msgid="4056622696305432343">"Pregled fajla <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Pregledajte poslovni fajl <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Pregled fajla <xliff:g id="FILENAME">%2$s</xliff:g> s profila \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
<string name="apps_row_title" msgid="3340490016663092925">"Pretraživanje fajlova u drugim aplikacijama"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonimno"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Koristi ovaj folder"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Nije moguće koristiti ovaj folder"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Da zaštitite svoju privatnost, odaberite drugi folder"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Napravi novi folder"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Pretražite ovaj telefon"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Pretražite uređaj"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Izbriši historiju pretraživanja <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Lično"</string>
<string name="work_tab" msgid="7265359366883747413">"Poslovno"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index fdc9ec6..7a3b083 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"En aquest moment no es pot carregar el contingut"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Les aplicacions de treball estan en pausa"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Activa les aplicacions de treball"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Les aplicacions d\'aquest perfil (<xliff:g id="PROFILE">%1$s</xliff:g>) s\'han posat en pausa"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Activa les aplicacions d\'aquest perfil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"No es poden seleccionar els fitxers de treball"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"L\'administrador de TI no et permet accedir als fitxers de treball des de l\'aplicació personal"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"No es poden seleccionar els fitxers personals"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"L\'administrador de TI no et permet accedir als fitxers personals des de l\'aplicació de treball"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"No es poden seleccionar fitxers d\'aquest perfil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"L\'administrador de TI no et permet accedir a fitxers d\'un perfil (<xliff:g id="PROFILE_0">%1$s</xliff:g>) des d\'una aplicació de l\'altre perfil (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"No es pot desar al perfil de treball"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"L\'administrador de TI no et permet desar fitxers personals al teu perfil de treball"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"No es pot desar al perfil personal"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"L\'administrador de TI no et permet desar fitxers de treball al teu perfil personal"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"No es pot desar en aquest perfil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"L\'administrador de TI no et permet desar fitxers d\'un perfil (<xliff:g id="PROFILE_0">%1$s</xliff:g>) a l\'altre perfil (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Aquesta acció no està permesa"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Per obtenir més informació, contacta amb l\'administrador de TI"</string>
<string name="root_recent" msgid="1080156975424341623">"Recents"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nom nou"</string>
<string name="preview_file" msgid="4056622696305432343">"Previsualitza el fitxer <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Previsualitza el fitxer de treball <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Previsualitza el fitxer <xliff:g id="FILENAME">%2$s</xliff:g> d\'aquest perfil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Cerca fitxers en altres aplicacions"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anònima"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Utilitza aquesta carpeta"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"No es pot utilitzar aquesta carpeta"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Per protegir la teva privadesa, tria una altra carpeta"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Crea una carpeta"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Cerca en aquest telèfon"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Cerca en aquest dispositiu"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Suprimeix l\'historial de cerques <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personal"</string>
<string name="work_tab" msgid="7265359366883747413">"Treball"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 27aba7e..44ee419 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Obsah teď nelze načíst"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Pracovní aplikace jsou pozastaveny"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Zapnout pracovní aplikace"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> aplikace jsou pozastaveny"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Zapnout <xliff:g id="PROFILE">%1$s</xliff:g> aplikace"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Pracovní soubory nelze vybrat"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Administrátor IT nepovoluje otevírat pracovní soubory pomocí osobní aplikace"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Osobní soubory nelze vybrat"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Administrátor IT nepovoluje otevírat osobní soubory pomocí pracovní aplikace"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> soubory nelze vybrat"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Administrátor IT nepovoluje přístup k <xliff:g id="PROFILE_0">%1$s</xliff:g> profilům z <xliff:g id="PROFILE_1">%2$s</xliff:g> aplikace"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Do pracovního profilu nelze ukládat"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Administrátor IT nepovoluje ukládat osobní soubory do pracovního profilu"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Do osobního profilu nelze ukládat"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Administrátor IT nepovoluje ukládat pracovní soubory do osobního profilu"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Do <xliff:g id="PROFILE">%1$s</xliff:g> profilu nelze ukládat"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Administrátor IT nepovoluje ukládat <xliff:g id="PROFILE_0">%1$s</xliff:g> soubory do <xliff:g id="PROFILE_1">%2$s</xliff:g> profilu"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Tato akce není povolena"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Další informace vám poskytne administrátor IT"</string>
<string name="root_recent" msgid="1080156975424341623">"Nedávné"</string>
@@ -310,6 +316,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nový název"</string>
<string name="preview_file" msgid="4056622696305432343">"Zobrazit náhled souboru <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Náhled pracovního souboru <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Zobrazit náhled <xliff:g id="PROFILE">%1$s</xliff:g> souboru <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Procházet soubory v ostatních aplikacích"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonymní"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Použít tuto složku"</string>
@@ -318,7 +325,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Tuto složku nelze použít"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Z důvodu ochrany soukromí zvolte jinou složku"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Vytvořit novou složku"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Hledat v telefonu"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Prohledat tohle zařízení"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Vymazat historii vyhledávání <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Osobní"</string>
<string name="work_tab" msgid="7265359366883747413">"Pracovní"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index bd7d89d..c0d5cf0 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Der kan ikke indlæses indhold i øjeblikket"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Dine arbejdsapps er sat på pause"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Aktivér arbejdsapps"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g>-apps er sat på pause"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Aktivér <xliff:g id="PROFILE">%1$s</xliff:g>-apps"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Arbejdsfiler kan ikke vælges"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Din it-administrator har ikke givet dig tilladelse til at åbne arbejdsfiler fra en personlig app"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Personlige filer kan ikke vælges"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Din it-administrator har ikke givet dig tilladelse til at åbne personlige filer fra en arbejdsapp"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Kan ikke vælge <xliff:g id="PROFILE">%1$s</xliff:g>-filer"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Din it-administrator tillader ikke, at du tilgår <xliff:g id="PROFILE_0">%1$s</xliff:g>-filer via en <xliff:g id="PROFILE_1">%2$s</xliff:g> app"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Filerne kan ikke gemmes på din arbejdsprofil"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Din it-administrator har ikke givet dig tilladelse til at gemme personlige filer på din arbejdsprofil"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Filerne kan ikke gemmes på den personlige profil"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Din it-administrator har ikke givet dig tilladelse til at gemme arbejdsfiler på din personlige profil"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Kan ikke gemme i <xliff:g id="PROFILE">%1$s</xliff:g>-profil"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Din it-administrator tillader ikke, at du gemmer <xliff:g id="PROFILE_0">%1$s</xliff:g> filer på din <xliff:g id="PROFILE_1">%2$s</xliff:g>-profil"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Denne handling er ikke tilladt"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Kontakt din it-administrator for at få flere oplysninger"</string>
<string name="root_recent" msgid="1080156975424341623">"Seneste"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nyt navn"</string>
<string name="preview_file" msgid="4056622696305432343">"Se forhåndsvisning af filen <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Se en forhåndsvisning af arbejdsfilen <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Se forhåndsvisning af <xliff:g id="PROFILE">%1$s</xliff:g>-filen <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Gennemse filer i andre apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonym"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Brug denne mappe"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Denne mappe kan ikke bruges"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"For at beskytte dit privatliv skal du vælge en anden mappe"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Opret ny mappe"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Søg på denne telefon"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Søg på denne enhed"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Slet søgehistorikken <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personlig"</string>
<string name="work_tab" msgid="7265359366883747413">"Arbejde"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 978822d..381f3b6 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Inhalte können momentan nicht geladen werden"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Geschäftliche Apps sind pausiert"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Geschäftliche Apps aktivieren"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Apps aus dem Profil „<xliff:g id="PROFILE">%1$s</xliff:g>“ sind pausiert"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Apps aus dem Profil „<xliff:g id="PROFILE">%1$s</xliff:g>“ aktivieren"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Auswahl geschäftlicher Dateien nicht möglich"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Dein IT-Administrator hat festgelegt, dass du geschäftliche Dateien nicht mit einer privaten App aufrufen darfst"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Auswahl persönlicher Dateien nicht möglich"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Dein IT-Administrator hat festgelegt, dass du persönliche Dateien nicht mit einer geschäftlichen App aufrufen darfst"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Auswahl von Dateien aus dem Profil „<xliff:g id="PROFILE">%1$s</xliff:g>“ nicht möglich"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Dein IT-Administrator lässt den Zugriff auf Dateien aus dem Profil „<xliff:g id="PROFILE_0">%1$s</xliff:g>“ aus einer App „<xliff:g id="PROFILE_1">%2$s</xliff:g>“ nicht zu"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Speichern im Arbeitsprofil nicht möglich"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Dein IT-Administrator hat festgelegt, dass du persönliche Dateien nicht in deinem Arbeitsprofil speichern darfst"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Speichern im privaten Profil nicht möglich"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Dein IT-Administrator hat festgelegt, dass du geschäftliche Dateien nicht in deinem privaten Profil speichern darfst"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Speichern im Profil „<xliff:g id="PROFILE">%1$s</xliff:g>“ nicht möglich"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Dein IT-Administrator lässt das Speichern von Dateien aus dem Profil „<xliff:g id="PROFILE_0">%1$s</xliff:g>“ in deinem Profil „<xliff:g id="PROFILE_1">%2$s</xliff:g>“ nicht zu"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Diese Aktion ist nicht zulässig"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Wenn du mehr wissen möchtest, wende dich bitte an deinen IT-Administrator"</string>
<string name="root_recent" msgid="1080156975424341623">"Zuletzt verwendet"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Neuer Name"</string>
<string name="preview_file" msgid="4056622696305432343">"Datei \"<xliff:g id="FILENAME">%1$s</xliff:g>\" als Vorschau ansehen"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Vorschau der geschäftlichen Datei \"<xliff:g id="FILENAME">%1$s</xliff:g>\""</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Datei „<xliff:g id="FILENAME">%2$s</xliff:g>“ aus dem Profil „<xliff:g id="PROFILE">%1$s</xliff:g>“ als Vorschau ansehen"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Dateien in anderen Apps ansehen"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonym"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Diesen Ordner verwenden"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Dieser Ordner kann nicht verwendet werden"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Zum Schutz deiner Daten einen anderen Ordner auswählen"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Neuen Ordner erstellen"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Auf diesem Smartphone suchen"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Auf diesem Gerät suchen"</string>
<string name="delete_search_history" msgid="2202015025607694515">"<xliff:g id="TEXT">%1$s</xliff:g>-Suchverlauf löschen"</string>
<string name="personal_tab" msgid="3878576287868528503">"Privat"</string>
<string name="work_tab" msgid="7265359366883747413">"Geschäftlich"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 99d9f85..9233d5d 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Δεν είναι δυνατή η φόρτωση περιεχομένου τώρα"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Οι εφαρμογές εργασίας τέθηκαν σε παύση"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Ενεργοποίηση εφαρμογών εργασιών"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Οι εφαρμογές του προφίλ <xliff:g id="PROFILE">%1$s</xliff:g> έχουν τεθεί σε παύση"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Ενεργοποίηση εφαρμογών του προφίλ <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Δεν είναι δυνατή η επιλογή αρχείων εργασίας."</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Ο διαχειριστής δεν επιτρέπει την πρόσβαση σε αρχεία εργασίας από μια προσωπική εφαρμογή."</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Δεν είναι δυνατή η επιλογή προσωπικών αρχείων."</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Ο διαχειριστής ΙΤ δεν επιτρέπει την πρόσβαση σε προσωπικά αρχεία από μια εφαρμογή εργασιών."</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Δεν είναι δυνατή η επιλογή αρχείων του προφίλ <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Ο διαχειριστής IT δεν επιτρέπει την πρόσβαση σε αρχεία του προφίλ <xliff:g id="PROFILE_0">%1$s</xliff:g> από μια εφαρμογή του προφίλ <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Δεν είναι δυνατή η αποθήκευση στο προφίλ εργασίας."</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Ο διαχειριστής IT δεν επιτρέπει την αποθήκευση προσωπικών αρχείων στο προφίλ εργασίας σας."</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Δεν είναι δυνατή η αποθήκευση στο προσωπικό σας προφίλ."</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Ο διαχειριστής ΙΤ δεν επιτρέπει την αποθήκευση αρχείων εργασίας στο προσωπικό σας προφίλ."</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Δεν είναι δυνατή η αποθήκευση του προφίλ <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Ο διαχειριστής IT δεν επιτρέπει την αποθήκευση αρχείων του προφίλ <xliff:g id="PROFILE_0">%1$s</xliff:g> στο προφίλ <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Η συγκεκριμένη ενέργεια δεν επιτρέπεται."</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Για να μάθετε περισσότερα, επικοινωνήστε με τον διαχειριστή IT."</string>
<string name="root_recent" msgid="1080156975424341623">"Πρόσφατα"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Νέο όνομα"</string>
<string name="preview_file" msgid="4056622696305432343">"Προεπισκόπηση του αρχείου <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Προεπισκόπηση του αρχείου εργασίας <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Προεπισκόπηση του αρχείου <xliff:g id="FILENAME">%2$s</xliff:g> του προφίλ <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Αναζήτηση αρχείων σε άλλες εφαρμογές"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Ανώνυμη"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Χρήση αυτού του φακέλου"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Δεν είναι δυνατή η χρήση αυτού του φακέλου"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Για την προστασία του απορρήτου σας, επιλέξτε άλλο φάκελο"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Δημιουργία νέου φακέλου"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Αναζήτηση σε αυτό το τηλέφωνο"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Αναζήτηση σε αυτή τη συσκευή"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Διαγραφή ιστορικού αναζήτησης <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Προσωπικός"</string>
<string name="work_tab" msgid="7265359366883747413">"Εργασίας"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index c05071b..5523ed3 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Can’t load content at the moment"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Work apps are paused"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Turn on work apps"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> apps are paused"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Turn on <xliff:g id="PROFILE">%1$s</xliff:g> apps"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Can’t select work files"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Your IT admin doesn’t allow you to access work files from a personal app"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Can’t select personal files"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Your IT admin doesn’t allow you to access personal files from a work app"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Can\'t select <xliff:g id="PROFILE">%1$s</xliff:g> files"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Your IT admin doesn\'t allow you to access <xliff:g id="PROFILE_0">%1$s</xliff:g> files from a <xliff:g id="PROFILE_1">%2$s</xliff:g> app"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Can’t save to work profile"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Your IT admin doesn’t allow you to save personal files to your work profile"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Can’t save to personal profile"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Your IT admin doesn’t allow you to save work files to your personal profile"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Can\'t save to <xliff:g id="PROFILE">%1$s</xliff:g> profile"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Your IT admin doesn\'t allow you to save <xliff:g id="PROFILE_0">%1$s</xliff:g> files to your <xliff:g id="PROFILE_1">%2$s</xliff:g> profile"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"This action isn’t allowed"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"To learn more, contact your IT admin"</string>
<string name="root_recent" msgid="1080156975424341623">"Recent"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"New name"</string>
<string name="preview_file" msgid="4056622696305432343">"Preview the file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Preview the work file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Preview the <xliff:g id="PROFILE">%1$s</xliff:g> file <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Browse files in other apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonymous"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Use this folder"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Can’t use this folder"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"To protect your privacy, choose another folder"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Create new folder"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Search this phone"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Search this device"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Delete search history <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personal"</string>
<string name="work_tab" msgid="7265359366883747413">"Work"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index d3d6da1..0dcc1f5 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Can’t load content at the moment"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Work apps are paused"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Turn on work apps"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> apps are paused"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Turn on <xliff:g id="PROFILE">%1$s</xliff:g> apps"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Can’t select work files"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Your IT admin doesn’t allow you to access work files from a personal app"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Can’t select personal files"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Your IT admin doesn’t allow you to access personal files from a work app"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Can’t select <xliff:g id="PROFILE">%1$s</xliff:g> files"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Your IT admin doesn’t allow you to access <xliff:g id="PROFILE_0">%1$s</xliff:g> files from a <xliff:g id="PROFILE_1">%2$s</xliff:g> app"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Can’t save to work profile"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Your IT admin doesn’t allow you to save personal files to your work profile"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Can’t save to personal profile"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Your IT admin doesn’t allow you to save work files to your personal profile"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Can’t save to <xliff:g id="PROFILE">%1$s</xliff:g> profile"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Your IT admin doesn’t allow you to save <xliff:g id="PROFILE_0">%1$s</xliff:g> files to your <xliff:g id="PROFILE_1">%2$s</xliff:g> profile"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"This action isn’t allowed"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"To learn more, contact your IT admin"</string>
<string name="root_recent" msgid="1080156975424341623">"Recent"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"New name"</string>
<string name="preview_file" msgid="4056622696305432343">"Preview the file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Preview the work file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Preview the <xliff:g id="PROFILE">%1$s</xliff:g> file <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Browse files in other apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonymous"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Use this folder"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Can’t use this folder"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"To protect your privacy, choose another folder"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Create new folder"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Search this phone"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Search this device"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Delete search history <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personal"</string>
<string name="work_tab" msgid="7265359366883747413">"Work"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index c05071b..5523ed3 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Can’t load content at the moment"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Work apps are paused"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Turn on work apps"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> apps are paused"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Turn on <xliff:g id="PROFILE">%1$s</xliff:g> apps"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Can’t select work files"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Your IT admin doesn’t allow you to access work files from a personal app"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Can’t select personal files"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Your IT admin doesn’t allow you to access personal files from a work app"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Can\'t select <xliff:g id="PROFILE">%1$s</xliff:g> files"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Your IT admin doesn\'t allow you to access <xliff:g id="PROFILE_0">%1$s</xliff:g> files from a <xliff:g id="PROFILE_1">%2$s</xliff:g> app"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Can’t save to work profile"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Your IT admin doesn’t allow you to save personal files to your work profile"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Can’t save to personal profile"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Your IT admin doesn’t allow you to save work files to your personal profile"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Can\'t save to <xliff:g id="PROFILE">%1$s</xliff:g> profile"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Your IT admin doesn\'t allow you to save <xliff:g id="PROFILE_0">%1$s</xliff:g> files to your <xliff:g id="PROFILE_1">%2$s</xliff:g> profile"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"This action isn’t allowed"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"To learn more, contact your IT admin"</string>
<string name="root_recent" msgid="1080156975424341623">"Recent"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"New name"</string>
<string name="preview_file" msgid="4056622696305432343">"Preview the file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Preview the work file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Preview the <xliff:g id="PROFILE">%1$s</xliff:g> file <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Browse files in other apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonymous"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Use this folder"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Can’t use this folder"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"To protect your privacy, choose another folder"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Create new folder"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Search this phone"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Search this device"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Delete search history <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personal"</string>
<string name="work_tab" msgid="7265359366883747413">"Work"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index c05071b..5523ed3 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Can’t load content at the moment"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Work apps are paused"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Turn on work apps"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> apps are paused"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Turn on <xliff:g id="PROFILE">%1$s</xliff:g> apps"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Can’t select work files"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Your IT admin doesn’t allow you to access work files from a personal app"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Can’t select personal files"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Your IT admin doesn’t allow you to access personal files from a work app"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Can\'t select <xliff:g id="PROFILE">%1$s</xliff:g> files"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Your IT admin doesn\'t allow you to access <xliff:g id="PROFILE_0">%1$s</xliff:g> files from a <xliff:g id="PROFILE_1">%2$s</xliff:g> app"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Can’t save to work profile"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Your IT admin doesn’t allow you to save personal files to your work profile"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Can’t save to personal profile"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Your IT admin doesn’t allow you to save work files to your personal profile"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Can\'t save to <xliff:g id="PROFILE">%1$s</xliff:g> profile"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Your IT admin doesn\'t allow you to save <xliff:g id="PROFILE_0">%1$s</xliff:g> files to your <xliff:g id="PROFILE_1">%2$s</xliff:g> profile"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"This action isn’t allowed"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"To learn more, contact your IT admin"</string>
<string name="root_recent" msgid="1080156975424341623">"Recent"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"New name"</string>
<string name="preview_file" msgid="4056622696305432343">"Preview the file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Preview the work file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Preview the <xliff:g id="PROFILE">%1$s</xliff:g> file <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Browse files in other apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonymous"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Use this folder"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Can’t use this folder"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"To protect your privacy, choose another folder"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Create new folder"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Search this phone"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Search this device"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Delete search history <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personal"</string>
<string name="work_tab" msgid="7265359366883747413">"Work"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index f408932..b3abdd1 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Can’t load content at the moment"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Work apps are paused"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Turn on work apps"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> apps are paused"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Turn on <xliff:g id="PROFILE">%1$s</xliff:g> apps"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Can’t select work files"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Your IT admin doesn’t allow you to access work files from a personal app"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Can’t select personal files"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Your IT admin doesn’t allow you to access personal files from a work app"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Can’t select <xliff:g id="PROFILE">%1$s</xliff:g> files"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Your IT admin doesn’t allow you to access <xliff:g id="PROFILE_0">%1$s</xliff:g> files from a <xliff:g id="PROFILE_1">%2$s</xliff:g> app"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Can’t save to work profile"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Your IT admin doesn’t allow you to save personal files to your work profile"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Can’t save to personal profile"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Your IT admin doesn’t allow you to save work files to your personal profile"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Can’t save to <xliff:g id="PROFILE">%1$s</xliff:g> profile"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Your IT admin doesn’t allow you to save <xliff:g id="PROFILE_0">%1$s</xliff:g> files to your <xliff:g id="PROFILE_1">%2$s</xliff:g> profile"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"This action isn’t allowed"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"To learn more, contact your IT admin"</string>
<string name="root_recent" msgid="1080156975424341623">"Recent"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"New name"</string>
<string name="preview_file" msgid="4056622696305432343">"Preview the file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Preview the work file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Preview the <xliff:g id="PROFILE">%1$s</xliff:g> file <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Browse files in other apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonymous"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Use this folder"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Can’t use this folder"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"To protect your privacy, choose another folder"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Create new folder"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Search this phone"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Search this device"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Delete search history <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personal"</string>
<string name="work_tab" msgid="7265359366883747413">"Work"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 39bd73f..595f358 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"No se puede cargar el contenido en este momento"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Las apps de trabajo están detenidas"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Activa las apps de trabajo"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Se pausaron las apps de <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Activar apps de <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"No se pueden seleccionar archivos de trabajo"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Tu administrador de TI no te permite acceder a archivos de trabajo desde una app personal."</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"No se pueden seleccionar archivos personales"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Tu administrador de TI no te permite acceder a archivos personales desde una app de trabajo."</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"No se pueden seleccionar archivos <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Tu administrador de TI no permite que accedas a los archivos <xliff:g id="PROFILE_0">%1$s</xliff:g> desde una app <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"No se puede guardar en el perfil de trabajo"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Tu administrador de TI no te permite guardar archivos personales en el perfil de trabajo."</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"No se puede guardar en el perfil personal"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Tu administrador de TI no te permite guardar archivos de trabajo en el perfil personal."</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"No se puede guardar en tu perfil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Tu administrador de TI no permite que guardes archivos <xliff:g id="PROFILE_0">%1$s</xliff:g> en el perfil de <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Esta acción no está permitida."</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Para obtener más información, comunícate con tu administrador de TI."</string>
<string name="root_recent" msgid="1080156975424341623">"Recientes"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nombre nuevo"</string>
<string name="preview_file" msgid="4056622696305432343">"Obtener vista previa del archivo <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Obtén una vista previa del archivo de trabajo <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Obtener vista previa del archivo <xliff:g id="FILENAME">%2$s</xliff:g> del perfil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Explorar archivos en otras apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anónimo"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Usar esta carpeta"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"No se puede usar esta carpeta"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Para proteger tu privacidad, elige otra carpeta."</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Crear carpeta"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Buscar en este teléfono"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Buscar este dispositivo"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Borrar historial de búsqueda de <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personal"</string>
<string name="work_tab" msgid="7265359366883747413">"De trabajo"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index f723518..57e5b14 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"No se puede cargar contenido en este momento"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Las aplicaciones de trabajo están en pausa"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Activar aplicaciones de trabajo"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Las aplicaciones de este perfil (<xliff:g id="PROFILE">%1$s</xliff:g>) están pausadas"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Activar aplicaciones (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"No se pueden seleccionar archivos de trabajo"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Tu administrador de TI no te permite acceder a archivos de trabajo desde una aplicación personal"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"No se pueden seleccionar archivos personales"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Tu administrador de TI no te permite acceder a archivos personales desde una aplicación de trabajo"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"No se pueden seleccionar archivos de este perfil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Tu administrador de TI no te permite acceder a archivos de este perfil (<xliff:g id="PROFILE_0">%1$s</xliff:g>) desde una aplicación del otro (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"No se puede guardar en el perfil de trabajo"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Tu administrador de TI no te permite guardar archivos personales en tu perfil de trabajo"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"No se puede guardar en el perfil personal"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Tu administrador de TI no te permite guardar archivos de trabajo en tu perfil personal"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"No se puede guardar en este perfil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Tu administrador de TI no te permite guardar archivos de un perfil (<xliff:g id="PROFILE_0">%1$s</xliff:g>) en el otro perfil (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Esta acción no está permitida"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Para obtener más información, ponte en contacto con tu administrador de TI"</string>
<string name="root_recent" msgid="1080156975424341623">"Reciente"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nombre nuevo"</string>
<string name="preview_file" msgid="4056622696305432343">"Obtener una vista previa del archivo <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Previsualizar el archivo de trabajo <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Obtener una vista previa del archivo <xliff:g id="FILENAME">%2$s</xliff:g> de este perfil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Ver archivos en otras aplicaciones"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anónimo"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Usar esta carpeta"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"No se puede usar esta carpeta"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Para proteger tu privacidad, elige otra carpeta"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Crear carpeta nueva"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Buscar en este teléfono"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Buscar en este dispositivo"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Eliminar el historial de búsqueda de <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personal"</string>
<string name="work_tab" msgid="7265359366883747413">"Trabajo"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index b90ceb7..e7dbe75 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Sisu ei saa praegu laadida"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Töörakendused on peatatud"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Lülita töörakendused sisse"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Profiili <xliff:g id="PROFILE">%1$s</xliff:g> rakendused on peatatud"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Lülita profiili <xliff:g id="PROFILE">%1$s</xliff:g> rakendused sisse"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Tööfaile ei saa valida"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Teie IT-administraator ei luba teil isikliku rakenduse kaudu tööfailidele juurde pääseda"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Isiklikke faile ei saa valida"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Teie IT-administraator ei luba töörakenduse kaudu isiklikele failidele juurde pääseda"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Profiili <xliff:g id="PROFILE">%1$s</xliff:g> faile ei saa valida"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Teie IT-administraator ei luba teil rakenduse <xliff:g id="PROFILE_1">%2$s</xliff:g> kaudu profiili <xliff:g id="PROFILE_0">%1$s</xliff:g> failidele juurde pääseda"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Tööprofiilile ei saa salvestada"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Teie IT-administraator ei luba isiklikke faile tööprofiilile salvestada"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Isiklikule profiilile ei saa salvestada"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Teie IT-administraator ei luba teil tööfaile isiklikule profiilile salvestada"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Profiilile <xliff:g id="PROFILE">%1$s</xliff:g> ei saa salvestada"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Teie IT-administraator ei luba teil profiili <xliff:g id="PROFILE_0">%1$s</xliff:g> faile profiilile <xliff:g id="PROFILE_1">%2$s</xliff:g> salvestada"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"See toiming ei ole lubatud"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Lisateabe saamiseks võtke ühendust IT-administraatoriga"</string>
<string name="root_recent" msgid="1080156975424341623">"Hiljutised"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Uus nimi"</string>
<string name="preview_file" msgid="4056622696305432343">"Faili <xliff:g id="FILENAME">%1$s</xliff:g> eelvaade"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Kuva tööfaili <xliff:g id="FILENAME">%1$s</xliff:g> eelvaade"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Profiili <xliff:g id="PROFILE">%1$s</xliff:g> faili <xliff:g id="FILENAME">%2$s</xliff:g> eelvaade"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Failide sirvimine muudes rakendustes"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonüümne"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Kasuta seda kausta"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Seda kausta ei saa kasutada"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Oma privaatsuse kaitsmiseks kasutage teist kausta"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Loo uus kaust"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Otsige sellest telefonist"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Otsige selles seadmes"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Otsinguajaloo kustutamine <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Isiklik"</string>
<string name="work_tab" msgid="7265359366883747413">"Töö"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 37b58da..7843dd5 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Une honetan ezin da kargatu edukia"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Pausatuta daude laneko aplikazioak"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Aktibatu laneko aplikazioak"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Profil honetako (<xliff:g id="PROFILE">%1$s</xliff:g>) aplikazioak pausatuta daude"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Aktibatu profil honetako (<xliff:g id="PROFILE">%1$s</xliff:g>) aplikazioak"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Ezin dira hautatu laneko fitxategiak"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IKT saileko administratzaileak ez dizu ematen baimenik laneko fitxategiak aplikazio pertsonal batetik atzitzeko"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Ezin dira hautatu fitxategi pertsonalak"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IKT saileko administratzaileak ez dizu ematen baimenik fitxategi pertsonalak laneko aplikazio batetik atzitzeko"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Ezin dira hautatu profil honetako (<xliff:g id="PROFILE">%1$s</xliff:g>) fitxategiak"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IKT saileko administratzaileak ez dizu eman baimenik profil bateko (<xliff:g id="PROFILE_0">%1$s</xliff:g>) fitxategiak beste profil bateko (<xliff:g id="PROFILE_1">%2$s</xliff:g>) aplikazio batekin atzitzeko"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Ezin da gorde laneko profilean"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IKT saileko administratzaileak ez dizu ematen baimenik fitxategi pertsonalak zure laneko profilean gordetzeko"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Ezin da gorde profil pertsonalean"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IKT saileko administratzaileak ez dizu ematen baimenik laneko fitxategiak zure profil pertsonalean gordetzeko"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Ezin da gorde profil honetan (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IKT saileko administratzaileak ez dizu eman baimenik profil bateko (<xliff:g id="PROFILE_0">%1$s</xliff:g>) fitxategiak beste profil batean (<xliff:g id="PROFILE_1">%2$s</xliff:g>) gordetzeko"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Ez da onartzen ekintza"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Informazio gehiago lortzeko, jarri IKT saileko administratzailearekin harremanetan"</string>
<string name="root_recent" msgid="1080156975424341623">"Azkenak"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Izen berria"</string>
<string name="preview_file" msgid="4056622696305432343">"Aurreikusi <xliff:g id="FILENAME">%1$s</xliff:g> fitxategia"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Aurreikusi laneko <xliff:g id="FILENAME">%1$s</xliff:g> fitxategia"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Aurreikusi profil honetako (<xliff:g id="PROFILE">%1$s</xliff:g>) <xliff:g id="FILENAME">%2$s</xliff:g> fitxategia"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Arakatu beste aplikazio batzuetako fitxategiak"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonimoa"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Erabili karpeta hau"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Ezin da erabili karpeta hori"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Pribatutasuna babesteko, aukeratu beste karpeta bat"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Sortu karpeta bat"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Bilatu telefono honetan"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Bilatu gailu honetan"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Ezabatu bilaketa-historia (<xliff:g id="TEXT">%1$s</xliff:g>)"</string>
<string name="personal_tab" msgid="3878576287868528503">"Pertsonala"</string>
<string name="work_tab" msgid="7265359366883747413">"Lanekoa"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index f40b13d..ea7e359 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"محتوا درحال حاضر بار نمیشود"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"برنامههای کاری موقتاً متوقف شدهاند."</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"روشن کردن برنامههای کاری"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"برنامههای <xliff:g id="PROFILE">%1$s</xliff:g> موقتاً متوقف شده است"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"روشن کردن برنامههای <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"انتخاب فایلهای کاری ممکن نیست"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"سرپرست فناوری اطلاعات اجازه نمیدهد از برنامه شخصی به فایلهای کاری دسترسی پیدا کنید"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"انتخاب فایلهای شخصی ممکن نیست"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"سرپرست فناوری اطلاعات اجازه نمیدهد از برنامه کاری به فایلهای شخصی دسترسی پیدا کنید"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"نمیتوانید فایلهای <xliff:g id="PROFILE">%1$s</xliff:g> را انتخاب کنید"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"سرپرست فناوری اطلاعات شما اجازه نمیدهد ازطریق برنامه <xliff:g id="PROFILE_1">%2$s</xliff:g> به فایلهای <xliff:g id="PROFILE_0">%1$s</xliff:g> دسترسی داشته باشید"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"ذخیره در نمایه کاری ممکن نیست"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"سرپرست فناوری اطلاعات اجازه نمیدهد فایلهای شخصی را در نمایه کاری ذخیره کنید"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"ذخیره در نمایه شخصی ممکن نیست"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"سرپرست فناوری اطلاعات اجازه نمیدهد فایلهای کاری را در نمایه شخصی ذخیره کنید"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"نمیتوانید در نمایه <xliff:g id="PROFILE">%1$s</xliff:g> ذخیره کنید"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"سرپرست فناوری اطلاعات شما اجازه نمیدهد فایلهای <xliff:g id="PROFILE_0">%1$s</xliff:g> را در نمایه <xliff:g id="PROFILE_1">%2$s</xliff:g> ذخیره کنید"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"این کنش مجاز نیست"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"برای اطلاعات بیشتر، با سرپرست فناوری اطلاعات تماس بگیرید."</string>
<string name="root_recent" msgid="1080156975424341623">"اخیر"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"نام جدید"</string>
<string name="preview_file" msgid="4056622696305432343">"پیشنمایش فایل <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"پیشنمایش فایل کاری <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"پیشدید کردن فایل <xliff:g id="FILENAME">%2$s</xliff:g> در <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"مرور فایلها در سایر برنامهها"</string>
<string name="anonymous_application" msgid="7633027057951625862">"ناشناس"</string>
<string name="open_tree_button" msgid="6402871398424497776">"استفاده از این پوشه"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"نمیتوانید از این پوشه استفاده کنید"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"برای محافظت از حریمخصوصیتان، پوشه دیگری را انتخاب کنید"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"ایجاد پوشه جدید"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"جستجوی این تلفن"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"جستجوی این دستگاه"</string>
<string name="delete_search_history" msgid="2202015025607694515">"حذف سابقه جستجوی <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"شخصی"</string>
<string name="work_tab" msgid="7265359366883747413">"کاری"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index d7c8e3d..6fa10bf 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Sisällön lataaminen epäonnistui."</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Työsovellukset on keskeytetty"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Laita työsovellukset päälle"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Sovellukset on keskeytetty: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Ota <xliff:g id="PROFILE">%1$s</xliff:g>-sovellukset käyttöön"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Työtiedostot eivät käytettävissä"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT-järjestelmänvalvoja ei salli sinulle pääsyä työtiedostoihin henkilökohtaisesta sovelluksesta"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Ei voi valita henkilökohtaisia tiedostoja"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT-järjestelmänvalvoja ei salli sinulle pääsyä henkilökohtaisiin tiedostoihin työsovelluksesta"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g>-profiileja ei voi valita"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT-järjestelmänvalvoja ei salli sinun käyttää näitä tiedostoja (<xliff:g id="PROFILE_0">%1$s</xliff:g>) tällä sovelluksella (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Ei tallennettavissa työprofiiliin"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT-järjestelmänvalvoja ei anna sinun tallentaa henkilökohtaisia tiedostoja työprofiiliisi"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Ei tallennettavissa henkilökohtaiseen profiiliin"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT-järjestelmänvalvoja ei anna sinun tallentaa työtiedostoja henkilökohtaiseen profiiliisi"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Ei voi tallentaa <xliff:g id="PROFILE">%1$s</xliff:g>-profiiliin"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT-järjestelmänvalvoja ei salli sinun tallentaa näitä tiedostoja (<xliff:g id="PROFILE_0">%1$s</xliff:g>) <xliff:g id="PROFILE_1">%2$s</xliff:g>-profiiliin"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Tämä toiminto ei ole sallittu"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Pyydä lisätietoja IT-järjestelmänvalvojalta"</string>
<string name="root_recent" msgid="1080156975424341623">"Viimeisimmät"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Uusi nimi"</string>
<string name="preview_file" msgid="4056622696305432343">"Esikatsele tiedostoa <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Esikatsele työtiedostoa <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Esikatsele <xliff:g id="PROFILE">%1$s</xliff:g>-profiilin tiedostoa: <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Selaa tiedostoja muissa sovelluksissa"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonyymi"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Käytä tätä kansiota"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Tämä kansio ei ole käytettävissä"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Valitse toinen kansio tietosuojasi turvaamiseksi"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Luo uusi kansio"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Hae tästä puhelimesta"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Hae tältä laitteelta"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Poista hakuhistoria <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Henkilökohtainen"</string>
<string name="work_tab" msgid="7265359366883747413">"Työ"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index cad5d3e..e2397d1 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Impossible de charger le contenu pour le moment"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Les applications professionnelles sont interrompues"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Activer les applications professionnelles"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Les applications du profil de type <xliff:g id="PROFILE">%1$s</xliff:g> sont interrompues"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Activer les applications de type : <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Impossible de sélectionner des fichiers professionnels"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Votre administrateur informatique ne vous autorise pas à accéder à des fichiers professionnels à partir d\'une application personnelle"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Impossible de sélectionner des fichiers personnels"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Votre administrateur informatique ne vous autorise pas à accéder à des fichiers personnels à partir d\'une application professionnelle"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Impossible de sélectionner les fichiers de type <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Votre administrateur informatique ne vous autorise pas à accéder aux fichiers de type <xliff:g id="PROFILE_0">%1$s</xliff:g> à partir d\'une application du profil suivant : <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Ιmpossible d\'enregistrer dans le profil professionnel"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Votre administrateur informatique ne vous autorise pas à enregistrer des fichiers personnels dans votre profil professionnel"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Impossible d\'enregistrer dans le profil personnel"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Votre administrateur informatique ne vous autorise pas à enregistrer des fichiers professionnels dans votre profil personnel"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Impossible d\'enregistrer des fichiers dans le profil suivant : <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Votre administrateur informatique ne vous autorise pas à enregistrer des fichiers de type <xliff:g id="PROFILE_0">%1$s</xliff:g> dans le profil suivant : <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Cette action n\'est pas autorisée"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Communiquez avec votre administrateur informatique pour en savoir plus"</string>
<string name="root_recent" msgid="1080156975424341623">"Fichiers récents"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nouveau nom"</string>
<string name="preview_file" msgid="4056622696305432343">"Afficher un aperçu du fichier <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Afficher l\'aperçu du fichier professionnel <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Afficher un aperçu du fichier de type <xliff:g id="PROFILE">%1$s</xliff:g> : <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Parcourir les fichiers dans d\'autres applications"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonyme"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Utiliser ce dossier"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Impossible d\'utiliser ce dossier"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Pour protéger votre confidentialité, choisissez un autre dossier"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Créer un dossier"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Rechercher sur ce téléphone"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Faire une recherche dans cet appareil"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Supprimer l\'historique de recherche <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personnel"</string>
<string name="work_tab" msgid="7265359366883747413">"Professionnel"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 60143d2..85bdeb0 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Impossible de charger le contenu pour le moment"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Applis professionnelles en pause"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Activer les applis professionnelles"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Les applis du profil <xliff:g id="PROFILE">%1$s</xliff:g> sont en veille"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Activer les applis du profil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Impossible de sélectionner des fichiers professionnels"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Votre administrateur informatique ne vous autorise pas à accéder à des fichiers professionnels depuis une application personnelle"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Impossible de sélectionner des fichiers personnels"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Votre administrateur informatique ne vous autorise pas à accéder à des fichiers personnels depuis une application professionnelle"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Impossible de sélectionner les fichiers du profil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Votre administrateur informatique ne vous autorise pas à accéder aux fichiers du profil <xliff:g id="PROFILE_0">%1$s</xliff:g> à partir d\'une appli du profil <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Ιmpossible d\'enregistrer dans le profil professionnel"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Votre administrateur informatique ne vous autorise pas à enregistrer des fichiers personnels dans votre profil professionnel"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Impossible d\'enregistrer dans le profil personnel"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Votre administrateur informatique ne vous autorise pas à enregistrer des fichiers professionnels dans votre profil personnel"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Impossible d\'enregistrer les fichiers sur le profil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Votre administrateur informatique ne vous autorise pas à enregistrer les fichiers du profil <xliff:g id="PROFILE_0">%1$s</xliff:g> sur le profil <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Cette opération n\'est pas autorisée"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Pour en savoir plus, contactez ce dernier"</string>
<string name="root_recent" msgid="1080156975424341623">"Récents"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nouveau nom"</string>
<string name="preview_file" msgid="4056622696305432343">"Prévisualiser le fichier <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Prévisualiser le fichier professionnel <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Prévisualiser le fichier <xliff:g id="FILENAME">%2$s</xliff:g> du profil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Parcourir les fichiers dans d\'autres applications"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonyme"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Utiliser ce dossier"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Impossible d\'utiliser ce dossier"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Pour protéger votre vie privée, choisissez un autre dossier"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Créer un dossier"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Rechercher sur ce téléphone"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Rechercher cet appareil"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Supprimer l\'historique des recherches <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personnel"</string>
<string name="work_tab" msgid="7265359366883747413">"Professionnel"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index fea0de4..57e1970 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Non se pode cargar o contido neste momento"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Puxéronse en pausa as aplicacións do traballo"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Activar aplicacións do traballo"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"As aplicacións deste perfil (<xliff:g id="PROFILE">%1$s</xliff:g>) están en pausa"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Activar aplicacións (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Non se puideron seleccionar os ficheiros de traballo"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"O teu administrador de TI non permite acceder aos ficheiros do traballo desde unha aplicación persoal"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Non se puideron seleccionar os ficheiros persoais"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"O teu administrador de TI non permite acceder aos ficheiros persoais desde unha aplicación do traballo"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Non se poden seleccionar ficheiros deste perfil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"A persoa administradora de TI non che permite acceder aos ficheiros dun perfil (<xliff:g id="PROFILE_0">%1$s</xliff:g>) desde unha aplicación doutro perfil (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Non se poden gardar os ficheiros no perfil de traballo"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"O teu administrador de TI non permite gardar ficheiros persoais no teu perfil de traballo"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Non se puideron gardar os ficheiros no perfil persoal"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"O teu administrador de TI non permite gardar ficheiros do traballo no teu perfil persoal"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Non se poden gardar ficheiros neste perfil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"A persoa administradora de TI non che permite gardar ficheiros dun perfil (<xliff:g id="PROFILE_0">%1$s</xliff:g>) noutro perfil (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Esta acción non está permitida"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Para obter máis información, ponte en contacto co teu administrador de TI"</string>
<string name="root_recent" msgid="1080156975424341623">"Recentes"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nome novo"</string>
<string name="preview_file" msgid="4056622696305432343">"Vista previa do ficheiro <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Vista previa do ficheiro do traballo <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Previsualizar o ficheiro <xliff:g id="FILENAME">%2$s</xliff:g> deste perfil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Consultar ficheiros noutras aplicacións"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Aplicación anónima"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Usar este cartafol"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Non se pode utilizar este cartafol"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Para protexer a túa privacidade, escolle outro cartafol"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Crear novo cartafol"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Busca neste teléfono"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Busca contido neste dispositivo"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Elimina o historial de busca <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Persoal"</string>
<string name="work_tab" msgid="7265359366883747413">"Traballo"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index f311d1b..766540c 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"આ પળે સામગ્રી લોડ કરી શકતાં નથી"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"ઑફિસ માટેની ઍપ થોભાવવામાં આવી છે"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"ઑફિસ માટેની ઍપ ચાલુ કરો"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g>ની ઍપ થોભાવવામાં આવી છે"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g>ની ઍપ ચાલુ કરો"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"ઑફિસની ફાઇલોને પસંદ કરી શકતા નથી"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"તમારા IT વ્યવસ્થાપક તમને વ્યક્તિગત ઍપ પરથી ઑફિસની ફાઇલોને ઍક્સેસ કરવાની મંજૂરી આપતા નથી"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"વ્યક્તિગત ફાઇલોને પસંદ કરી શકતા નથી"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"તમારા IT વ્યવસ્થાપક તમને ઑફિસ માટેની ઍપ પરથી વ્યક્તિગત ફાઇલોને ઍક્સેસ કરવાની મંજૂરી આપતા નથી"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g>ની ફાઇલ પસંદ કરી શકતા નથી"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"તમારા IT ઍડમિન તમને <xliff:g id="PROFILE_1">%2$s</xliff:g> ઍપમાંથી <xliff:g id="PROFILE_0">%1$s</xliff:g>ની ફાઇલો ઍક્સેસ કરવાની મંજૂરી આપતા નથી"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"ઑફિસની પ્રોફાઇલમાં સાચવી શકતા નથી"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"તમારા IT વ્યવસ્થાપક તમને તમારી કાર્યાલયની પ્રોફાઇલમાં વ્યક્તિગત ફાઇલોને સાચવવાની મંજૂરી આપતા નથી"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"વ્યક્તિગત પ્રોફાઇલમાં સાચવી શકતા નથી"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"તમારા IT વ્યવસ્થાપક તમને તમારી વ્યક્તિગત પ્રોફાઇલમાં ઑફિસની ફાઇલોને સાચવવાની મંજૂરી આપતા નથી"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> પ્રોફાઇલમાં સાચવી શકતા નથી"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"તમારા IT ઍડમિન તમને <xliff:g id="PROFILE_0">%1$s</xliff:g>ની ફાઇલોને તમારી <xliff:g id="PROFILE_1">%2$s</xliff:g> પ્રોફાઇલમાં સાચવવાની મંજૂરી આપતા નથી"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"આ ક્રિયાની મંજૂરી નથી"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"વધુ જાણવા માટે, તમારા IT ઍડમિનનો સંપર્ક કરો"</string>
<string name="root_recent" msgid="1080156975424341623">"તાજેતરમાં"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"નવું નામ"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> ફાઇલને પ્રીવ્યૂ કરો"</string>
<string name="preview_work_file" msgid="4495643735563487273">"ઑફિસની ફાઇલ <xliff:g id="FILENAME">%1$s</xliff:g>ને પ્રીવ્યૂ કરો"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g>ની <xliff:g id="FILENAME">%2$s</xliff:g> ફાઇલને પ્રીવ્યૂ કરો"</string>
<string name="apps_row_title" msgid="3340490016663092925">"અન્ય ઍપમાં ફાઇલો બ્રાઉઝ કરો"</string>
<string name="anonymous_application" msgid="7633027057951625862">"અજ્ઞાત"</string>
<string name="open_tree_button" msgid="6402871398424497776">"આ ફોલ્ડરનો ઉપયોગ કરો"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"આ ફોલ્ડરનો ઉપયોગ કરી શકાતો નથી"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"તમારી પ્રાઇવસી સુરક્ષિત રાખવા માટે, અન્ય ફોલ્ડર પસંદ કરો"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"નવું ફોલ્ડર બનાવો"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"આ ફોન શોધો"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"આ ડિવાઇસ શોધો"</string>
<string name="delete_search_history" msgid="2202015025607694515">"શોધ ઇતિહાસ <xliff:g id="TEXT">%1$s</xliff:g> ડિલીટ કરો"</string>
<string name="personal_tab" msgid="3878576287868528503">"વ્યક્તિગત"</string>
<string name="work_tab" msgid="7265359366883747413">"ઑફિસ"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 97f7732..3183bd2 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"इस समय सामग्री लोड नहीं की जा सकती"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"वर्क ऐप्लिकेशन रोक दिए गए हैं"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"वर्क ऐप्लिकेशन चालू करें"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> ऐप्लिकेशन पर रोक लगा दी गई है"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> ऐप्लिकेशन चालू करें"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"दफ़्तर की फ़ाइलें नहीं चुनी जा सकतीं"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"आपका आईटी एडमिन आपको किसी निजी ऐप्लिकेशन से दफ़्तर की फ़ाइलें ऐक्सेस करने की मंज़ूरी नहीं देता"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"निजी फ़ाइलें नहीं चुनी जा सकतीं"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"आपका आईटी एडमिन आपको ऑफ़िस के काम से जुड़े ऐप्लिकेशन से निजी फ़ाइलें ऐक्सेस करने की अनुमति नहीं देता"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> फ़ाइलों को नहीं चुना जा सकता"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"आपका आईटी एडमिन, <xliff:g id="PROFILE_0">%1$s</xliff:g> फ़ाइलों को <xliff:g id="PROFILE_1">%2$s</xliff:g> ऐप्लिकेशन से ऐक्सेस करने की अनुमति नहीं देता है"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"वर्क प्रोफ़ाइल में सेव नहीं की जा सकतीं"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"आपका आईटी एडमिन आपको निजी फ़ाइलें वर्क प्रोफ़ाइल में सेव करने की अनुमति नहीं देता"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"निजी प्रोफ़ाइल में सेव नहीं की जा सकतीं"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"आपका आईटी एडमिन आपको दफ़्तर की फ़ाइलें निजी प्रोफ़ाइल में सेव करने की अनुमति नहीं देता"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> प्रोफ़ाइल में फ़ाइलें सेव नहीं की जा सकी"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"आपका आईटी एडमिन, <xliff:g id="PROFILE_0">%1$s</xliff:g> फ़ाइलों को <xliff:g id="PROFILE_1">%2$s</xliff:g> प्रोफ़ाइल में सेव करने की अनुमति नहीं देता है"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"इसकी अनुमति नहीं है"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"ज़्यादा जानने के लिए, अपने आईटी एडमिन से संपर्क करें"</string>
<string name="root_recent" msgid="1080156975424341623">"हाल ही का"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"नया नाम"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> फ़ाइल की झलक देखें"</string>
<string name="preview_work_file" msgid="4495643735563487273">"दफ़्तर की फ़ाइल <xliff:g id="FILENAME">%1$s</xliff:g> की झलक देखें"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> फ़ाइल <xliff:g id="FILENAME">%2$s</xliff:g> की झलक देखें"</string>
<string name="apps_row_title" msgid="3340490016663092925">"दूसरे ऐप्लिकेशन में फ़ाइलें ब्राउज़ करें"</string>
<string name="anonymous_application" msgid="7633027057951625862">"अनाम"</string>
<string name="open_tree_button" msgid="6402871398424497776">"यह फ़ोल्डर इस्तेमाल करें"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"इस फ़ोल्डर का इस्तेमाल नहीं किया जा सकता"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"अपनी निजता की सुरक्षा करने के लिए, कोई और फ़ोल्डर चुनें"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"नया फ़ोल्डर बनाएं"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"इस फ़ोन में खोजें"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"इस डिवाइस के बारे में खोजें"</string>
<string name="delete_search_history" msgid="2202015025607694515">"खोज का इतिहास मिटाएं <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"निजी"</string>
<string name="work_tab" msgid="7265359366883747413">"काम से जुड़ी"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 3837d64..e6cfbf9 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Sadržaj se trenutačno ne može učitati"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Poslovne aplikacije su pauzirane"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Uključi poslovne aplikacije"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Pauzirane su aplikacije (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Uključite aplikacije (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Nije moguće odabrati poslovne datoteke"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Vaš IT administrator ne dopušta vam pristupanje poslovnim datotekama iz osobne aplikacije"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Nije moguće odabrati osobne datoteke"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Vaš IT administrator ne dopušta vam pristup osobnim datotekama iz poslovne aplikacije"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Nije moguće odabrati datoteke (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Vaš IT administrator ne dopušta vam pristup datotekama (<xliff:g id="PROFILE_0">%1$s</xliff:g>) putem aplikacije (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Nije moguće spremati na poslovni profil"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Vaš IT administrator ne dopušta vam spremanje osobnih datoteka na vaš poslovni profil"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Nije moguće spremati na osobni profil"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Vaš IT administrator ne dopušta vam spremanje poslovnih datoteka na vaš osobni profil"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Nije moguće spremiti na profil (<xliff:g id="PROFILE">%1$s</xliff:g>)"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Vaš IT administrator ne dopušta vam da spremite datoteke (<xliff:g id="PROFILE_0">%1$s</xliff:g>) na svoj profil (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Ta radnja nije dopuštena"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Da biste saznali više, obratite se IT administratoru"</string>
<string name="root_recent" msgid="1080156975424341623">"Nedavno"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Novi naziv"</string>
<string name="preview_file" msgid="4056622696305432343">"Pregledajte datoteku <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Pregled poslovne datoteke <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Pregledajte datoteku (<xliff:g id="PROFILE">%1$s</xliff:g>) <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Pregledajte datoteke u drugim aplikacijama"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonimno"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Koristi ovu mapu"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Ne možete upotrebljavati ovu mapu"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Radi zaštite vlastite sigurnosti odaberite neku drugu mapu"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Izradi novu mapu"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Pretražite ovaj telefon"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Pretraži ovaj uređaj"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Brisanje povijesti pretraživanja <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Osobno"</string>
<string name="work_tab" msgid="7265359366883747413">"Posao"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 21b3a6c..9d7a2a6 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Jelenleg nem lehet tartalmat betölteni"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"A munkahelyi alkalmazások szüneteltetve vannak"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Munkahelyi alkalmazások bekapcsolása"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"A(z) <xliff:g id="PROFILE">%1$s</xliff:g> alkalmazások szüneteltetve vannak"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> alkalmazások bekapcsolása"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Nem választhatók ki munkafájlok"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Rendszergazdája nem engedélyezi, hogy munkafájlokhoz férjen hozzá személyes alkalmazásból"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Nem választhatók ki személyes fájlok"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Rendszergazdája nem engedélyezi, hogy személyes fájlokhoz férjen hozzá munkahelyi alkalmazásból"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Nem lehet kiválasztani <xliff:g id="PROFILE">%1$s</xliff:g> fájlokat"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Rendszergazdája nem engedélyezi a(z) <xliff:g id="PROFILE_0">%1$s</xliff:g> fájlokhoz való hozzáférést <xliff:g id="PROFILE_1">%2$s</xliff:g> alkalmazásból"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Nem lehet menteni a munkaprofilba"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Rendszergazdája nem engedélyezi, hogy személyes fájlokat mentsen munkaprofiljába"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Nem lehet menteni a személyes profilba"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Rendszergazdája nem engedélyezi, hogy munkafájlokat mentsen személyes profiljába"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Nem lehet menteni a következő profilba: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Rendszergazdája nem engedélyezi <xliff:g id="PROFILE_0">%1$s</xliff:g> fájlok mentését az Ön <xliff:g id="PROFILE_1">%2$s</xliff:g> profijába"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Ez a művelet nem engedélyezett"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"További információért forduljon rendszergazdájához"</string>
<string name="root_recent" msgid="1080156975424341623">"Legutóbbiak"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Új név"</string>
<string name="preview_file" msgid="4056622696305432343">"A(z) <xliff:g id="FILENAME">%1$s</xliff:g> előnézete"</string>
<string name="preview_work_file" msgid="4495643735563487273">"A(z) <xliff:g id="FILENAME">%1$s</xliff:g> munkafájl előnézete"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> fájl (<xliff:g id="FILENAME">%2$s</xliff:g>) előnézetének megtekintése"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Fájlok böngészése más alkalmazásokban"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Névtelen"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Jelenlegi mappa használata"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Ez a mappa nem használható"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Adatainak védelme érdekében válasszon másik mappát"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Új mappa létrehozása"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Keresés ezen a telefonon"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Keresés az eszközön"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Keresési előzmények törlése – <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Személyes"</string>
<string name="work_tab" msgid="7265359366883747413">"Munkahelyi"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index d57beef..fb55c8b 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Այս պահին հնարավոր չէ բեռնել բովանդակությունը"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Աշխատանքային հավելվածները դադարեցված են"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Միացնել աշխատանքային հավելվածները"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> հավելվածները դադարեցված են"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Միացնել <xliff:g id="PROFILE">%1$s</xliff:g> հավելվածները"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Հնարավոր չէ աշխատանքային ֆայլեր ընտրել"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Ձեր ՏՏ ադմինիստրատորը չի թույլատրում աշխատանքային ֆայլերի օգտագործումը անձնական հավելվածներից"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Հնարավոր չէ անձնական ֆայլեր ընտրել"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Ձեր ՏՏ ադմինիստրատորը չի թույլատրում աշխատանքային ֆայլերի օգտագործումը անձնական հավելվածներից"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Հնարավոր չէ ընտրել <xliff:g id="PROFILE">%1$s</xliff:g> ֆայլեր"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Ձեր ՏՏ ադմինիստրատորը ձեզ թույլ չի տալիս օգտագործել <xliff:g id="PROFILE_0">%1$s</xliff:g> ֆայլեր <xliff:g id="PROFILE_1">%2$s</xliff:g> հավելվածից"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Հնարավոր չէ պահել աշխատանքային պրոֆիլում"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Ձեր ՏՏ ադմինիստրատորը չի թույլատրում պահել անձնական ֆայլերը աշխատանքային պրոֆիլում"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Հնարավոր չէ պահել անձնական պրոֆիլում"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Ձեր ՏՏ ադմինիստրատորը չի թույլատրում պահել աշխատանքային ֆայլերը անձնական պրոֆիլում"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Հնարավոր չէ պահել <xliff:g id="PROFILE">%1$s</xliff:g> պրոֆիլում"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Ձեր ՏՏ ադմինիստրատորը ձեզ թույլ չի տալիս պահել <xliff:g id="PROFILE_0">%1$s</xliff:g> ֆայլերը ձեր <xliff:g id="PROFILE_1">%2$s</xliff:g> պրոֆիլում"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Գործողությունը թույլատրված չէ"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Մանրամասների համար դիմեք ՏՏ ադմինիստրատորին"</string>
<string name="root_recent" msgid="1080156975424341623">"Վերջինները"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Նոր անունը"</string>
<string name="preview_file" msgid="4056622696305432343">"Դիտել «<xliff:g id="FILENAME">%1$s</xliff:g>» ֆայլը"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Նախադիտել <xliff:g id="FILENAME">%1$s</xliff:g> աշխատանքային ֆայլը"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Դիտել <xliff:g id="FILENAME">%2$s</xliff:g> <xliff:g id="PROFILE">%1$s</xliff:g> ֆայլը"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Գտեք ֆայլեր այլ հավելվածներում"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Անանուն"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Օգտագործել այս պանակը"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Այլ պանակ ընտրեք"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Ձեր գաղտնիությունը պաշտպանելու նպատակով մենք արգելափակել ենք այս պանակի մուտքը"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Ստեղծել նոր պանակ"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Որոնեք հեռախոսում"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Որոնեք այս սարքում"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Ջնջել որոնումների պատմությունը՝ <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Անձնական"</string>
<string name="work_tab" msgid="7265359366883747413">"Աշխատանքային"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index b149b2a..f89f539 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Tidak dapat memuat konten saat ini"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Aplikasi kerja dijeda"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Aktifkan aplikasi kerja"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Aplikasi <xliff:g id="PROFILE">%1$s</xliff:g> dijeda"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Aktifkan aplikasi <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Tidak dapat memilih file kerja"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Admin IT tidak mengizinkan Anda mengakses file kerja dari aplikasi pribadi"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Tidak dapat memilih file pribadi"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Admin IT tidak mengizinkan Anda mengakses file pribadi dari aplikasi kerja"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Tidak dapat memilih file <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Admin IT tidak mengizinkan Anda mengakses file <xliff:g id="PROFILE_0">%1$s</xliff:g> dari aplikasi <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Tidak dapat menyimpan ke profil kerja"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Admin IT tidak mengizinkan Anda menyimpan file pribadi ke profil kerja Anda"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Tidak dapat menyimpan ke profil pribadi"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Admin IT tidak mengizinkan Anda menyimpan file kerja ke profil pribadi Anda"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Tidak dapat menyimpan ke profil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Admin IT tidak mengizinkan Anda menyimpan file <xliff:g id="PROFILE_0">%1$s</xliff:g> ke profil <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Tindakan ini tidak diizinkan"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Untuk mempelajari lebih lanjut, hubungi admin IT Anda"</string>
<string name="root_recent" msgid="1080156975424341623">"Terbaru"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nama baru"</string>
<string name="preview_file" msgid="4056622696305432343">"Pratinjau file <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Lihat pratinjau file kerja <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Pratinjau file <xliff:g id="PROFILE">%1$s</xliff:g> <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Cari file di aplikasi lain"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonim"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Gunakan folder ini"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Tidak dapat menggunakan folder ini"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Untuk melindungi privasi, pilih folder lain"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Buat folder baru"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Telusuri ponsel ini"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Telusuri perangkat ini"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Menghapus histori penelusuran <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Pribadi"</string>
<string name="work_tab" msgid="7265359366883747413">"Kerja"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 6498186..70a8623 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Ekki hægt að hlaða efni í augnablikinu"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Hlé gert á vinnuforritum"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Kveikja á vinnuforritum"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Hlé var gert á <xliff:g id="PROFILE">%1$s</xliff:g>-forritum"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Kveikja á <xliff:g id="PROFILE">%1$s</xliff:g>-forritum"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Ekki er hægt að velja vinnuskrár"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Kerfisstjórinn þinn leyfir þér ekki að opna vinnuskrár í forritum til einkanota"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Ekki er hægt að velja einkaskrár"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Kerfisstjórinn þinn leyfir þér ekki að opna einkaskrár í vinnuforriti"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Ekki er hægt að velja <xliff:g id="PROFILE">%1$s</xliff:g>-skrár"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Stjórnandinn þinn leyfir ekki aðgang að <xliff:g id="PROFILE_0">%1$s</xliff:g>-skrám úr <xliff:g id="PROFILE_1">%2$s</xliff:g>-forriti"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Ekki er hægt að vista á vinnusniði"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Kerfisstjórinn þinn leyfir þér ekki að vista einkaskrár á vinnusniðinu"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Ekki er hægt að vista á einkasniði"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Kerfisstjórinn þinn leyfir þér ekki að vista vinnuskrár á einkasniði"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Ekki er hægt að vista á <xliff:g id="PROFILE">%1$s</xliff:g>-sniði"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Stjórnandinn þinn leyfir ekki vistun <xliff:g id="PROFILE_0">%1$s</xliff:g>-skráa á <xliff:g id="PROFILE_1">%2$s</xliff:g>-sniði"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Þessi aðgerð er ekki leyfð"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Hafðu samband við kerfisstjórann til að fá frekari upplýsingar"</string>
<string name="root_recent" msgid="1080156975424341623">"Nýlegt"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nýtt heiti"</string>
<string name="preview_file" msgid="4056622696305432343">"Forskoða skrána <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Forskoða vinnuskrána <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Forskoða <xliff:g id="PROFILE">%1$s</xliff:g>-skrána „<xliff:g id="FILENAME">%2$s</xliff:g>“"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Skoða skrár í öðrum forritum"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Nafnlaus"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Nota þessa möppu"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Ekki er hægt að nota þessa möppu"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Veldu aðra möppu til að tryggja persónuvernd þína"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Búa til nýja möppu"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Leita í þessum síma"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Leita í þessu tæki"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Eyða leitarferli <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Persónulegt"</string>
<string name="work_tab" msgid="7265359366883747413">"Vinna"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index a3b3998..2feb022 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Impossibile caricare i contenuti al momento."</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Le app di lavoro sono in pausa"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Attiva app di lavoro"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Le app <xliff:g id="PROFILE">%1$s</xliff:g> sono in pausa"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Attiva le app <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Impossibile selezionare file di lavoro"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"L\'amministratore IT non consente l\'accesso ai file di lavoro da un\'app personale"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Impossibile selezionare file personali"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"L\'amministratore IT non consente l\'accesso ai file personali da un\'app di lavoro"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Impossibile selezionare i file <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"L\'amministratore IT non consente di accedere ai file <xliff:g id="PROFILE_0">%1$s</xliff:g> da un\'app <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Impossibile salvare sul profilo di lavoro"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"L\'amministratore IT non consente il salvataggio di file personali sul tuo profilo di lavoro"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Impossibile salvare sul profilo personale"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"L\'amministratore IT non consente il salvataggio di file di lavoro sul tuo profilo personale"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Impossibile salvare sul profilo <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"L\'amministratore IT non consente di salvare i file <xliff:g id="PROFILE_0">%1$s</xliff:g> sul profilo <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Questa azione non è consentita"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Per ulteriori informazioni, contatta il tuo amministratore IT"</string>
<string name="root_recent" msgid="1080156975424341623">"Recenti"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nuovo nome"</string>
<string name="preview_file" msgid="4056622696305432343">"Visualizza il file <xliff:g id="FILENAME">%1$s</xliff:g> in anteprima"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Visualizza l\'anteprima del file di lavoro <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Visualizza l\'anteprima del file <xliff:g id="PROFILE">%1$s</xliff:g> <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Sfoglia i file in altre app"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonima"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Usa questa cartella"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Impossibile usare questa cartella"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Per tutelare la tua privacy, scegli un\'altra cartella"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Crea nuova cartella"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Cerca su questo telefono"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Cerca su questo dispositivo"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Elimina la cronologia delle ricerche <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personale"</string>
<string name="work_tab" msgid="7265359366883747413">"Lavoro"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index bce2230..33ea199 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"לא ניתן כרגע לטעון תוכן"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"האפליקציות לעבודה מושהות"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"הפעלה של אפליקציות לעבודה"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"אפליקציות מפרופיל <xliff:g id="PROFILE">%1$s</xliff:g> מושהות"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"הפעלת אפליקציות מפרופיל <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"לא ניתן לבחור קובצי עבודה"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"מנהל ה-IT לא מאפשר לגשת לקובצי עבודה מאפליקציה לשימוש אישי"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"לא ניתן לבחור קבצים אישיים"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"מנהל ה-IT לא מאפשר לגשת לקבצים אישיים מאפליקציה לעבודה"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"לא ניתן לבחור קבצים מפרופיל <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"אין אישור מהאדמין ב-IT לגשת לקבצים מפרופיל <xliff:g id="PROFILE_0">%1$s</xliff:g> מאפליקציה <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"לא ניתן לשמור בפרופיל העבודה"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"מנהל ה-IT לא מתיר לשמור קבצים אישיים בפרופיל העבודה שלך"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"לא ניתן לשמור בפרופיל האישי"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"מנהל ה-IT לא מתיר לשמור קובצי עבודה בפרופיל האישי שלך"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"אי אפשר לשמור בפרופיל ה<xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"אין אישור מהאדמין ב-IT לשמור קבצים מפרופיל <xliff:g id="PROFILE_0">%1$s</xliff:g> בפרופיל ה<xliff:g id="PROFILE_1">%2$s</xliff:g> שלך"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"הפעולה הזו אסורה"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"כדי לקבל מידע נוסף יש לפנות אל מנהל ה-IT"</string>
<string name="root_recent" msgid="1080156975424341623">"בשימוש לאחרונה"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"שם חדש"</string>
<string name="preview_file" msgid="4056622696305432343">"תצוגה מקדימה של הקובץ <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"לצפייה בתצוגה מקדימה של קובץ העבודה <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"תצוגה מקדימה של קובץ <xliff:g id="FILENAME">%2$s</xliff:g> מפרופיל <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"חיפוש קבצים באפליקציות אחרות"</string>
<string name="anonymous_application" msgid="7633027057951625862">"אנונימית"</string>
<string name="open_tree_button" msgid="6402871398424497776">"שימוש בתיקייה הזו"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"לא ניתן להשתמש בתיקייה הזו"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"כדי להגן על הפרטיות שלך, עליך לבחור תיקייה אחרת"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"יצירת תיקייה חדשה"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"חיפוש בטלפון הזה"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"חיפוש המכשיר הזה"</string>
<string name="delete_search_history" msgid="2202015025607694515">"מחיקת היסטוריית החיפושים <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"אישי"</string>
<string name="work_tab" msgid="7265359366883747413">"עבודה"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 1f94cad..35685ca 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"現在、コンテンツを読み込むことができません"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"仕事用アプリ一時停止中"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"仕事用アプリをオンにする"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g>アプリ一時停止中"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g>アプリを ON にする"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"仕事用ファイルは選択できません"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT 管理者は、個人用アプリから仕事用ファイルにアクセスすることを許可していません"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"個人用ファイルは選択できません"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT 管理者は、仕事用アプリから個人用ファイルにアクセスすることを許可していません"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g>ファイルは選択できません"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT 管理者は、<xliff:g id="PROFILE_1">%2$s</xliff:g>アプリから<xliff:g id="PROFILE_0">%1$s</xliff:g>ファイルにアクセスすることを許可していません"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"仕事用プロファイルには保存できません"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT 管理者は、仕事用プロファイルに個人用ファイルを保存することを許可していません"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"個人用プロファイルには保存できません"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT 管理者は、個人用プロファイルに仕事用ファイルを保存することを許可していません"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g>プロファイルには保存できません"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT 管理者は、<xliff:g id="PROFILE_1">%2$s</xliff:g>プロファイルに<xliff:g id="PROFILE_0">%1$s</xliff:g>ファイルを保存することを許可していません"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"この操作は許可されていません"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"詳しくは、IT 管理者にお問い合わせください"</string>
<string name="root_recent" msgid="1080156975424341623">"最近"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"新しい名前"</string>
<string name="preview_file" msgid="4056622696305432343">"ファイル <xliff:g id="FILENAME">%1$s</xliff:g> をプレビューする"</string>
<string name="preview_work_file" msgid="4495643735563487273">"仕事用ファイル <xliff:g id="FILENAME">%1$s</xliff:g> をプレビューする"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g>ファイル <xliff:g id="FILENAME">%2$s</xliff:g> をプレビューする"</string>
<string name="apps_row_title" msgid="3340490016663092925">"他のアプリでファイルを探す"</string>
<string name="anonymous_application" msgid="7633027057951625862">"匿名"</string>
<string name="open_tree_button" msgid="6402871398424497776">"このフォルダを使用"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"このフォルダは使用できません"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"プライバシーを保護するため、別のフォルダを選択してください"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"新規フォルダを作成"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"スマートフォン内を検索"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"このデバイスを検索する"</string>
<string name="delete_search_history" msgid="2202015025607694515">"検索履歴「<xliff:g id="TEXT">%1$s</xliff:g>」を削除します"</string>
<string name="personal_tab" msgid="3878576287868528503">"個人用"</string>
<string name="work_tab" msgid="7265359366883747413">"仕事用"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index b4a85f4..1a69866 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"კონტენტის ჩატვირთვა ამჟამად ვერ ხერხდება"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"სამსახურის აპები დაპაუზებულია"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"სამსახურის აპების ჩართვა"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> პროფილის აპები დაპაუზებულია"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> პროფილის აპების ჩართვა"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"სამსახურის ფაილების არჩევა ვერ მოხერხდება"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"თქვენი IT ადმინისტრატორი გიკრძალავთ სამსახურის ფაილებზე პერსონალური აპით წვდომას"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"პერსონალური ფაილების არჩევა ვერ მოხერხდება"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"თქვენი IT ადმინისტრატორი გიკრძალავთ პერსონალურ ფაილებზე სამსახურის აპით წვდომას"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> პროფილის ფაილების არჩევა ვერ ხერხდება"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"თქვენი IT ადმინისტრატორი <xliff:g id="PROFILE_0">%1$s</xliff:g> პროფილის ფაილების <xliff:g id="PROFILE_1">%2$s</xliff:g> აპიდან წვდომას არ უშვებს"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"სამსახურის პროფილში შენახვა ვერ მოხერხდება"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"თქვენი IT ადმინისტრატორი გიკრძალავთ პერსონალური ფაილების შენახვას თქვენს სამსახურის პროფილში"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"პერსონალურ პროფილში შენახვა ვერ მოხერხდება"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"თქვენი IT ადმინისტრატორი გიკრძალავთ სამსახურის ფაილების შენახვას თქვენს პერსონალურ პროფილში"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> პროფილში შენახვა ვერ ხერხდება"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"თქვენი IT ამინისტრატორი <xliff:g id="PROFILE_0">%1$s</xliff:g> პროფილის ფაილების თქვენს <xliff:g id="PROFILE_1">%2$s</xliff:g> პროფილში შენახვას არ უშვებს"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"ეს ქმედება დაშვებული არ არის"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"დამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს IT ადმინისტრატორს"</string>
<string name="root_recent" msgid="1080156975424341623">"ბოლო"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"ახალი სახელი"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> ფაილის გადახედვა"</string>
<string name="preview_work_file" msgid="4495643735563487273">"სამუშაო ფაილის გადახედვა: <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> პროფილის <xliff:g id="FILENAME">%2$s</xliff:g> ფაილისგადახედვა"</string>
<string name="apps_row_title" msgid="3340490016663092925">"ფაილების დათვალიერება სხვა აპებში"</string>
<string name="anonymous_application" msgid="7633027057951625862">"ანონიმური"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ამ საქაღალდის გამოყენება"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ამ საქაღალდეს ვერ გამოიყენებთ"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"თქვენი კონფიდენციალურობის დასაცავად აირჩიეთ სხვა საქაღალდე"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"ახალი საქაღალდის შექმნა"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ამ ტელეფონში ძიება"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ამ მოწყობილობის ძიება"</string>
<string name="delete_search_history" msgid="2202015025607694515">"ძიების ისტორიის წაშლა <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"პირადი"</string>
<string name="work_tab" msgid="7265359366883747413">"სამსახური"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 5e984e4..7d1f402 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Контент қазір жүктелмейді"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Жұмыс қолданбалары кідіртілді"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Жұмыс қолданбаларын қосу"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> қолданбалары уақытша тоқтатылды"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> қолданбаларын қосу"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Жұмыс файлдарын таңдау мүмкін емес"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Әкімші жұмыс файлдарына жеке қолданбадан кіруге рұқсат етпейді."</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Жеке файлдарды сақтау мүмкін емес"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Әкімші жұмыс қолданбасынан жеке файлдарға кіруге рұқсат етпейді."</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> файлдарын таңдау мүмкін емес"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Әкімшіңіз сізге <xliff:g id="PROFILE_0">%1$s</xliff:g> файлдарын <xliff:g id="PROFILE_1">%2$s</xliff:g> қолданбасынан пайдалануға рұқсат бермейді."</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Жұмыс профиліңізге сақтау мүмкін емес"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Әкімші жеке файлдарды жұмыс профиліңізге сақтауға рұқсат етпейді."</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Жеке профиліңізге сақтау мүмкін емес"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Әкімші жұмыс файлдарын жеке профиліңізге сақтауға рұқсат етпейді."</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> профиліне сақтау мүмкін емес"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Әкімшіңіз сізге <xliff:g id="PROFILE_0">%1$s</xliff:g> файлдарын <xliff:g id="PROFILE_1">%2$s</xliff:g> профиліңізге сақтауға рұқсат бермейді."</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Бұл әрекетке рұқсат берілмеген"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Толығырақ ақпарат үшін әкімшімен хабарласыңыз."</string>
<string name="root_recent" msgid="1080156975424341623">"Соңғы"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Жаңа атауы"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> файлын алдын ала көру"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> жұмыс файлын алдын ала көру"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> файлын (<xliff:g id="FILENAME">%2$s</xliff:g>) алдын ала көру"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Басқа қолданбалардағы файлдарды шолу"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Анонимді"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Осы қалтаны пайдалану"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Бұл қалтаны пайдалану мүмкін емес"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Құпиялықты қорғау мақсатында басқа қалта таңдаңыз"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Жаңа қалта жасау"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Осы телефоннан іздеу"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Осы құрылғыда іздеу"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Іздеу тарихын <xliff:g id="TEXT">%1$s</xliff:g> жою"</string>
<string name="personal_tab" msgid="3878576287868528503">"Жеке"</string>
<string name="work_tab" msgid="7265359366883747413">"Жұмыс"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index c190cee..365efd1 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"មិនអាចដំណើរការមាតិកាបានទេនៅពេលនេះ"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"កម្មវិធីការងារត្រូវបានផ្អាក"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"បើកកម្មវិធីការងារ"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"កម្មវិធី<xliff:g id="PROFILE">%1$s</xliff:g>ត្រូវបានផ្អាក"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"បើកកម្មវិធី<xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"មិនអាចជ្រើសរើសឯកសារការងារបានទេ"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកមិនអនុញ្ញាតឱ្យអ្នកចូលប្រើឯកសារការងារពីកម្មវិធីផ្ទាល់ខ្លួនទេ"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"មិនអាចជ្រើសរើសឯកសារផ្ទាល់ខ្លួនបានទេ"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកមិនអនុញ្ញាតឱ្យអ្នកចូលប្រើឯកសារផ្ទាល់ខ្លួនពីកម្មវិធីការងារទេ"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"មិនអាចជ្រើសរើសឯកសារ<xliff:g id="PROFILE">%1$s</xliff:g>បានទេ"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកមិនអនុញ្ញាតឱ្យអ្នកចូលប្រើឯកសារ<xliff:g id="PROFILE_0">%1$s</xliff:g>ពីកម្មវិធី<xliff:g id="PROFILE_1">%2$s</xliff:g>ទេ"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"មិនអាចរក្សាទុកទៅកម្រងព័ត៌មានការងារបានទេ"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកមិនអនុញ្ញាតឱ្យអ្នករក្សាទុកឯកសារផ្ទាល់ខ្លួនទៅកម្រងព័ត៌មានការងាររបស់អ្នកទេ"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"មិនអាចរក្សាទុកកម្រងព័ត៌មានផ្ទាល់ខ្លួនបានទេ"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកមិនអនុញ្ញាតឱ្យអ្នករក្សាទុកឯកសារការងារទៅកម្រងព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នកទេ"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"មិនអាចរក្សាទុកទៅកម្រងព័ត៌មាន<xliff:g id="PROFILE">%1$s</xliff:g>ទេ"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកមិនអនុញ្ញាតឱ្យអ្នករក្សាទុកឯកសារ<xliff:g id="PROFILE_0">%1$s</xliff:g>ទៅកម្រងព័ត៌មាន<xliff:g id="PROFILE_1">%2$s</xliff:g>របស់អ្នកទេ"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"សកម្មភាពនេះមិនត្រូវបានអនុញ្ញាតទេ"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"ដើម្បីស្វែងយល់បន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នក"</string>
<string name="root_recent" msgid="1080156975424341623">"ថ្មីៗ"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"ឈ្មោះថ្មី"</string>
<string name="preview_file" msgid="4056622696305432343">"មើលឯកសារ <xliff:g id="FILENAME">%1$s</xliff:g> សាកល្បង"</string>
<string name="preview_work_file" msgid="4495643735563487273">"មើលឯកសារការងារ <xliff:g id="FILENAME">%1$s</xliff:g> សាកល្បង"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"មើលឯកសារ<xliff:g id="PROFILE">%1$s</xliff:g> <xliff:g id="FILENAME">%2$s</xliff:g> សាកល្បង"</string>
<string name="apps_row_title" msgid="3340490016663092925">"រុករកឯកសារនៅក្នុងកម្មវិធីផ្សេងទៀត"</string>
<string name="anonymous_application" msgid="7633027057951625862">"អនាមិក"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ប្រើថតនេះ"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"មិនអាចប្រើថតនេះបានទេ"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"ដើម្បីការពារឯកជនភាពរបស់អ្នក សូមជ្រើសរើសថតផ្សេងទៀត"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"បង្កើតថតថ្មី"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ស្វែងរកក្នុងទូរសព្ទនេះ"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ស្វែងរកឧបករណ៍នេះ"</string>
<string name="delete_search_history" msgid="2202015025607694515">"លុបប្រវត្តិស្វែងរក <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"ផ្ទាល់ខ្លួន"</string>
<string name="work_tab" msgid="7265359366883747413">"ការងារ"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index b654b6d..988be21 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -34,7 +34,7 @@
<string name="menu_open" msgid="9092138100049759315">"ತೆರೆ"</string>
<string name="menu_open_with" msgid="5507647065467520229">"ಇದರ ಮೂಲಕ ತೆರೆಯಿರಿ"</string>
<string name="menu_open_in_new_window" msgid="6686563636123311276">"ಹೊಸ ವಿಂಡೋನಲ್ಲಿ ತೆರೆಯಿರಿ"</string>
- <string name="menu_save" msgid="5195367497138965168">"ಉಳಿಸು"</string>
+ <string name="menu_save" msgid="5195367497138965168">"ಸೇವ್ ಮಾಡಿ"</string>
<string name="menu_share" msgid="4307140947108068356">"ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="menu_delete" msgid="1022254131543256626">"ಅಳಿಸಿ"</string>
<string name="menu_select_all" msgid="7600576812185570403">"ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆಮಾಡಿ"</string>
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"ಈ ಕ್ಷಣದಲ್ಲಿ ವಿಷಯವನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳನ್ನು ಆನ್ ಮಾಡಿ"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> ಆ್ಯಪ್ಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> ಆ್ಯಪ್ಗಳನ್ನು ಆನ್ ಮಾಡಿ"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"ಉದ್ಯೋಗದ ಫೈಲ್ಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ ಒಂದರಿಂದ ಉದ್ಯೋಗದ ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ನಿಮ್ಮ ಐಟಿ ನಿರ್ವಾಹಕರು ನಿಮಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"ವೈಯಕ್ತಿಕ ಫೈಲ್ಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ ಒಂದರಿಂದ ವೈಯಕ್ತಿಕ ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ನಿಮ್ಮ ಐಟಿ ನಿರ್ವಾಹಕರು ನಿಮಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> ಫೈಲ್ಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು <xliff:g id="PROFILE_1">%2$s</xliff:g> ಆ್ಯಪ್ನಿಂದ <xliff:g id="PROFILE_0">%1$s</xliff:g> ಫೈಲ್ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ನಿಮಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ಗೆ ಉಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ಗೆ ವೈಯಕ್ತಿಕ ಫೈಲ್ಗಳನ್ನು ಉಳಿಸಲು ನಿಮ್ಮ ಐಟಿ ನಿರ್ವಾಹಕರು ನಿಮಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ಗೆ ಉಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ಗೆ ಉದ್ಯೋಗದ ಫೈಲ್ಗಳನ್ನು ಉಳಿಸಲು ನಿಮ್ಮ ಐಟಿ ನಿರ್ವಾಹಕರು ನಿಮಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> ಪ್ರೊಫೈಲ್ಗೆ ಸೇವ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು ನಿಮ್ಮ <xliff:g id="PROFILE_1">%2$s</xliff:g> ಪ್ರೊಫೈಲ್ಗೆ <xliff:g id="PROFILE_0">%1$s</xliff:g> ಫೈಲ್ಗಳನ್ನು ಸೇವ್ ಮಾಡಲು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"ಈ ಕ್ರಿಯೆಯನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"ಇನ್ನಷ್ಟು ತಿಳಿಯಲು, ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ"</string>
<string name="root_recent" msgid="1080156975424341623">"ಇತ್ತೀಚಿನದು"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"ಹೊಸ ಹೆಸರು"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> ಫೈಲ್ ಅನ್ನು ಪೂರ್ವವೀಕ್ಷಿಸಿ"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> ಉದ್ಯೋಗದ ಫೈಲ್ ಅನ್ನು ಪೂರ್ವವೀಕ್ಷಣೆ ಮಾಡಿ"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> ಫೈಲ್ <xliff:g id="FILENAME">%2$s</xliff:g> ಅನ್ನು ಪೂರ್ವವೀಕ್ಷಿಸಿ"</string>
<string name="apps_row_title" msgid="3340490016663092925">"ಇತರ ಆ್ಯಪ್ಗಳಲ್ಲಿರುವ ಫೈಲ್ಗಳನ್ನು ಬ್ರೌಸ್ ಮಾಡಿ"</string>
<string name="anonymous_application" msgid="7633027057951625862">"ಅನಾಮಧೇಯ"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ಈ ಫೋಲ್ಡರ್ ಬಳಸಿ"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ಈ ಫೋಲ್ಡರ್ ಅನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"ನಿಮ್ಮ ಗೌಪ್ಯತೆಯನ್ನು ಕಾಪಾಡಲು, ಬೇರೊಂದು ಫೋಲ್ಡರ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"ಹೊಸ ಫೋಲ್ಡರ್ ರಚಿಸಿ"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ಈ ಫೋನ್ನಲ್ಲಿ ಹುಡುಕಿ"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ಈ ಸಾಧನವನ್ನು ಹುಡುಕಿ"</string>
<string name="delete_search_history" msgid="2202015025607694515">"ಹುಡುಕಾಟ ಇತಿಹಾಸವನ್ನು ಅಳಿಸಿ <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"ವೈಯಕ್ತಿಕ"</string>
<string name="work_tab" msgid="7265359366883747413">"ಉದ್ಯೋಗ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index ae44b2d..bb313e8 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"현재 콘텐츠를 로드할 수 없습니다."</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"직장 앱이 일시중지됨"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"직장 앱 사용 설정"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> 앱이 일시중지됨"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> 앱 사용 설정"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"직장 파일을 선택할 수 없음"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT 관리자가 개인 앱에서 직장 파일에 액세스하도록 허용하지 않습니다."</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"개인 파일을 선택할 수 없음"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT 관리자가 직장 앱에서 개인 파일에 액세스하도록 허용하지 않습니다."</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> 파일을 선택할 수 없음"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT 관리자가 <xliff:g id="PROFILE_1">%2$s</xliff:g> 앱에서 <xliff:g id="PROFILE_0">%1$s</xliff:g> 파일에 액세스하도록 허용하지 않습니다."</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"직장 프로필에 저장할 수 없음"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT 관리자가 직장 프로필에 개인 파일을 저장하도록 허용하지 않습니다."</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"개인 프로필에 저장할 수 없음"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT 관리자가 개인 프로필에 직장 파일을 저장하도록 허용하지 않습니다."</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> 프로필에 저장할 수 없음"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT 관리자가 <xliff:g id="PROFILE_0">%1$s</xliff:g> 파일을 <xliff:g id="PROFILE_1">%2$s</xliff:g> 프로필에 저장하도록 허용하지 않습니다."</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"금지된 작업"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"자세히 알아보려면 IT 관리자에게 문의하세요."</string>
<string name="root_recent" msgid="1080156975424341623">"최근"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"새 이름"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> 파일 미리보기"</string>
<string name="preview_work_file" msgid="4495643735563487273">"직장 파일 <xliff:g id="FILENAME">%1$s</xliff:g> 미리보기"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> 파일(<xliff:g id="FILENAME">%2$s</xliff:g>) 미리보기"</string>
<string name="apps_row_title" msgid="3340490016663092925">"다른 앱의 파일 탐색"</string>
<string name="anonymous_application" msgid="7633027057951625862">"익명"</string>
<string name="open_tree_button" msgid="6402871398424497776">"이 폴더 사용"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"이 폴더를 사용할 수 없음"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"개인정보 보호를 위해 다른 폴더를 선택하세요."</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"새 폴더 만들기"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"이 휴대전화 검색"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"이 기기 검색"</string>
<string name="delete_search_history" msgid="2202015025607694515">"검색 기록 삭제 <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"개인"</string>
<string name="work_tab" msgid="7265359366883747413">"직장"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 430886e..83ac3fe 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Учурда мазмун жүктөлбөй жатат"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Жумуш колдонмолору тындырылды"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Жумуш колдонмолорун күйгүзүү"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> колдонмолору тындырылды"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> колдонмолорун күйгүзүү"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Жумуш файлдарын тандоого болбойт"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT администраторуңуз жумуш файлдарына жеке колдонмодон кирүүгө тыюу салды"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Жеке файлдарды тандоого болбойт"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT администраторуңуз жеке файлдарга жумуш колдонмосунан кирүүгө тыюу салды"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> файлдарын тандоого болбойт"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT администратору <xliff:g id="PROFILE_0">%1$s</xliff:g> файлдарын <xliff:g id="PROFILE_1">%2$s</xliff:g> колдонмосунан пайдаланууга тыюу салды"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Жумуш профилине сактоого болбойт"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT администраторуңуз жеке файлдарды жумуш профилине сактоого тыюу салды"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Жеке профилге сактоого болбойт"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT администраторуңуз жумуш файлдарын жеке профилде сактоого тыюу салды"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> профилине сактоого болбойт"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT администратору <xliff:g id="PROFILE_0">%1$s</xliff:g> файлдарын <xliff:g id="PROFILE_1">%2$s</xliff:g> профилине сактоого тыюу салды"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Бул аракетке уруксат жок"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Көбүрөөк маалымат үчүн, IT администраторуңузга кайрылыңыз"</string>
<string name="root_recent" msgid="1080156975424341623">"Акыркы"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Жаңы аталыш"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> файлын алдын ала көрүү"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> жумуш файлын алдын ала көрүү"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> файлын (<xliff:g id="FILENAME">%2$s</xliff:g>) алдын ала көрүү"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Башка колдонмолордон файлдарды карап чыгуу"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Жашыруун"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Бул папканы колдонуу"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Бул папканы колдонууга болбойт"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Коопсуздугуңузду коргоо үчүн башка папканы тандаңыз"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Жаңы папка түзүү"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Ушул телефондо издөө"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Бул түзмөктү издөө"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Издөө таржымалы тазалансын: <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Жеке"</string>
<string name="work_tab" msgid="7265359366883747413">"Жумуш"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 75f35dc..8794da0 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"ບໍ່ສາມາດໂຫຼດເນື້ອຫາໄດ້ໃນຂະນະນີ້"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"ຢຸດແອັບບ່ອນເຮັດວຽກຊົ່ວຄາວແລ້ວ"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"ເປີດໃຊ້ແອັບບ່ອນເຮັດວຽກ"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"ແອັບ <xliff:g id="PROFILE">%1$s</xliff:g> ຢຸດຊົ່ວຄາວແລ້ວ"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"ເປີດແອັບ <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"ບໍ່ສາມາດເລືອກໄຟລ໌ວຽກໄດ້"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ເຂົ້າເຖິງໄຟລ໌ວຽກຈາກແອັບສ່ວນຕົວໄດ້"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"ບໍ່ສາມາດເລືອກໄຟລ໌ສ່ວນຕົວໄດ້"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ເຂົ້າເຖິງໄຟລ໌ສ່ວນຕົວຈາກແອັບວຽກໄດ້"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"ບໍ່ສາມາດເລືອກໄຟລ໌ <xliff:g id="PROFILE">%1$s</xliff:g> ໄດ້"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ທ່ານເຂົ້າເຖິງໄຟລ໌ <xliff:g id="PROFILE_0">%1$s</xliff:g> ຈາກແອັບ <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"ບໍ່ສາມາດບັນທຶກໄປໃສ່ໂປຣໄຟລ໌ວຽກໄດ້"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ບັນທຶກໄຟລ໌ສ່ວນຕົວໄປໃສ່ໂປຣໄຟລ໌ວຽກທ່ານ"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"ບໍ່ສາມາດບັນທຶກໄປໃສ່ໂປຣໄຟລ໌ສ່ວນຕົວໄດ້"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ທ່ານບັນທຶກໄຟລ໌ວຽກໄປໃສ່ໂປຣໄຟລ໌ສ່ວນຕົວຂອງທ່ານໄດ້"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"ບໍ່ສາມາດບັນທຶກໃສ່ໂປຣໄຟລ໌ <xliff:g id="PROFILE">%1$s</xliff:g> ໄດ້"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ທ່ານບັນທຶກໄຟລ໌ <xliff:g id="PROFILE_0">%1$s</xliff:g> ໃສ່ໂປຣໄຟລ໌ <xliff:g id="PROFILE_1">%2$s</xliff:g> ຂອງທ່ານ"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"ບໍ່ອະນຸຍາດຄຳສັ່ງນີ້"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"ເພື່ອສຶກສາເພີ່ມເຕີມ, ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານ"</string>
<string name="root_recent" msgid="1080156975424341623">"ຫຼ້າສຸດ"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"ຊື່ໃໝ່"</string>
<string name="preview_file" msgid="4056622696305432343">"ເບິ່ງຕົວຢ່າງໄຟລ໌ <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"ເບິ່ງຕົວຢ່າງໄຟລ໌ວຽກ <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"ຕົວຢ່າງໄຟລ໌ <xliff:g id="PROFILE">%1$s</xliff:g> <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"ເລືອກໄຟລ໌ໃນແອັບອື່ນ"</string>
<string name="anonymous_application" msgid="7633027057951625862">"ບໍ່ລະບຸຊື່"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ໃຊ້ໂຟນເດີນີ້"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ບໍ່ສາມາດໃຊ້ໂຟນເດີນີ້ໄດ້"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"ໃຫ້ເລືອກໂຟນເດີອື່ນເພື່ອປົກປ້ອງຄວາມເປັນສ່ວນຕົວຂອງທ່ານ"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"ສ້າງໂຟນເດີໃໝ່"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ຊອກຫາໂທລະສັບໜ່ວຍນີ້"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ຊອກຫາອຸປະກອນນີ້"</string>
<string name="delete_search_history" msgid="2202015025607694515">"ລຶບປະຫວັດການຊອກຫາ <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"ສ່ວນຕົວ"</string>
<string name="work_tab" msgid="7265359366883747413">"ວຽກ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index e21563f..88420bf 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Šiuo metu nepavyksta įkelti turinio"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Darbo programos pristabdytos"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Įjungti darbo programas"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> programos pristabdytos"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Įjungti <xliff:g id="PROFILE">%1$s</xliff:g> programas"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Negalima pasirinkti darbo failų"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT administratorius neleidžia pasiekti darbo failų iš asmeninės programos"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Negalima pasirinkti asmeninių failų"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT administratorius neleidžia pasiekti asmeninių failų iš darbo programos"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Negalima pasirinkti <xliff:g id="PROFILE">%1$s</xliff:g> failų"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT administratorius neleidžia pasiekti <xliff:g id="PROFILE_0">%1$s</xliff:g> failų iš <xliff:g id="PROFILE_1">%2$s</xliff:g> programos"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Negalima saugoti darbo profilyje"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT administratorius neleidžia saugoti asmeninių failų darbo profilyje"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Negalima saugoti asmeniniame profilyje"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT administratorius neleidžia saugoti darbo failų asmeniniame profilyje"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Negalima išsaugoti <xliff:g id="PROFILE">%1$s</xliff:g> profilyje"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT administratorius neleidžia išsaugoti <xliff:g id="PROFILE_0">%1$s</xliff:g> failų <xliff:g id="PROFILE_1">%2$s</xliff:g> profilyje"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Šis veiksmas neleidžiamas"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Jei norite sužinoti daugiau, susisiekite su savo IT administratoriumi"</string>
<string name="root_recent" msgid="1080156975424341623">"Naujausi"</string>
@@ -310,6 +316,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Naujas pavadinimas"</string>
<string name="preview_file" msgid="4056622696305432343">"Peržiūrėti failą „<xliff:g id="FILENAME">%1$s</xliff:g>“"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Peržiūrėti darbo failą „<xliff:g id="FILENAME">%1$s</xliff:g>“"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Peržiūrėti <xliff:g id="PROFILE">%1$s</xliff:g> failą „<xliff:g id="FILENAME">%2$s</xliff:g>“"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Failų naršymas kitose programose"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anoniminė"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Naudoti šį aplanką"</string>
@@ -318,7 +325,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Negalima naudoti šio aplanko"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Kad apsaugotumėte privatumą, pasirinkite kitą aplanką"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Kurti naują aplanką"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Ieškoti šiame telefone"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Ieškoti šiame įrenginyje"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Ištrinkite paieškos istoriją <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Asmeninis"</string>
<string name="work_tab" msgid="7265359366883747413">"Darbo"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index c410d68..384395b 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Pašlaik nevar ielādēt saturu."</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Darba lietotnes ir apturētas"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Ieslēgt darba lietotnes"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Šāda profila lietotņu darbība ir pārtraukta: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Ieslēgt šāda profila lietotnes: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Nevar atlasīt darba failus"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Jūsu IT administrators neatļauj piekļūt darba failiem no personīgās lietotnes"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Nevar atlasīt personīgos failus"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Jūsu IT administrators neatļauj piekļūt personīgajiem failiem no darba lietotnes"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Nevar atlasīt šāda profila failus: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Jūsu IT administrators neļauj jums saglabāt viena profila (<xliff:g id="PROFILE_0">%1$s</xliff:g>) failiem, izmantojot cita profila (<xliff:g id="PROFILE_1">%2$s</xliff:g>) lietotni."</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Nevar saglabāt darba profilā"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Jūsu IT administrators neatļauj saglabāt personīgos failus jūsu darba profilā"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Nevar saglabāt personīgajā profilā"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Jūsu IT administrators neatļauj saglabāt darba failus jūsu personīgajā profilā"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Nevar saglabāt šādā profilā: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Jūsu IT administrators neļauj jums saglabāt viena profila (<xliff:g id="PROFILE_0">%1$s</xliff:g>) failus citā profilā (<xliff:g id="PROFILE_1">%2$s</xliff:g>)."</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Šī darbība nav atļauta"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Lai uzzinātu vairāk, sazinieties ar organizācijas IT administratoru"</string>
<string name="root_recent" msgid="1080156975424341623">"Neseni"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Jauns nosaukums"</string>
<string name="preview_file" msgid="4056622696305432343">"Priekšskatīt failu <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Darba faila <xliff:g id="FILENAME">%1$s</xliff:g> priekšskatīšana"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Priekšskatīt failu <xliff:g id="FILENAME">%2$s</xliff:g> no šāda profila: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Failu pārlūkošana citās lietotnēs"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonīma"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Izmantot šo mapi"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Nevar izmantot šo mapi"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Lai aizsargātu savu konfidencialitāti, izvēlieties citu mapi."</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Izveidot jaunu mapi"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Meklēt šajā tālrunī"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Meklēt šajā ierīcē"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Meklēšanas vēstures dzēšana <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personīgais profils"</string>
<string name="work_tab" msgid="7265359366883747413">"Darba profils"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 5a3ee30..6049c02 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Во моментов не може да се вчита содржината."</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Работните апликации се паузирани"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Вклучете ги работните апликации"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> апликации се паузирани"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Вклучете ги <xliff:g id="PROFILE">%1$s</xliff:g> апликации"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Не може да се изберат работни датотеки"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT-администраторот не ви дозволува да пристапувате до работни датотеки од лична апликација"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Не може да се изберат лични датотеки"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT-администраторот не ви дозволува да пристапувате до лични датотеки од работна апликација"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Не може да се изберат датотеки од <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT-администраторот не ви дозволува да пристапите до датотеките од <xliff:g id="PROFILE_0">%1$s</xliff:g> преку <xliff:g id="PROFILE_1">%2$s</xliff:g> апликација"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Не може да се зачува во работниот профил"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT-администраторот не ви дозволува да зачувувате лични датотеки во работниот профил"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Не може да се зачува во личниот профил"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT-администраторот не ви дозволува да зачувувате работни датотеки во личниот профил"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Не може да се зачува на <xliff:g id="PROFILE">%1$s</xliff:g> профил"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT-администраторот не ви дозволува да ги зачувате датотеките од <xliff:g id="PROFILE_0">%1$s</xliff:g> на вашиот <xliff:g id="PROFILE_1">%2$s</xliff:g> профил"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Дејството не е дозволено"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"За да дознаете повеќе, контактирајте со IT-администраторот"</string>
<string name="root_recent" msgid="1080156975424341623">"Неодамнешни"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Ново име"</string>
<string name="preview_file" msgid="4056622696305432343">"Прегледајте ја датотеката <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Прегледајте ја работната датотека <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Прегледајте ја датотеката <xliff:g id="FILENAME">%2$s</xliff:g> на <xliff:g id="PROFILE">%1$s</xliff:g> профил"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Прелистувајте датотеки во други апликации"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Анонимна"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Користи ја папкава"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Не може да се користи папкава"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"За да ја заштитите вашата приватност, изберете друга папка"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Создај нова папка"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Пребарајте го телефонов"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Пребарајте го уредов"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Избришете ја историјата на пребарување <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Личен"</string>
<string name="work_tab" msgid="7265359366883747413">"Работен"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 4f9ec99..5de0099 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"ഇപ്പോൾ ഉള്ളടക്കം ലോഡുചെയ്യാൻ കഴിയില്ല"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"ഔദ്യോഗിക ആപ്പുകൾ തൽക്കാലം നിർത്തിയിരിക്കുന്നു"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"ഔദ്യോഗിക ആപ്പുകൾ ഓണാക്കുക"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> ആപ്പുകൾ താൽക്കാലികമായി നിർത്തി"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> ആപ്പുകൾ ഓണാക്കുക"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"ഔദ്യോഗിക ഫയലുകൾ തിരഞ്ഞെടുക്കാനാവില്ല"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"വ്യക്തിപരമായ ആപ്പിൽ നിന്ന് ഔദ്യോഗിക ഫയലുകൾ ആക്സസ് ചെയ്യാൻ നിങ്ങളുടെ ഐടി അഡ്മിൻ അനുവദിക്കുന്നില്ല"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"വ്യക്തിപര ഫയലുകൾ തിരഞ്ഞെടുക്കാനാവില്ല"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"ഔദ്യോഗിക ആപ്പിൽ നിന്ന് വ്യക്തിപര ഫയലുകൾ ആക്സസ് ചെയ്യാൻ നിങ്ങളുടെ ഐടി അഡ്മിൻ അനുവദിക്കുന്നില്ല"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> ഫയലുകൾ തിരഞ്ഞെടുക്കാനാകുന്നില്ല"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"<xliff:g id="PROFILE_1">%2$s</xliff:g> ആപ്പിൽ നിന്ന് <xliff:g id="PROFILE_0">%1$s</xliff:g> ഫയലുകൾ ആക്സസ് ചെയ്യാൻ നിങ്ങളുടെ ഐടി അഡ്മിൻ അനുവദിക്കുന്നില്ല"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് സംരക്ഷിക്കാനാവില്ല"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"വ്യക്തിപര ഫയലുകൾ ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് സംരക്ഷിക്കാൻ നിങ്ങളുടെ ഐടി അഡ്മിൻ അനുവദിക്കുന്നില്ല"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"വ്യക്തിപര പ്രൊഫൈലിലേക്ക് സംരക്ഷിക്കാനാവില്ല"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"ഔദ്യോഗിക ഫയലുകൾ നിങ്ങളുടെ വ്യക്തിപര പ്രൊഫൈലിലേക്ക് സംരക്ഷിക്കാൻ ഐടി അഡ്മിൻ അനുവദിക്കുന്നില്ല"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> പ്രൊഫൈലിലേക്ക് സംരക്ഷിക്കാനാകുന്നില്ല"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"<xliff:g id="PROFILE_0">%1$s</xliff:g> ഫയലുകൾ നിങ്ങളുടെ <xliff:g id="PROFILE_1">%2$s</xliff:g> പ്രൊഫൈലിലേക്ക് സംരക്ഷിക്കാൻ നിങ്ങളുടെ ഐടി അഡ്മിൻ അനുവദിക്കുന്നില്ല"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"ഈ പ്രവൃത്തി അനുവദനീയമല്ല"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"കൂടുതലറിയാൻ, നിങ്ങളുടെ ഐടി അഡ്മിനെ ബന്ധപ്പെടുക"</string>
<string name="root_recent" msgid="1080156975424341623">"ഏറ്റവും പുതിയത്"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"പുതിയ പേര്"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> ഫയൽ പ്രിവ്യൂ ചെയ്യുക"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> എന്ന ഔദ്യോഗിക ഫയൽ പ്രിവ്യൂ ചെയ്യുക"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> ഫയൽ <xliff:g id="FILENAME">%2$s</xliff:g> പ്രിവ്യൂ ചെയ്യുക"</string>
<string name="apps_row_title" msgid="3340490016663092925">"ഫയലുകള് മറ്റ് ആപ്പുകളില് ബ്രൗസ് ചെയ്യുക"</string>
<string name="anonymous_application" msgid="7633027057951625862">"അജ്ഞാതം"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ഈ ഫോൾഡർ ഉപയോഗിക്കുക"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ഈ ഫോൾഡർ ഉപയോഗിക്കാനാവില്ല"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"നിങ്ങളുടെ സ്വകാര്യത പരിരക്ഷിക്കാൻ മറ്റൊരു ഫോൾഡർ തിരഞ്ഞെടുക്കുക"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"പുതിയ ഫോൾഡർ സൃഷ്ടിക്കുക"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ഈ ഫോണിൽ തിരയുക"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ഈ ഉപകരണം തിരയുക"</string>
<string name="delete_search_history" msgid="2202015025607694515">"തിരയൽ ചരിത്രം <xliff:g id="TEXT">%1$s</xliff:g> ഇല്ലാതാക്കുക"</string>
<string name="personal_tab" msgid="3878576287868528503">"വ്യക്തിപരം"</string>
<string name="work_tab" msgid="7265359366883747413">"ഔദ്യോഗികം"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index f86cbfd..cfbd53e 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Агуулгыг ачаалах боломжгүй байна"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Ажлын аппуудыг түр зогсоосон"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Ажлын аппуудыг асаах"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g>-н аппуудыг түр зогсоосон"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g>-н аппуудыг асаах"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Ажлын файлуудыг сонгох боломжгүй байна"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Таны мэдээлэл технологийн админ танд хувийн аппаас ажлын файлуудад хандахыг зөвшөөрөөгүй байна"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Хувийн файлуудыг сонгох боломжгүй байна"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Таны мэдээлэл технологийн админ ажлын аппаас хувийн файлуудад хандахыг танд зөвшөөрөөгүй байна"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g>-н файлуудыг сонгох боломжгүй"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Танай IT админ танд <xliff:g id="PROFILE_1">%2$s</xliff:g>-н аппаас <xliff:g id="PROFILE_0">%1$s</xliff:g>-н файлуудад хандахыг зөвшөөрдөггүй"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Ажлын профайлыг хадгалах боломжгүй байна"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Таны мэдээлэл технологийн админ танд ажлын профайлдаа хувийн файлууд хадгалахыг зөвшөөрөхгүй байна"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Хувийн профайлыг хадгалах боломжгүй байна"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Таны мэдээлэл технологийн админ танд хувийн профайлдаа ажлын файлууд хадгалахыг зөвшөөрөхгүй байна"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g>-н профайлд хадгалах боломжгүй"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Танай IT админ танд <xliff:g id="PROFILE_0">%1$s</xliff:g>-н файлуудыг <xliff:g id="PROFILE_1">%2$s</xliff:g>-н профайлдаа хадгалахыг зөвшөөрдөггүй"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Энэ үйлдлийг зөвшөөрөөгүй байна"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Нэмэлт мэдээлэл авахын тулд мэдээлэл технологийн админтайгаа холбогдоно уу"</string>
<string name="root_recent" msgid="1080156975424341623">"Саяхны"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Шинэ нэр"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> файлыг урьдчилан үзэх"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> ажлын файлыг урьдчилан үзэх"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g>-н <xliff:g id="FILENAME">%2$s</xliff:g> файлыг урьдчилан үзэх"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Бусад аппын файлыг үзэх"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Үл мэдэгдэх"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Энэ фолдерыг ашиглах"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Энэ фолдерыг ашиглах боломжгүй байна"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Нууцлалаа хамгаалахын тулд өөр фолдер сонгоно уу"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Шинэ фолдер үүсгэх"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Энэ утсыг хайх"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Энэ төхөөрөмжийг хайх"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Хайлтын түүхийг устгах <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Хувийн"</string>
<string name="work_tab" msgid="7265359366883747413">"Ажлын"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index e5596e5..a98a5c2 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"याक्षणी आशय लोड करू शकत नाही"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"कामाशी संबंधित अॅप्स थांबवली आहेत"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"कामाशी संबंधित अॅप्स सुरू करा"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> ॲप्स थांबवली आहेत"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> अॅप्स सुरू करा"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"कामासंबंधित फाइल निवडता आल्या नाहीत"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"तुमचा आयटी ॲडमिन तुम्हाला वैयक्तिक ॲपवरून कामासंबंधित फाइल अॅक्सेस करण्याची परवानगी देत नाही"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"वैयक्तिक फाइल निवडता आल्या नाहीत"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"तुमचा आयटी ॲडमिन तुम्हाला कार्य ॲपवरून वैयक्तिक फाइल अॅक्सेस करण्याची परवानगी देत नाही"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> फाइल निवडू शकत नाही"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"तुमचा आयटी ॲडमिन तुम्हाला <xliff:g id="PROFILE_1">%2$s</xliff:g> अॅपमधील <xliff:g id="PROFILE_0">%1$s</xliff:g> फाइल अॅक्सेस करण्याची अनुमती देत नाही"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"कार्य प्रोफाइलमध्ये सेव्ह करता आली नाही"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"तुमचा आयटी ॲडमिन तुम्हाला तुमच्या कार्य प्रोफाईलमध्ये वैयक्तिक फाइल सेव्ह करण्याची परवानगी देत नाही"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"वैयक्तिक प्रोफाइलमध्ये सेव्ह करता आली नाही"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"तुमचा आयटी ॲडमिन तुम्हाला तुमच्या वैयक्तिक प्रोफाईलमध्ये कामासंबंधित फाइल सेव्ह करण्याची परवानगी देत नाही"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> या प्रोफाइलवर सेव्ह करू शकत नाही"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"तुमचा आयटी ॲडमिन तुम्हाला तुमच्या <xliff:g id="PROFILE_1">%2$s</xliff:g> प्रोफाइलवर <xliff:g id="PROFILE_0">%1$s</xliff:g> फाइल सेव्ह करण्याची अनुमती देत नाही"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"या क्रियेला अनुमती नाही"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"अधिक जाणून घेण्यासाठी तुमच्या आयटी ॲडमिनशी संपर्क साधा"</string>
<string name="root_recent" msgid="1080156975424341623">"अलीकडील"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"नवीन नाव"</string>
<string name="preview_file" msgid="4056622696305432343">"फाइल <xliff:g id="FILENAME">%1$s</xliff:g> चे पूर्वावलोकन करा"</string>
<string name="preview_work_file" msgid="4495643735563487273">"कामासंबंधित फाइल <xliff:g id="FILENAME">%1$s</xliff:g> चे पूर्वावलोकन करा"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="FILENAME">%2$s</xliff:g> या <xliff:g id="PROFILE">%1$s</xliff:g> फाइलचे पूर्वावलोकन करा"</string>
<string name="apps_row_title" msgid="3340490016663092925">"इतर अॅप्समधील फाइल ब्राउझ करा"</string>
<string name="anonymous_application" msgid="7633027057951625862">"अनामित"</string>
<string name="open_tree_button" msgid="6402871398424497776">"हे फोल्डर वापरा"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"हे फोल्डर वापरू शकत नाही"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"तुमच्या गोपनीयतेचे संरक्षण करण्यासाठी दुसरे फोल्डर निवडा"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"नवीन फोल्डर तयार करा"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"या फोनमध्ये शोधा"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"हे डिव्हाइस शोधा"</string>
<string name="delete_search_history" msgid="2202015025607694515">"<xliff:g id="TEXT">%1$s</xliff:g> चा शोध इतिहास हटवा"</string>
<string name="personal_tab" msgid="3878576287868528503">"वैयक्तिक"</string>
<string name="work_tab" msgid="7265359366883747413">"ऑफिस"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 3e7c0b0..f72d99f 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Tidak dapat memuatkan kandungan pada masa ini"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Apl kerja dijeda"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Hidupkan apl kerja"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Apl <xliff:g id="PROFILE">%1$s</xliff:g> dijeda"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Hidupkan apl <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Tidak boleh memilih fail kerja"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Pentadbir IT anda tidak membenarkan anda mengakses fail kerja daripada apl peribadi"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Tidak boleh memilih fail peribadi"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Pentadbir IT anda tidak membenarkan anda mengakses fail peribadi daripada apl kerja"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Tidak dapat memilih fail <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Pentadbir IT anda tidak membenarkan anda mengakses fail <xliff:g id="PROFILE_0">%1$s</xliff:g> daripada apl <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Tidak dapat menyimpan pada profil kerja"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Pentadbir IT anda tidak membenarkan anda menyimpan fail peribadi pada profil kerja anda"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Tidak dapat menyimpan pada profil peribadi"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Pentadbir IT anda tidak membenarkan anda menyimpan fail kerja pada profil peribadi anda"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Tidak dapat menyimpan pada profil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Pentadbir IT anda tidak membenarkan anda menyimpan fail <xliff:g id="PROFILE_0">%1$s</xliff:g> pada profil <xliff:g id="PROFILE_1">%2$s</xliff:g> anda"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Tindakan ini tidak dibenarkan"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Untuk mengetahui lebih lanjut, hubungi pentadbir IT anda"</string>
<string name="root_recent" msgid="1080156975424341623">"Terbaharu"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nama baharu"</string>
<string name="preview_file" msgid="4056622696305432343">"Pratonton fail <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Pratonton fail kerja <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Pratonton fail <xliff:g id="PROFILE">%1$s</xliff:g> <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Semak imbas fail dalam apl lain"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Awanama"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Gunakan folder ini"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Tidak boleh menggunakan folder ini"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Untuk melindungi privasi anda, pilih folder lain"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Buat folder baharu"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Cari dalam telefon ini"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Cari peranti ini"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Padamkan sejarah carian <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Peribadi"</string>
<string name="work_tab" msgid="7265359366883747413">"Kerja"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 3162237..e9c9f40 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"ဖိုင်ကို လောလောဆယ် တင်ပေး၍မရသေးပါ"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"အလုပ်သုံးအက်ပ်များကို ခေတ္တရပ်ထားသည်"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"အလုပ်သုံးအက်ပ်များ ဖွင့်ရန်"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> အက်ပ်များကို ခဏရပ်ထားသည်"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> အက်ပ်များ ဖွင့်ရန်"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"အလုပ်ဖိုင်များကို ရွေး၍မရပါ"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"ကိုယ်ပိုင်အက်ပ်မှနေ၍ အလုပ်ဖိုင်များ သုံးရန် သင်၏ IT စီမံခန့်ခွဲသူက ခွင့်မပြုပါ"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"ကိုယ်ပိုင်ဖိုင်များကို ရွေး၍မရပါ"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"အလုပ်သုံးအက်ပ်မှနေ၍ ကိုယ်ပိုင်ဖိုင်များ သုံးရန် သင်၏ IT စီမံခန့်ခွဲသူက ခွင့်မပြုပါ"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> ဖိုင်များကို ရွေး၍မရပါ"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT စီမံခန့်ခွဲသူသည် <xliff:g id="PROFILE_1">%2$s</xliff:g> အက်ပ်မှ <xliff:g id="PROFILE_0">%1$s</xliff:g> ဖိုင်များကို သင့်အား သုံးခွင့်မပြုပါ"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"အလုပ်ပရိုဖိုင်သို့ သိမ်း၍မရပါ"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"ကိုယ်ပိုင်ဖိုင်များကို သင့်အလုပ်ပရိုဖိုင်သို့ သိမ်းရန် သင်၏ IT စီမံခန့်ခွဲသူက ခွင့်မပြုပါ"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"ကိုပိုင်ပရိုဖိုင်သို့ သိမ်း၍မရပါ"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"အလုပ်ဖိုင်များကို သင့်ကိုယ်ပိုင်ပရိုဖိုင်သို့ သိမ်းရန် သင်၏ IT စီမံခန့်ခွဲသူက ခွင့်မပြုပါ"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> ပရိုဖိုင်တွင် သိမ်း၍မရပါ"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT စီမံခန့်ခွဲသူသည် သင်၏ <xliff:g id="PROFILE_1">%2$s</xliff:g> ပရိုဖိုင်တွင် <xliff:g id="PROFILE_0">%1$s</xliff:g> ဖိုင်များကို သင့်အား သိမ်းခွင့်မပြုပါ။"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"ဤလုပ်ဆောင်ချက်ကို ခွင့်မပြုပါ"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"ပိုမိုလေ့လာရန် သင်၏ IT စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ"</string>
<string name="root_recent" msgid="1080156975424341623">"လတ်တလော"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"အမည်အသစ်"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> ဖိုင်ကို အစမ်းကြည့်ရန်"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> အလုပ်ဖိုင်ကို အစမ်းကြည့်ရှုပါ"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> ဖိုင် <xliff:g id="FILENAME">%2$s</xliff:g> ကို အစမ်းကြည့်ရှုရန်"</string>
<string name="apps_row_title" msgid="3340490016663092925">"အခြားအက်ပ်များတွင် ဖိုင်များကို ဖွင့်ကြည့်ပါ"</string>
<string name="anonymous_application" msgid="7633027057951625862">"အမည်မသိ"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ဤဖိုင်တွဲကို အသုံးပြုပါ"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ဤဖိုင်တွဲကို အသုံးပြု၍ မရပါ"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"သင်၏ကိုယ်ရေးလုံခြုံမှုကို ကာကွယ်ရန် ဖိုင်တွဲနောက်တစ်ခု ရွေးပါ"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"ဖိုင်တွဲအသစ် ပြုလုပ်ရန်"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ဤဖုန်းတွင် ရှာရန်"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ဤစက်တွင် ရှာရန်"</string>
<string name="delete_search_history" msgid="2202015025607694515">"ရှာဖွေမှတ်တမ်း <xliff:g id="TEXT">%1$s</xliff:g> ကိုဖျက်သည်"</string>
<string name="personal_tab" msgid="3878576287868528503">"ကိုယ်ပိုင်"</string>
<string name="work_tab" msgid="7265359366883747413">"အလုပ်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 95674cd..4fb2e0e 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Kan ikke laste inn innholdet for øyeblikket"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Jobbapper er satt på pause"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Slå på jobbapper"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g>-appene er satt på pause"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Slå på <xliff:g id="PROFILE">%1$s</xliff:g>-apper"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Du kan ikke velge jobbfiler"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT-administratoren din tillater ikke at du får tilgang til jobbfiler fra personlige apper"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Du kan ikke velge personlige filer"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT-administratoren din tillater ikke at du får tilgang til personlige filer fra jobbapper"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Kan ikke velge <xliff:g id="PROFILE">%1$s</xliff:g>-filer"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT-administratoren din lar deg ikke bruke <xliff:g id="PROFILE_0">%1$s</xliff:g>-filer fra en <xliff:g id="PROFILE_1">%2$s</xliff:g>-app"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Du kan ikke lagre i jobbprofilen"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT-administratoren din tillater ikke at du lagrer personlige filer i jobbprofilen din"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Du kan ikke lagre i den personlige profilen"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT-administratoren din tillater ikke at du lagrer jobbfiler i den personlige profilen din"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Kan ikke lagre i <xliff:g id="PROFILE">%1$s</xliff:g>-profilen"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT-administratoren din lar deg ikke lagre <xliff:g id="PROFILE_0">%1$s</xliff:g>-filer i <xliff:g id="PROFILE_1">%2$s</xliff:g>-profilen din"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Handlingen er ikke tillatt"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"For å finne ut mer, kontakt IT-administratoren"</string>
<string name="root_recent" msgid="1080156975424341623">"Nylige"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nytt navn"</string>
<string name="preview_file" msgid="4056622696305432343">"Forhåndsvis filen <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Se en forhåndsvisning av jobbfilen, <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Forhåndsvis <xliff:g id="PROFILE">%1$s</xliff:g>-filen <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Bla gjennom filer i andre apper"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonym"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Bruk denne mappen"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Du kan ikke bruke denne mappen"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Velg en annen mappe for å beskytte personvernet ditt"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Opprett en ny mappe"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Søk på denne telefonen"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Søk på denne enheten"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Slett søkelogg <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personlig"</string>
<string name="work_tab" msgid="7265359366883747413">"Jobb"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 7b9cab9..550ae21 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"यस समय सामग्री लोड गर्न सकिँदैन"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"कामसम्बन्धी एपहरू पज गरिएका छन्"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"कामसम्बन्धी एपहरू अन गर्नुहोस्"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> एपहरू पज गरिएका छन्"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> एपहरू अन गर्नुहोस्"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"कार्यालयका फाइलहरू चयन गर्न मिल्दैन"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"तपाईंका IT एडमिनले तपाईंलाई व्यक्तिगत एपमार्फत कार्यालयका फाइलहरू प्रयोग गर्ने अनुमति दिनुभएको छैन"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"व्यक्तिगत फाइलहरू चयन गर्न सकिएन"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"तपाईंका IT एडमिनले तपाईंलाई कामसम्बन्धी एपमार्फत व्यक्तिगत फाइलहरू प्रयोग गर्ने अनुमति दिनुभएको छैन"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> फाइलहरू चयन गर्न मिल्दैन"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"तपाईंका IT एड्मिनले तपाईंलाई <xliff:g id="PROFILE_1">%2$s</xliff:g> एपमा भएका <xliff:g id="PROFILE_0">%1$s</xliff:g> फाइलहरू एक्सेस गर्ने अनुमति दिनुभएको छैन"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"कार्यलयको प्रोफाइलमा सुरक्षित गर्न सकिएन"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"तपाईंका IT एडमिनले तपाईंलाई आफ्नो कार्यलयको प्रोफाइलमा रहेका एपहरूमा व्यक्तिगत फाइलहरू सुरक्षित गर्ने अनुमति दिनुभएको छैन"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"व्यक्तिगत प्रोफाइलमा सुरक्षित गर्न सकिएन"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"तपाईंका IT एडमिनले तपाईंलाई आफ्नो व्यक्तिगत प्रोफाइलमा रहेका एपहरूमा कार्यालयका फाइलहरू सुरक्षित गर्ने अनुमति दिनुभएको छैन"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> प्रोफाइलमा सेभ गर्न मिल्दैन"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"तपाईंका IT एड्मिनले तपाईंलाई तपाईंको <xliff:g id="PROFILE_1">%2$s</xliff:g> प्रोफाइलमा <xliff:g id="PROFILE_0">%1$s</xliff:g> फाइलहरू सेभ गर्ने अनुमति दिनुभएको छैन"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"यो कार्य गर्ने अनुमति छैन"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"थप जानकारी प्राप्त गर्न आफ्ना IT एड्मिनलाई सम्पर्क गर्नुहोस्"</string>
<string name="root_recent" msgid="1080156975424341623">"हालको"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"नयाँ नाम"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> फाइलको पूर्वावलोकन गर्नुहोस्"</string>
<string name="preview_work_file" msgid="4495643735563487273">"कार्यालयको <xliff:g id="FILENAME">%1$s</xliff:g> नामक फाइलको पूर्वावलोकन गर्नुहोस्"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> फाइल <xliff:g id="FILENAME">%2$s</xliff:g> को प्रिभ्यू गर्नुहोस्"</string>
<string name="apps_row_title" msgid="3340490016663092925">"अन्य एपहरूमा फाइलहरू खोज्नुहोस्"</string>
<string name="anonymous_application" msgid="7633027057951625862">"अज्ञात"</string>
<string name="open_tree_button" msgid="6402871398424497776">"यो फोल्डर प्रयोग गर्नुहोस्"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"यो फोल्डर प्रयोग गर्न सकिएन"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"आफ्नो गोपनीयताको संरक्षण गर्न अर्को फोल्डर छान्नुहोस्"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"नयाँ फोल्डर सिर्जना गर्नुहोस्"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"यो फोनमा खोज्नुहोस्"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"यो डिभाइस खोज्नुहोस्"</string>
<string name="delete_search_history" msgid="2202015025607694515">"खोजसम्बन्धी इतिहास मेट्नुहोस् <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"व्यक्तिगत"</string>
<string name="work_tab" msgid="7265359366883747413">"काम"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 384b670..9ec3583 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Kan content momenteel niet laden"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Werk-apps zijn onderbroken"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Werk-apps aanzetten"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g>-apps zijn onderbroken"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g>-apps aanzetten"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Kan geen werkbestanden selecteren"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Je IT-beheerder staat niet toe dat je werkbestanden opent met een app die je voor persoonlijke doeleinden gebruikt"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Kan geen persoonlijke bestanden selecteren"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Je IT-beheerder staat niet toe dat je persoonlijke bestanden opent via een werk-app"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Kan geen <xliff:g id="PROFILE">%1$s</xliff:g>-bestanden selecteren"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Je IT-beheerder staat niet toe dat je <xliff:g id="PROFILE_0">%1$s</xliff:g>-bestanden opent vanuit een <xliff:g id="PROFILE_1">%2$s</xliff:g>-app"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Kan niet opslaan in werkprofiel"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Je IT-beheerder staat niet toe dat je persoonlijke bestanden opslaat in je werkprofiel"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Kan niet opslaan in persoonlijk profiel"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Je IT-beheerder staat niet toe dat je werkbestanden opslaat in je persoonlijke profiel"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Kan niet opslaan in <xliff:g id="PROFILE">%1$s</xliff:g>-profiel"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Je IT-beheerder staat niet toe dat je <xliff:g id="PROFILE_0">%1$s</xliff:g>-bestanden opslaat in je <xliff:g id="PROFILE_1">%2$s</xliff:g>-profiel"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Deze actie is niet toegestaan"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Neem voor meer informatie contact op met je IT-beheerder"</string>
<string name="root_recent" msgid="1080156975424341623">"Recent"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nieuwe naam"</string>
<string name="preview_file" msgid="4056622696305432343">"Voorbeeld van het bestand <xliff:g id="FILENAME">%1$s</xliff:g> bekijken"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Bekijk een voorbeeld van het werkbestand <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Voorbeeld van het <xliff:g id="PROFILE">%1$s</xliff:g>-bestand <xliff:g id="FILENAME">%2$s</xliff:g> weergeven"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Door bestanden browsen in andere apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anoniem"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Deze map gebruiken"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Kan deze map niet gebruiken"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Kies een andere map om je privacy te beschermen"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Nieuwe map maken"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Deze telefoon doorzoeken"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Zoeken op dit apparaat"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Zoekgeschiedenis verwijderen <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Persoonlijk"</string>
<string name="work_tab" msgid="7265359366883747413">"Werk"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index fa895c7..d8eca9d 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"ଏହି ସମୟରେ କଣ୍ଟେଣ୍ଟ ଲୋଡ୍ କରିପାରିବ ନାହିଁ"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"ୱାର୍କ ଆପଗୁଡ଼ିକୁ ବିରତ କରାଯାଇଛି"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"ୱାର୍କ ଆପ୍ସ ଚାଲୁ କରନ୍ତୁ"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> ଆପ୍ସକୁ ବିରତ କରାଯାଇଛି"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> ଆପ୍ସକୁ ଚାଲୁ କରନ୍ତୁ"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"ୱାର୍କ ଫାଇଲଗୁଡ଼ିକ ଚୟନ କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"ଆପଣଙ୍କ IT ଆଡମିନ୍ ଆପଣଙ୍କୁ ଏକ ବ୍ୟକ୍ତିଗତ ଆପରୁ ୱାର୍କ ଫାଇଲଗୁଡ଼ିକ ଆକ୍ସେସ୍ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"ବ୍ୟକ୍ତିଗତ ଫାଇଲଗୁଡ଼ିକ ଚୟନ କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"ଆପଣଙ୍କ IT ଆଡମିନ୍ ଆପଣଙ୍କୁ ଏକ କାର୍ଯ୍ୟସ୍ଥଳୀ ଆପରୁ ବ୍ୟକ୍ତିଗତ ଫାଇଲଗୁଡ଼ିକ ଆକ୍ସେସ୍ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> ଫାଇଲଗୁଡ଼ିକୁ ଚୟନ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"ଆପଣଙ୍କ IT ଆଡମିନ ଏକ <xliff:g id="PROFILE_1">%2$s</xliff:g> ଆପରୁ <xliff:g id="PROFILE_0">%1$s</xliff:g> ଫାଇଲଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"ୱାର୍କ ପ୍ରୋଫାଇଲରେ ସେଭ୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"ଆପଣଙ୍କ IT ଆଡମିନ୍ ଆପଣଙ୍କୁ ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲରେ ବ୍ୟକ୍ତିଗତ ଫାଇଲଗୁଡ଼ିକୁ ସେଭ୍ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲରେ ସେଭ୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"ଆପଣଙ୍କ IT ଆଡମିନ୍ ଆପଣଙ୍କୁ ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲରେ କାର୍ଯ୍ୟସ୍ଥଳୀର ଫାଇଲଗୁଡ଼ିକ ସେଭ୍ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> ପ୍ରୋଫାଇଲରେ ସେଭ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"ଆପଣଙ୍କ IT ଆଡମିନ ଆପଣଙ୍କୁ ଆପଣଙ୍କ <xliff:g id="PROFILE_1">%2$s</xliff:g> ପ୍ରୋଫାଇଲରେ <xliff:g id="PROFILE_0">%1$s</xliff:g> ଫାଇଲଗୁଡ଼ିକୁ ସେଭ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"ଏହି କାର୍ଯ୍ୟକୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"ଅଧିକ ଜାଣିବାକୁ, ଆପଣଙ୍କ IT ଆଡମିନଙ୍କ ସହ କଣ୍ଟାକ୍ଟ କରନ୍ତୁ"</string>
<string name="root_recent" msgid="1080156975424341623">"ବର୍ତ୍ତମାନର"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"ନୂଆ ନାମ"</string>
<string name="preview_file" msgid="4056622696305432343">"ଫାଇଲ୍ <xliff:g id="FILENAME">%1$s</xliff:g> ପୂର୍ବାବଲୋକନ କରନ୍ତୁ"</string>
<string name="preview_work_file" msgid="4495643735563487273">"କାର୍ଯ୍ୟସ୍ଥଳୀ ଫାଇଲ୍ <xliff:g id="FILENAME">%1$s</xliff:g>ର ପ୍ରିଭ୍ୟୁ କରନ୍ତୁ"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> ଫାଇଲ <xliff:g id="FILENAME">%2$s</xliff:g>ର ପ୍ରିଭ୍ୟୁ କରନ୍ତୁ"</string>
<string name="apps_row_title" msgid="3340490016663092925">"ଅନ୍ୟ ଆପ୍ସରେ ଫାଇଲ୍ ବ୍ରାଉଜ୍ କରନ୍ତୁ"</string>
<string name="anonymous_application" msgid="7633027057951625862">"ବେନାମୀ"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ଏହି ଫୋଲ୍ଡର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ଏହି ଫୋଲ୍ଡରକୁ ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"ଆପଣଙ୍କ ଗୋପନୀୟତାକୁ ସୁରକ୍ଷିତ କରିବାକୁ ଅନ୍ୟ ଏକ ଫୋଲ୍ଡର୍ ବାଛନ୍ତୁ"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"ନୂଆ ଫୋଲ୍ଡର୍ ତିଆରି କରନ୍ତୁ"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ଏହି ଫୋନରେ ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ଏହି ଡିଭାଇସକୁ ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
<string name="delete_search_history" msgid="2202015025607694515">"ସର୍ଚ୍ଚ ଇତିହାସ <xliff:g id="TEXT">%1$s</xliff:g>କୁ ଡିଲିଟ କରନ୍ତୁ"</string>
<string name="personal_tab" msgid="3878576287868528503">"ବ୍ୟକ୍ତିଗତ"</string>
<string name="work_tab" msgid="7265359366883747413">"ୱାର୍କ"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index aa7e2ee..f1390ce 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"ਇਸ ਵੇਲੇ ਸਮੱਗਰੀ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ ਹੈ"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਚਾਲੂ ਕਰੋ"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> ਐਪਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ ਹੈ"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> ਐਪਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"ਕਾਰਜ ਸੰਬੰਧੀ ਫ਼ਾਈਲਾਂ ਨੂੰ ਨਹੀਂ ਚੁਣਿਆ ਜਾ ਸਕਦਾ"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"ਤੁਹਾਡਾ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਨੂੰ ਨਿੱਜੀ ਐਪ ਤੋਂ ਕਾਰਜ ਸੰਬੰਧੀ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕਰਨ ਦਿੰਦਾ"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"ਨਿੱਜੀ ਫ਼ਾਈਲਾਂ ਨੂੰ ਨਹੀਂ ਚੁਣਿਆ ਜਾ ਸਕਦਾ"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"ਤੁਹਾਡਾ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਨੂੰ ਕੰਮ ਸੰਬੰਧੀ ਐਪ ਤੋਂ ਨਿੱਜੀ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕਰਨ ਦਿੰਦਾ"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਚੁਣਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"ਤੁਹਾਡਾ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਨੂੰ <xliff:g id="PROFILE_1">%2$s</xliff:g> ਐਪ ਤੋਂ <xliff:g id="PROFILE_0">%1$s</xliff:g> ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੰਦਾ"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"ਤੁਹਾਡਾ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਨੂੰ ਆਪਣੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਨਿੱਜੀ ਫ਼ਾਈਲਾਂ ਰੱਖਿਅਤ ਨਹੀਂ ਕਰਨ ਦਿੰਦਾ"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"ਤੁਹਾਡਾ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਨੂੰ ਆਪਣੇ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਕਾਰਜ ਸੰਬੰਧੀ ਫ਼ਾਈਲਾਂ ਰੱਖਿਅਤ ਨਹੀਂ ਕਰਨ ਦਿੰਦਾ"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> ਪ੍ਰੋਫਾਈਲ \'ਤੇ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"ਤੁਹਾਡਾ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਨੂੰ <xliff:g id="PROFILE_0">%1$s</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਤੁਹਾਡੇ <xliff:g id="PROFILE_1">%2$s</xliff:g> ਪ੍ਰੋਫਾਈਲ \'ਤੇ ਰੱਖਿਅਤ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੰਦਾ"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"ਇਸ ਕਾਰਵਾਈ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"ਹੋਰ ਜਾਣਨ ਲਈ, ਆਪਣੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ"</string>
<string name="root_recent" msgid="1080156975424341623">"ਹਾਲੀਆ"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"ਨਵਾਂ ਨਾਮ"</string>
<string name="preview_file" msgid="4056622696305432343">"ਫ਼ਾਈਲ <xliff:g id="FILENAME">%1$s</xliff:g> ਦੀ ਪੂਰਵ-ਝਲਕ ਦੇਖੋ"</string>
<string name="preview_work_file" msgid="4495643735563487273">"ਕਾਰਜ ਸੰਬੰਧੀ ਫ਼ਾਈਲ <xliff:g id="FILENAME">%1$s</xliff:g> ਦੀ ਪੂਰਵ-ਝਲਕ ਦੇਖੋ"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> ਫ਼ਾਈਲ <xliff:g id="FILENAME">%2$s</xliff:g> ਦੀ ਪੂਰਵ-ਝਲਕ ਦੇਖੋ"</string>
<string name="apps_row_title" msgid="3340490016663092925">"ਹੋਰ ਐਪਾਂ ਵਿੱਚ ਫ਼ਾਈਲਾਂ ਬ੍ਰਾਊਜ਼ ਕਰੋ"</string>
<string name="anonymous_application" msgid="7633027057951625862">"ਗੁਮਨਾਮ"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ਇਹ ਫੋਲਡਰ ਵਰਤੋ"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ਇਹ ਫੋਲਡਰ ਨਹੀਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"ਆਪਣੀ ਪਰਦੇਦਾਰੀ ਦੀ ਸੁਰੱਖਿਆ ਲਈ, ਕੋਈ ਹੋਰ ਫੋਲਡਰ ਚੁਣੋ"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"ਨਵਾਂ ਫੋਲਡਰ ਬਣਾਓ"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ਇਹ ਫ਼ੋਨ ਖੋਜੋ"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਖੋਜੋ"</string>
<string name="delete_search_history" msgid="2202015025607694515">"ਖੋਜ ਇਤਿਹਾਸ ਮਿਟਾਓ <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"ਨਿੱਜੀ"</string>
<string name="work_tab" msgid="7265359366883747413">"ਕਾਰਜ-ਸਥਾਨ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 5684295..4a76faf 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Teraz nie można załadować zawartości"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Aplikacje służbowe zostały wstrzymane"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Włącz aplikacje służbowe"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Aplikacje <xliff:g id="PROFILE">%1$s</xliff:g> zostały wstrzymane"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Włącz aplikacje typu <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Nie można wybrać plików służbowych"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Administrator IT nie pozwala na dostęp do plików służbowych w aplikacjach osobistych"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Nie można wybrać plików osobistych"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Administrator IT nie pozwala na dostęp do plików osobistych w aplikacjach służbowych"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Nie można wybierać plików typu <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Administrator IT nie pozwala na dostęp do plików typu <xliff:g id="PROFILE_0">%1$s</xliff:g> z aplikacji typu <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Nie można zapisać w profilu służbowym"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Administrator IT nie pozwala na zapisywanie plików osobistych w profilu służbowym"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Nie można zapisać w profilu osobistym"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Administrator IT nie pozwala na zapisywanie plików służbowych w profilu osobistym"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Nie można zapisać w profilu typu <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Administrator IT nie pozwala na zapisywanie plików typu <xliff:g id="PROFILE_0">%1$s</xliff:g> w profilu typu <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Ta czynność jest niedozwolona"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Aby dowiedzieć się więcej, skontaktuj się z administratorem IT"</string>
<string name="root_recent" msgid="1080156975424341623">"Najnowsze"</string>
@@ -310,6 +316,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nowa nazwa"</string>
<string name="preview_file" msgid="4056622696305432343">"Wyświetl podgląd pliku <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Wyświetl podgląd pliku służbowego <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Wyświetl podgląd pliku <xliff:g id="FILENAME">%2$s</xliff:g> typu <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Przeglądaj pliki w innych aplikacjach"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonimowa"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Użyj tego folderu"</string>
@@ -318,7 +325,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Nie można użyć tego folderu"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Aby chronić swoją prywatność, wybierz inny folder"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Utwórz nowy folder"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Szukaj na telefonie"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Przeszukaj to urządzenie"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Usuń historię wyszukiwania <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Osobiste"</string>
<string name="work_tab" msgid="7265359366883747413">"Służbowe"</string>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 96030ed..d7f8d61 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Não é possível carregar o conteúdo no momento"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Os apps de trabalho foram pausados"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Ativar apps de trabalho"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Apps do perfil <xliff:g id="PROFILE">%1$s</xliff:g> estão pausados"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Ativar apps do perfil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Não é possível selecionar arquivos de trabalho"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Seu administrador de TI não permite que você acesse arquivos de trabalho em um app pessoal"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Não foi possível selecionar arquivos pessoais"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Seu administrador de TI não permite que você acesse arquivos pessoais em um app de trabalho"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Não é possível selecionar arquivos do perfil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Seu administrador de TI não permite que arquivos do perfil <xliff:g id="PROFILE_0">%1$s</xliff:g> sejam acessados por um app do perfil <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Não é possível salvar no perfil de trabalho"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Seu administrador de TI não permite que você salve arquivos pessoais no perfil de trabalho"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Não é possível salvar no perfil pessoal"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Seu administrador de TI não permite que você salve arquivos de trabalho no perfil pessoal"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Não é possível salvar no perfil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Seu administrador de TI não permite que arquivos do perfil <xliff:g id="PROFILE_0">%1$s</xliff:g> sejam salvos no perfil <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Essa ação não é permitida"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Para saber mais, entre em contato com o administrador de TI"</string>
<string name="root_recent" msgid="1080156975424341623">"Recentes"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Novo nome"</string>
<string name="preview_file" msgid="4056622696305432343">"Visualizar o arquivo <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Visualizar o arquivo de trabalho <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Visualizar o arquivo <xliff:g id="FILENAME">%2$s</xliff:g> do perfil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Procurar arquivos em outros apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anônimo"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Usar esta pasta"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Não é possível usar essa pasta"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Para proteger sua privacidade, escolha outra pasta"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Criar nova pasta"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Pesquisar neste smartphone"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Pesquisar neste dispositivo"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Excluir <xliff:g id="TEXT">%1$s</xliff:g> do histórico de pesquisa"</string>
<string name="personal_tab" msgid="3878576287868528503">"Pessoal"</string>
<string name="work_tab" msgid="7265359366883747413">"Trabalho"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 9eb8f12..e159e6e 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Não é possível carregar o conteúdo neste momento"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"As Apps de trabalho estão suspensas."</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Ativar apps de trabalho"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"As apps de <xliff:g id="PROFILE">%1$s</xliff:g> estão pausadas"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Ativar apps de <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Não é possível selecionar ficheiros de trabalho."</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"O seu administrador de TI não lhe permite aceder a ficheiros de trabalho a partir de uma app pessoal."</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Não é possível selecionar ficheiros pessoais."</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"O seu administrador de TI não lhe permite aceder a ficheiros pessoais a partir de uma app de trabalho."</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Não é possível selecionar ficheiros de <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"O seu administrador de TI não lhe permite aceder a ficheiros de <xliff:g id="PROFILE_0">%1$s</xliff:g> a partir de uma app <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Não é possível guardar no perfil de trabalho."</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"O seu administrador de TI não lhe permite guardar ficheiros pessoais no seu perfil de trabalho."</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Não é possível guardar no perfil pessoal."</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"O seu administrador de TI não lhe permite guardar ficheiros de trabalho no seu perfil pessoal."</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Não é possível guardar no perfil de <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"O seu administrador de TI não lhe permite guardar ficheiros <xliff:g id="PROFILE_0">%1$s</xliff:g> no seu perfil de <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Esta ação não é permitida"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Para saber mais, contacte o administrador de TI."</string>
<string name="root_recent" msgid="1080156975424341623">"Recentes"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Novo nome"</string>
<string name="preview_file" msgid="4056622696305432343">"Pré-visualizar o ficheiro <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Pré-visualize o ficheiro de trabalho <xliff:g id="FILENAME">%1$s</xliff:g>."</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Pré-visualize o ficheiro de <xliff:g id="PROFILE">%1$s</xliff:g> <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Procure ficheiros noutras apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anónimo"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Usar esta pasta"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Não é possível utilizar esta pasta"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Para proteger a sua privacidade, escolha outra pasta."</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Criar nova pasta"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Pesquise neste telemóvel"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Pesquise este dispositivo"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Elimine o histórico de pesquisas <xliff:g id="TEXT">%1$s</xliff:g>."</string>
<string name="personal_tab" msgid="3878576287868528503">"Pessoal"</string>
<string name="work_tab" msgid="7265359366883747413">"Trabalho"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 96030ed..d7f8d61 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Não é possível carregar o conteúdo no momento"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Os apps de trabalho foram pausados"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Ativar apps de trabalho"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Apps do perfil <xliff:g id="PROFILE">%1$s</xliff:g> estão pausados"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Ativar apps do perfil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Não é possível selecionar arquivos de trabalho"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Seu administrador de TI não permite que você acesse arquivos de trabalho em um app pessoal"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Não foi possível selecionar arquivos pessoais"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Seu administrador de TI não permite que você acesse arquivos pessoais em um app de trabalho"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Não é possível selecionar arquivos do perfil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Seu administrador de TI não permite que arquivos do perfil <xliff:g id="PROFILE_0">%1$s</xliff:g> sejam acessados por um app do perfil <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Não é possível salvar no perfil de trabalho"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Seu administrador de TI não permite que você salve arquivos pessoais no perfil de trabalho"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Não é possível salvar no perfil pessoal"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Seu administrador de TI não permite que você salve arquivos de trabalho no perfil pessoal"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Não é possível salvar no perfil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Seu administrador de TI não permite que arquivos do perfil <xliff:g id="PROFILE_0">%1$s</xliff:g> sejam salvos no perfil <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Essa ação não é permitida"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Para saber mais, entre em contato com o administrador de TI"</string>
<string name="root_recent" msgid="1080156975424341623">"Recentes"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Novo nome"</string>
<string name="preview_file" msgid="4056622696305432343">"Visualizar o arquivo <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Visualizar o arquivo de trabalho <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Visualizar o arquivo <xliff:g id="FILENAME">%2$s</xliff:g> do perfil <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Procurar arquivos em outros apps"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anônimo"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Usar esta pasta"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Não é possível usar essa pasta"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Para proteger sua privacidade, escolha outra pasta"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Criar nova pasta"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Pesquisar neste smartphone"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Pesquisar neste dispositivo"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Excluir <xliff:g id="TEXT">%1$s</xliff:g> do histórico de pesquisa"</string>
<string name="personal_tab" msgid="3878576287868528503">"Pessoal"</string>
<string name="work_tab" msgid="7265359366883747413">"Trabalho"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index cc2f20d..1332421 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Momentan, conținutul nu poate fi încărcat"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Aplicațiile pentru lucru sunt întrerupte"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Activează aplicațiile pentru lucru"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Aplicațiile <xliff:g id="PROFILE">%1$s</xliff:g> sunt întrerupte"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Activează aplicațiile <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Nu se pot selecta fișiere de lucru"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Administratorul IT nu îți permite să accesezi fișiere de lucru dintr-o aplicație personală"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Nu se pot selecta fișiere personale"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Administratorul IT nu îți permite să accesezi fișiere personale dintr-o aplicație pentru lucru"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Nu se pot selecta fișiere <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Administratorul IT nu îți permite să accesezi fișiere <xliff:g id="PROFILE_0">%1$s</xliff:g> dintr-o aplicație <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Nu se poate salva în profilul de serviciu"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Administratorul IT nu îți permite să salvezi fișiere personale în profilul de serviciu"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Nu se poate salva în profilul personal"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Administratorul IT nu îți permite să salvezi fișiere de lucru în profilul personal"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Nu se pot salva în profilul <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Administratorul IT nu îți permite să salvezi fișiere <xliff:g id="PROFILE_0">%1$s</xliff:g> în profilul <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Acțiunea nu este permisă"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Pentru a afla mai multe, contactează administratorul IT"</string>
<string name="root_recent" msgid="1080156975424341623">"Recente"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nume nou"</string>
<string name="preview_file" msgid="4056622696305432343">"Previzualizează fișierul <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Previzualizează fișierul de lucru <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Previzualizează fișierul <xliff:g id="PROFILE">%1$s</xliff:g> <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Caută fișiere în alte aplicații"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonim"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Folosește acest dosar"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Nu poți folosi acest dosar"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Alege alt dosar, ca să-ți protejezi confidențialitatea"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Creează un dosar nou"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Caută în acest telefon"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Caută acest dispozitiv"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Șterge istoricul căutărilor <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personale"</string>
<string name="work_tab" msgid="7265359366883747413">"Serviciu"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 5329c0a..b1d368d 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Не удалось загрузить контент"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Рабочие приложения приостановлены"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Включить рабочие приложения"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Работа приложений из профиля \"<xliff:g id="PROFILE">%1$s</xliff:g>\" приостановлена"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Включить приложения из профиля \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Невозможно выбрать рабочие файлы"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Системный администратор запретил доступ к рабочим файлам из личных приложений."</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Невозможно выбрать личные файлы"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Системный администратор запретил доступ к личным файлам из рабочего приложения."</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Невозможно выбрать файлы из профиля \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Системный администратор запретил доступ к файлам из профиля \"<xliff:g id="PROFILE_0">%1$s</xliff:g>\" в приложении из профиля \"<xliff:g id="PROFILE_1">%2$s</xliff:g>\"."</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Невозможно сохранить файлы"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Системный администратор запретил сохранять личные файлы в рабочем профиле."</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Невозможно сохранить файлы"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Системный администратор запретил сохранять рабочие файлы в личном профиле."</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Невозможно сохранить файлы в профиле \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Системный администратор запретил сохранять файлы из профиля \"<xliff:g id="PROFILE_0">%1$s</xliff:g>\" в профиле \"<xliff:g id="PROFILE_1">%2$s</xliff:g>\"."</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Это действие запрещено"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Чтобы узнать больше, обратитесь к администратору."</string>
<string name="root_recent" msgid="1080156975424341623">"Недавние"</string>
@@ -310,6 +316,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Новое название"</string>
<string name="preview_file" msgid="4056622696305432343">"Открыть файл \"<xliff:g id="FILENAME">%1$s</xliff:g>\" в режиме предпросмотра."</string>
<string name="preview_work_file" msgid="4495643735563487273">"Предпросмотр рабочего файла \"<xliff:g id="FILENAME">%1$s</xliff:g>\""</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Предпросмотр файла \"<xliff:g id="FILENAME">%2$s</xliff:g>\" из профиля \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
<string name="apps_row_title" msgid="3340490016663092925">"Поиск файлов в других приложениях"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Анонимное приложение"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Использовать эту папку"</string>
@@ -318,7 +325,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Выберите другую папку"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"В целях защиты вашей конфиденциальности мы заблокировали доступ к этой папке."</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Новая папка"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Поиск на этом телефоне"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Поиск на устройстве"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Очистить историю поиска: <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Личное"</string>
<string name="work_tab" msgid="7265359366883747413">"Рабочее"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 5652758..b7297d3 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"මේ මොහොතේ අන්තර්ගතය පූරණය කිරීමට නොහැකිය"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"කාර්යාල යෙදුම් විරාම කර ඇත"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"කාර්යාල යෙදුම් ක්රියාත්මක කරන්න"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> යෙදුම් විරාම කළා"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> යෙදුම් සක්රීය කරන්න"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"කාර්යාල ගොනු තේරීමට හැකිය"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"ඔබේ IT පරිපාලක ඔබට පෞද්ගලික යෙදුමකින් කාර්යාල ගොනු වෙත ප්රවේශ වීමට ඉඩ නොදේ"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"පෞද්ගලික ගොනු තේරීමට නොහැකිය"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"ඔබේ IT පරිපාලක ඔබට කාර්යාල යෙදුමකින් පෞද්ගලික ගොනු වෙත ප්රවේශ වීමට ඉඩ නොදේ"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> ගොනු තේරිය නොහැක"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"ඔබේ තොරතුරු තාක්ෂණ පරිපාලක <xliff:g id="PROFILE_0">%1$s</xliff:g> ගොනු වෙත <xliff:g id="PROFILE_1">%2$s</xliff:g> යෙදුමකින් ප්රවේශ වීමට ඉඩ නොදෙයි"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"කාර්යාල පැතිකඩ වෙත සුරැකිය නොහැකිය"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"ඔබේ IT පරිපාලක පෞද්ගලික ගොනු ඔබේ කාර්යාල පැතිකඩ වෙත සුරැකීමට ඉඩ නොදේ"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"පෞද්ගලික පැතිකඩ වෙත සුරැකීමට හැකිය"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"ඔබේ IT පරිපාලක කාර්යාල ගොනු ඔබේ පෞද්ගලික පැතිකඩ වෙත සුරැකීමට ඉඩ නොදේ"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> පැතිකඩට සුරැකිය නො හැකි ය"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"ඔබේ තොරතුරු තාලක්ෂණ පරිපාලක ඔබට <xliff:g id="PROFILE_0">%1$s</xliff:g> ගොනු ඔබේ <xliff:g id="PROFILE_1">%2$s</xliff:g> පැතිකඩෙහි සුරැකීමට ඉඩ නොදෙයි"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"මෙම ක්රියාව ඉඩ දී නැත"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"තවත් දැන ගැනීමට, ඔබේ IT සම්බන්ධ කර ගන්න"</string>
<string name="root_recent" msgid="1080156975424341623">"මෑත"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"අලුත් නම"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> ගොනුව පෙර දකින්න"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> කාර්යාල ගොනුව පෙරදසුන් කරන්න"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> <xliff:g id="FILENAME">%2$s</xliff:g> ගොනුව පෙරදකින්න"</string>
<string name="apps_row_title" msgid="3340490016663092925">"වෙනත් යෙදුම්වල ගොනු බ්රවුස් කරන්න"</string>
<string name="anonymous_application" msgid="7633027057951625862">"නිර්නාමික"</string>
<string name="open_tree_button" msgid="6402871398424497776">"මෙම ෆෝල්ඩරය භාවිත කරන්න"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"මෙම ෆෝල්ඩරය භාවිත කළ නොහැකිය"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"ඔබේ රහස්යතාව ආරක්ෂා කිරීමට, තවත් ෆෝල්ඩරයක් තෝරා ගන්න"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"නව ෆෝල්ඩරය තනන්න"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"මෙම දුරකථනයේ සොයන්න"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"මෙම උපාංගය සොයන්න"</string>
<string name="delete_search_history" msgid="2202015025607694515">"සෙවීම් ඉතිහාසය මකන්න <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"පෞද්ගලික"</string>
<string name="work_tab" msgid="7265359366883747413">"කාර්යාල"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 01dfe58..36e4f01 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Obsah momentálne nie je možné načítať"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Pracovné aplikácie sú pozastavené"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Zapnúť pracovné aplikácie"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Aplikácie profilu <xliff:g id="PROFILE">%1$s</xliff:g> sú pozastavené"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Zapnúť aplikácie profilu <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Pracovné súbory sa nedajú vybrať"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Váš správca IT vám zakázal prístup k pracovným súborom z osobnej aplikácie"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Osobné súbory sa nedajú vybrať"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Váš správca IT vám zakázal prístup k osobným súborom z pracovnej aplikácie"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Súbory profilu <xliff:g id="PROFILE">%1$s</xliff:g> sa nedajú vybrať"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Váš správca IT vám nepovolil prístup k súborom profilu <xliff:g id="PROFILE_0">%1$s</xliff:g> z aplikácie profilu <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Nie je možné ukladať do pracovného profilu"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Váš správca IT vám zakázal ukladať osobné súbory do pracovného profilu"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Nedajú sa uložiť do osobného profilu"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Váš správca IT vám zakázal ukladať pracovné súbory do osobného profilu"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Nie je možné uložiť do profilu <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Váš správca IT vám nepovolil ukladanie súborov profilu <xliff:g id="PROFILE_0">%1$s</xliff:g> do profilu <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Táto akcia nie je povolená"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Viac sa dozviete od svojho správcu IT"</string>
<string name="root_recent" msgid="1080156975424341623">"Nedávne"</string>
@@ -310,6 +316,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nové názov"</string>
<string name="preview_file" msgid="4056622696305432343">"Zobraziť ukážku súboru <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Zobraziť ukážku pracovného súboru <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Zobrazte si ukážku súboru profilu <xliff:g id="PROFILE">%1$s</xliff:g> s názvom <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Prehliadanie súborov v iných aplikáciách"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonymná"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Použiť tento priečinok"</string>
@@ -318,7 +325,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Tento priečinok sa nedá použiť"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Ak chcete ochrániť svoje súkromie, vyberte iný priečinok"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Vytvoriť nový priečinok"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Hľadať v telefóne"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Vyhľadajte v tomto zariadení"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Odstrániť históriu vyhľadávania <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Osobné"</string>
<string name="work_tab" msgid="7265359366883747413">"Práca"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 3a1e0b4..e2faad0 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Vsebine trenutno ni mogoče naložiti"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Delovne aplikacije so začasno zaustavljene"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Vklopi delovne aplikacije"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Aplikacije profila »<xliff:g id="PROFILE">%1$s</xliff:g>« so začasno zaustavljene"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Vklopi aplikacije profila »<xliff:g id="PROFILE">%1$s</xliff:g>«"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Ni mogoče izbrati službenih datotek"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Skrbnik za IT ne dovoli dostopa do službenih datotek iz osebne aplikacije"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Ni mogoče izbrati osebnih datotek"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Skrbnik za IT ne dovoli dostopa do osebnih datotek iz delovne aplikacije"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Ni mogoče izbrati datotek profila »<xliff:g id="PROFILE">%1$s</xliff:g>«"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Skrbnik za IT ne dovoli dostopanja do datotek profila »<xliff:g id="PROFILE_0">%1$s</xliff:g>« iz aplikacije profila »<xliff:g id="PROFILE_1">%2$s</xliff:g>«"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Ni mogoče shraniti v delovni profil"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Skrbnik za IT ne dovoli shranjevanja osebnih datotek v delovni profil"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Ni mogoče shraniti v osebni profil"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Skrbnik za IT ne dovoli shranjevanja službenih datotek v osebni profil"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Ni mogoče shraniti v profil »<xliff:g id="PROFILE">%1$s</xliff:g>«"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Skrbnik za IT ne dovoli shranjevanja datotek profila »<xliff:g id="PROFILE_0">%1$s</xliff:g>« v profil »<xliff:g id="PROFILE_1">%2$s</xliff:g>«"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"To dejanje ni dovoljeno"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Za več informacij se obrnite na skrbnika za IT"</string>
<string name="root_recent" msgid="1080156975424341623">"Nedavno"</string>
@@ -310,6 +316,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Novo ime"</string>
<string name="preview_file" msgid="4056622696305432343">"Predogled datoteke <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Predogled delovne datoteke <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Predogled datoteke »<xliff:g id="FILENAME">%2$s</xliff:g>« iz profila »<xliff:g id="PROFILE">%1$s</xliff:g>«"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Brskanje po datotekah v drugih aplikacijah"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonimno"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Uporabi to mapo"</string>
@@ -318,7 +325,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Te mape ni mogoče uporabiti"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Izberite drugo mapo, da zaščitite svojo zasebnost"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Ustvari novo mapo"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Iščite v tem telefonu"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Iskanje v tej napravi"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Brisanje zgodovine iskanja <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Osebno"</string>
<string name="work_tab" msgid="7265359366883747413">"Služba"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 30d115d..5de2e9d 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Përmbajtja nuk mund të ngarkohet për momentin"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Aplikacionet e punës janë vendosur në pauzë"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Aktivizo aplikacionet e punës"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Aplikacionet e profilit \"<xliff:g id="PROFILE">%1$s</xliff:g>\" janë vendosur në pauzë"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Aktivizo aplikacionet e profilit \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Nuk mund të zgjedhësh skedarë pune"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Administratori i teknologjisë së informacionit nuk të lejon të kesh qasje te skedarët e punës nga një aplikacion personal"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Nuk mund të zgjedhësh skedarë personalë"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Administratori yt i teknologjisë së informacionit nuk të lejon të kesh qasje te skedarët personalë nga një aplikacion i punës"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Skedarët e profilit \"<xliff:g id="PROFILE">%1$s</xliff:g>\" nuk mund të zgjidhen"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Administratori yt i teknologjisë së informacionit nuk të lejon të kesh qasje te skedarët e profilit \"<xliff:g id="PROFILE_0">%1$s</xliff:g>\" nga një aplikacion i profilit \"<xliff:g id="PROFILE_1">%2$s</xliff:g>\""</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Nuk mund të ruhen në profilin tënd të punës"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Administratori yt i teknologjisë së informacionit nuk të lejon të ruash skedarët personalë në profilin tënd të punës"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Nuk mund të ruhen në profilin tënd personal"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Administratori yt i teknologjisë së informacionit nuk të lejon të ruash skedarët e punës në profilin tënd personal"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Nuk mund të ruash te profili \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Administratori yt i teknologjisë së informacionit nuk të lejon të ruash skedarët e profilit \"<xliff:g id="PROFILE_0">%1$s</xliff:g>\" te profili \"<xliff:g id="PROFILE_1">%2$s</xliff:g>\""</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Ky veprim nuk lejohet"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Për të mësuar më shumë, kontakto me administratorin tënd të teknologjisë së informacionit"</string>
<string name="root_recent" msgid="1080156975424341623">"Të fundit"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Emri i ri"</string>
<string name="preview_file" msgid="4056622696305432343">"Shiko paraprakisht skedarin <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Shiko paraprakisht skedarin e punës <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Shiko paraprakisht skedarin e profilit \"<xliff:g id="PROFILE">%1$s</xliff:g>\": <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Shfleto skedarët në aplikacionet e tjera"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonim"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Përdor këtë dosje"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Kjo dosje nuk mund të përdoret"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Për të mbrojtur privatësinë tënde, zgjidh një dosje tjetër"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Krijo dosje të re"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Kërko në këtë telefon"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Kërko në këtë pajisje"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Fshi historikun e kërkimeve për <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personale"</string>
<string name="work_tab" msgid="7265359366883747413">"Puna"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 8fe2718..0c40de0 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Учитавање садржаја тренутно није могуће"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Пословне апликације су паузиране"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Укључи пословне апликације"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Паузиране су апликације профила: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Укључи апликације профила: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Не можете да изаберете пословне фајлове"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"ИТ администратор вам не дозвољава да приступате датотекама за посао из личне апликације"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Избор личних датотека није успео"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"ИТ администратор вам не дозвољава да приступате личним датотекама из пословне апликације"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Не можете да изаберете фајлове са профила: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"ИТ администратор не дозвољава да фајловима на профилу: <xliff:g id="PROFILE_0">%1$s</xliff:g> приступате из апликације профила: <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Не можете да сачувате на пословном профилу"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"ИТ администратор вам не дозвољава да чувате личне датотеке на пословном профилу"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Не можете да сачувате на личном профилу"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"ИТ администратор вам не дозвољава да чувате датотеке за посао на личном профилу"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Не можете да чувате на профилу: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"ИТ администратор не дозвољава да фајлове са профила: <xliff:g id="PROFILE_0">%1$s</xliff:g> чувате на профилу: <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Ова радња није дозвољена"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Обратите се ИТ администратору да бисте сазнали више"</string>
<string name="root_recent" msgid="1080156975424341623">"Недавно"</string>
@@ -288,6 +294,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Нови назив"</string>
<string name="preview_file" msgid="4056622696305432343">"Прегледајте датотеку <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Прегледајте датотеку за посао <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Прегледајте фајл <xliff:g id="FILENAME">%2$s</xliff:g> са профила: <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Прегледајте датотеке у другим апликацијама"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Анонимна"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Користи овај фолдер"</string>
@@ -296,7 +303,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Не можете да користите овај фолдер"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Да бисте заштитили приватност, одаберите неки други фолдер"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Направи нови фолдер"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Претражите овај телефон"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Претражи овај уређај"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Избришите историју претраге <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Лично"</string>
<string name="work_tab" msgid="7265359366883747413">"Посао"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 385808c..9a72708 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Det går inte att läsa in innehållet just nu"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Jobbappar har pausats"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Aktivera jobbappar"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g>appar har pausats"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Slå på <xliff:g id="PROFILE">%1$s</xliff:g>appar"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Det går inte att välja jobbfiler"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT-administratören tillåter inte att du öppnar jobbfiler i en privat app"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Det går inte att välja privata filer"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT-administratören tillåter inte att du öppnar privata filer i en jobbapp"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Det gick inte att välja <xliff:g id="PROFILE">%1$s</xliff:g>filer"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT-administratören tillåter inte att du sparar <xliff:g id="PROFILE_0">%1$s</xliff:g>filer från en <xliff:g id="PROFILE_1">%2$s</xliff:g> app"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Det går inte att spara i jobbprofilen"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT-administratören tillåter inte att du sparar privata filer i jobbprofilen"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Det går inte att spara i den privata profilen"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT-administratören tillåter inte att du sparar jobbfiler i den privata profilen"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Det gick inte att spara i <xliff:g id="PROFILE">%1$s</xliff:g>profilen"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT-administratören tillåter inte att du sparar <xliff:g id="PROFILE_0">%1$s</xliff:g>filer i den <xliff:g id="PROFILE_1">%2$s</xliff:g> profilen"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Förbjuden åtgärd"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Kontakta IT-administratören om du vill veta mer"</string>
<string name="root_recent" msgid="1080156975424341623">"Senaste"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Nytt namn"</string>
<string name="preview_file" msgid="4056622696305432343">"Förhandsgranska filen <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Förhandsgranska jobbfilen <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Förhandsgranska <xliff:g id="PROFILE">%1$s</xliff:g>filen <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Bläddra efter filer i andra appar"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonym"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Använd den här mappen"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Det går inte att använda den här mappen"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Välj en annan mapp för att skydda din integritet"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Skapa ny mapp"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Sök på telefonen"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Sök på den här enheten"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Radera sökhistorik – <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Privat"</string>
<string name="work_tab" msgid="7265359366883747413">"Jobb"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 4730783..c09e09f 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Imeshindwa kupakia maudhui kwa sasa"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Programu za kazini zimesimamishwa"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Washa programu za kazini"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Programu za <xliff:g id="PROFILE">%1$s</xliff:g> zimesitishwa"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Washa programu za <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Imeshindwa kuchagua faili za kazini"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Msimamizi wako wa TEHAMA hakuruhusu ufikie faili za kazini kwenye programu ya binafsi"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Imeshindwa kuchagua faili za binafsi"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Msimamizi wako wa TEHAMA hakuruhusu ufikie faili za binafsi ukitumia programu ya kazini"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Huwezi kuchagua faili za <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Msimamizi wako wa TEHAMA hakuruhusu ufikie faili za <xliff:g id="PROFILE_0">%1$s</xliff:g> kwenye programu yako <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Imeshindwa kuhifadhi kwenye wasifu wa kazini"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Msimamizi wako wa TEHAMA hakuruhusu uhifadhi faili za binafsi kwenye wasifu wa kazini"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Imeshindwa kuhifadhi kwenye wasifu wa binafsi"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Msimamizi wako wa TEHAMA hakuruhusu uhifadhi faili za kazini kwenye wasifu wako wa binafsi"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Imeshindwa kuhifadhi kwenye wasifu wa <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Msimamizi wako wa TEHAMA hakuruhusu uhifadhi faili <xliff:g id="PROFILE_0">%1$s</xliff:g> kwenye wasifu wako wa <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Kitendo hiki hakiruhusiwi"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Ili upate maelezo zaidi, wasiliana na msimamizi wako wa TEHAMA"</string>
<string name="root_recent" msgid="1080156975424341623">"Za hivi majuzi"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Jina jipya"</string>
<string name="preview_file" msgid="4056622696305432343">"Kagua faili ya <xliff:g id="FILENAME">%1$s</xliff:g> kwanza"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Kagua kwanza fali ya kazini ya <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Kagua kwanza faili ya <xliff:g id="PROFILE">%1$s</xliff:g> ya <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Vinjari faili katika programu nyingine"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Haijulikani"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Tumia folda hii"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Huwezi kutumia folda hii"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Ili ulinde faragha yako, chagua folda nyingine"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Fungua folda mpya"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Tafuta kwenye simu hii"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Tafuta kwenye kifaa hiki"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Futa <xliff:g id="TEXT">%1$s</xliff:g> ya historia ya mambo uliyotafuta"</string>
<string name="personal_tab" msgid="3878576287868528503">"Binafsi"</string>
<string name="work_tab" msgid="7265359366883747413">"Kazini"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 5ec185c..1e8b754 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"தற்போது உள்ளடக்கத்தை ஏற்ற முடியவில்லை"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"பணி ஆப்ஸ் இடைநிறுத்தப்பட்டுள்ளன"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"பணி ஆப்ஸை இயக்கு"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> ஆப்ஸ் இடைநிறுத்தப்பட்டுள்ளன"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> ஆப்ஸை இயக்கு"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"பணி ஃபைல்களைத் தேர்ந்தெடுக்க முடியாது"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"பணி ஃபைல்களைத் தனிப்பட்ட பணி ஆப்ஸில் இருந்து அணுகுவதை உங்கள் IT நிர்வாகி அனுமதிக்கவில்லை"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"தனிப்பட்ட ஃபைல்களைத் தேர்ந்தெடுக்க முடியாது"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"தனிப்பட்ட ஃபைல்களைப் பணி ஆப்ஸில் இருந்து அணுகுவதை உங்கள் IT நிர்வாகி அனுமதிக்கவில்லை"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> ஃபைல்களைத் தேர்ந்தெடுக்க முடியவில்லை"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"<xliff:g id="PROFILE_0">%1$s</xliff:g> ஃபைல்களை <xliff:g id="PROFILE_1">%2$s</xliff:g> ஆப்ஸில் இருந்து அணுக உங்கள் IT நிர்வாகி அனுமதிக்கவில்லை"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"பணிக் கணக்கில் சேமிக்க முடியாது"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"தனிப்பட்ட ஃபைல்களைப் பணிக் கணக்கில் சேமிக்க உங்கள் IT நிர்வாகி அனுமதிக்கவில்லை"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"தனிப்பட்ட கணக்கில் சேமிக்க முடியாது"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"பணி ஃபைல்களைத் தனிப்பட்ட கணக்கில் சேமிக்க உங்கள் IT நிர்வாகி அனுமதிக்கவில்லை"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> சுயவிவரத்தில் சேமிக்க முடியவில்லை"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"<xliff:g id="PROFILE_0">%1$s</xliff:g> ஃபைல்களை உங்கள் <xliff:g id="PROFILE_1">%2$s</xliff:g> சுயவிவரத்தில் சேமிக்க உங்கள் IT நிர்வாகி அனுமதிக்கவில்லை"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"இந்தச் செயலுக்கு அனுமதியில்லை"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"மேலும் அறிய IT நிர்வாகியைத் தொடர்புகொள்ளவும்"</string>
<string name="root_recent" msgid="1080156975424341623">"சமீபத்தியவை"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"புதிய பெயர்"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> என்ற ஃபைல் மாதிரிக்காட்சியாகத் தெரியும்"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> என்ற பணி ஃபைலின் மாதிரிக்காட்சியைப் பார்க்கவும்"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> ஃபைலின் (<xliff:g id="FILENAME">%2$s</xliff:g>) மாதிரிக்காட்சியைக் காட்டும்"</string>
<string name="apps_row_title" msgid="3340490016663092925">"ஃபைல்களை வேறு ஆப்ஸில் தேடவும்"</string>
<string name="anonymous_application" msgid="7633027057951625862">"பெயர் குறிப்பிடாதது"</string>
<string name="open_tree_button" msgid="6402871398424497776">"இந்த ஃபோல்டரைப் பயன்படுத்து"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ஃபோல்டரைப் பயன்படுத்த இயலாது"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"உங்கள் தனியுரிமையைப் பாதுகாக்க மற்றொரு ஃபோல்டரைத் தேர்வுசெய்யவும்"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"புதிய ஃபோல்டரை உருவாக்கு"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"இந்த மொபைலில் தேடவும்"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"இந்தச் சாதனத்தில் தேடுக"</string>
<string name="delete_search_history" msgid="2202015025607694515">"தேடல் வரலாற்றை நீக்கும் பட்டன் <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"தனிப்பட்டவை"</string>
<string name="work_tab" msgid="7265359366883747413">"பணி"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index b8879c8..55b72fe 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"ఈ సమయంలో కంటెంట్ను లోడ్ చేయడం సాధ్యపడదు"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"వర్క్ యాప్లు పాజ్ చేయబడ్డాయి"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"వర్క్ యాప్లను ఆన్ చేయండి"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> యాప్లు పాజ్ చేయబడ్డాయి"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> యాప్లను ఆన్ చేయండి"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"కార్యాలయ ఫైళ్లను ఎంపిక చేయడం సాధ్యం కాదు"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"వ్యక్తిగత యాప్ నుండి ఆఫీస్ ఫైళ్లను యాక్సెస్ చేయడానికి మీ IT అడ్మిన్ అనుమతించరు"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"వ్యక్తిగత ఫైళ్లను ఎంపిక చేయడం సాధ్యం కాదు"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"ఆఫీస్ యాప్ నుండి వ్యక్తిగత ఫైళ్లను యాక్సెస్ చేయడానికి మీ IT అడ్మిన్ అనుమతించరు"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> ఫైల్స్ను ఎంచుకోలేరు"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"<xliff:g id="PROFILE_1">%2$s</xliff:g> యాప్ నుండి <xliff:g id="PROFILE_0">%1$s</xliff:g> ఫైల్స్ను యాక్సెస్ చేయడానికి మీ IT అడ్మిన్ మిమ్మల్ని అనుమతించరు"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"కార్యాలయ ప్రొఫైల్కి సేవ్ చేయడం సాధ్యం కాదు"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"మీ కార్యాలయ ప్రొఫైల్లో వ్యక్తిగత ఫైళ్లను సేవ్ చేయడానికి మీ IT అడ్మిన్ అనుమతించరు"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"వ్యక్తిగత ప్రొఫైల్లో సేవ్ చేయడం సాధ్యం కాదు"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"మీ వ్యక్తిగత ప్రొఫైల్లో కార్యాలయ ఫైళ్లను సేవ్ చేయడానికి మీ IT అడ్మిన్ అనుమతించరు"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> ప్రొఫైల్లో సేవ్ చేయడం సాధ్యం కాదు"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"మీ IT అడ్మిన్ మీ <xliff:g id="PROFILE_1">%2$s</xliff:g> ప్రొఫైల్లో <xliff:g id="PROFILE_0">%1$s</xliff:g> ఫైల్స్ను సేవ్ చేయడానికి మిమ్మల్ని అనుమతించరు"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"ఈ చర్య అనుమతించబడదు"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"మరింత తెలుసుకోవడానికి, మీ IT అడ్మిన్ను కాంటాక్ట్ చేయండి"</string>
<string name="root_recent" msgid="1080156975424341623">"ఇటీవలివి"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"కొత్త పేరు"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g>ని ప్రివ్యూ చేయండి"</string>
<string name="preview_work_file" msgid="4495643735563487273">"కార్యాలయ ఫైల్ <xliff:g id="FILENAME">%1$s</xliff:g>ని ప్రివ్యూ చేయండి"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> ఫైల్ <xliff:g id="FILENAME">%2$s</xliff:g>ను ప్రివ్యూ చేయండి"</string>
<string name="apps_row_title" msgid="3340490016663092925">"ఇతర యాప్లలోని ఫైళ్లను బ్రౌజ్ చేయండి"</string>
<string name="anonymous_application" msgid="7633027057951625862">"తెలియనిది"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ఈ ఫోల్డర్ను ఉపయోగించండి"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ఈ ఫోల్డర్ను ఉపయోగించడం సాధ్యం కాదు"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"మీ గోప్యతను కాపాడుకోవటానికి, మరొక ఫోల్డర్ను ఎంచుకోండి"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"కొత్త ఫోల్డర్ని క్రియేట్ చేయండి"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ఈ ఫోన్లో వెతకండి"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ఈ పరికరాన్ని సెర్చ్ చేయండి"</string>
<string name="delete_search_history" msgid="2202015025607694515">"సెర్చ్ హిస్టరీ <xliff:g id="TEXT">%1$s</xliff:g>ను తొలగించండి"</string>
<string name="personal_tab" msgid="3878576287868528503">"వ్యక్తిగత డైరెక్టరీ"</string>
<string name="work_tab" msgid="7265359366883747413">"కార్యాలయ డైరెక్టరీ"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index a01e970..dc01833 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"โหลดเนื้อหาไม่ได้ในขณะนี้"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"แอปงานหยุดชั่วคราว"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"เปิดแอปงาน"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"แอป<xliff:g id="PROFILE">%1$s</xliff:g>หยุดชั่วคราวแล้ว"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"เปิดใช้แอป<xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"เลือกไฟล์งานไม่ได้"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"ผู้ดูแลระบบไอทีไม่อนุญาตให้เข้าถึงไฟล์งานจากแอปส่วนตัว"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"เลือกไฟล์ส่วนตัวไม่ได้"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"ผู้ดูแลระบบไอทีไม่อนุญาตให้เข้าถึงไฟล์ส่วนตัวจากแอปงาน"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"เลือกไฟล์<xliff:g id="PROFILE">%1$s</xliff:g>ไม่ได้"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"ผู้ดูแลระบบไอทีไม่อนุญาตให้คุณเข้าถึงไฟล์<xliff:g id="PROFILE_0">%1$s</xliff:g>จากแอป<xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"บันทึกในโปรไฟล์งานไม่ได้"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"ผู้ดูแลระบบไอทีไม่อนุญาตให้บันทึกไฟล์ส่วนตัวไว้ในโปรไฟล์งาน"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"บันทึกในโปรไฟล์ส่วนตัวไม่ได้"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"ผู้ดูแลระบบไอทีไม่อนุญาตให้บันทึกไฟล์งานไว้ในโปรไฟล์ส่วนตัว"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"บันทึกลงในโปรไฟล์<xliff:g id="PROFILE">%1$s</xliff:g>ไม่ได้"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"ผู้ดูแลระบบไอทีไม่อนุญาตให้คุณบันทึกไฟล์<xliff:g id="PROFILE_0">%1$s</xliff:g>ลงในโปรไฟล์<xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"ไม่อนุญาตการทำงานนี้"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"โปรดติดต่อผู้ดูแลระบบไอทีเพื่อสอบถามข้อมูลเพิ่มเติม"</string>
<string name="root_recent" msgid="1080156975424341623">"ล่าสุด"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"ชื่อใหม่"</string>
<string name="preview_file" msgid="4056622696305432343">"แสดงพรีวิวไฟล์ <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"แสดงตัวอย่างไฟล์งาน <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"แสดงตัวอย่างไฟล์<xliff:g id="PROFILE">%1$s</xliff:g>ชื่อ <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"เรียกดูไฟล์ในแอปอื่นๆ"</string>
<string name="anonymous_application" msgid="7633027057951625862">"ไม่ระบุชื่อ"</string>
<string name="open_tree_button" msgid="6402871398424497776">"ใช้โฟลเดอร์นี้"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"ใช้โฟลเดอร์นี้ไม่ได้"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"เลือกโฟลเดอร์อื่นเพื่อปกป้องความเป็นส่วนตัว"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"สร้างโฟลเดอร์ใหม่"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"ค้นหาในโทรศัพท์เครื่องนี้"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"ค้นหาอุปกรณ์นี้"</string>
<string name="delete_search_history" msgid="2202015025607694515">"ลบประวัติการค้นหา <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"ส่วนตัว"</string>
<string name="work_tab" msgid="7265359366883747413">"งาน"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 3778d10..dc77194 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Hindi ma-load ang content sa ngayon"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Naka-pause ang mga app para sa trabaho"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"I-on ang mga app para sa trabaho"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Naka-pause ang mga <xliff:g id="PROFILE">%1$s</xliff:g> app"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"I-on ang mga <xliff:g id="PROFILE">%1$s</xliff:g> app"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Hindi makapili ng mga file sa trabaho"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Hindi ka pinapayagan ng iyong IT admin na mag-access ng mga file sa trabaho mula sa personal na app"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Hindi makapili ng mga personal na file"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Hindi ka pinapayagan ng iyong IT admin na mag-access ng mga personal na file mula sa app para sa trabaho"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Hindi mapili ang mga file ng <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Hindi ka pinapayagan ng iyong IT admin na i-access ang mga file ng <xliff:g id="PROFILE_0">%1$s</xliff:g> mula sa isang <xliff:g id="PROFILE_1">%2$s</xliff:g> app"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Hindi ma-save sa profile sa trabaho"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Hindi ka pinapayagan ng iyong IT admin na mag-save ng mga personal na file sa profile mo sa trabaho"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Hindi ma-save sa personal na profile"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Hindi ka pinapayagan ng iyong IT admin na mag-save ng mga file sa trabaho sa personal na profile mo"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Hindi ma-save sa profile sa <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Hindi ka pinapayagan ng IT admin mo na i-save ang mga file ng <xliff:g id="PROFILE_0">%1$s</xliff:g> sa iyong profile sa <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Hindi pinapayagan ang pagkilos na ito"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Para matuto pa, makipag-ugnayan sa iyong IT admin"</string>
<string name="root_recent" msgid="1080156975424341623">"Kamakailan"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Bagong pangalan"</string>
<string name="preview_file" msgid="4056622696305432343">"I-preview ang file na <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"I-preview ang file sa trabaho na <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"I-preview ang file ng <xliff:g id="PROFILE">%1$s</xliff:g> na <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"I-browse ang mga file sa iba pang app"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonymous"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Gamitin ang folder na ito"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Hindi magagamit ang folder na ito"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Para maprotektahan ang iyong privacy, pumili ng ibang folder"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Gumawa ng bagong folder"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Maghanap sa teleponong ito"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Maghanap sa device na ito"</string>
<string name="delete_search_history" msgid="2202015025607694515">"I-delete ang history ng paghahanap <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Personal"</string>
<string name="work_tab" msgid="7265359366883747413">"Work"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index a1462f5..f8bbc89 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"İçerik şu anda yüklenemiyor"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"İş uygulamaları duraklatıldı"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"İş uygulamalarını aç"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> uygulamaları duraklatıldı"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> uygulamalarını aç"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"İş dosyaları seçilemiyor"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"BT yöneticiniz kişisel bir uygulamadan iş dosyalarına erişmenize izin vermiyor"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Kişisel dosyalar seçilemiyor"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"BT yöneticiniz bir iş uygulamasından kişisel dosyalara erişmenize izin vermiyor"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> dosyalarınız seçilemiyor"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"BT yöneticiniz, <xliff:g id="PROFILE_1">%2$s</xliff:g> uygulamanızdan <xliff:g id="PROFILE_0">%1$s</xliff:g> dosyalarına erişmenize izin vermiyor"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"İş profiline kaydedilemiyor"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"BT yöneticiniz kişisel dosyaları iş profilinize kaydetmenize izin vermiyor"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Kişisel profile kaydedilemiyor"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"BT yöneticiniz iş dosyalarını kişisel profilinize kaydetmenize izin vermiyor"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> profilinize kaydedilemiyor"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"BT yöneticiniz, <xliff:g id="PROFILE_0">%1$s</xliff:g> dosyalarınızı <xliff:g id="PROFILE_1">%2$s</xliff:g> profilinize kaydetmenize izin vermiyor"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Bu işleme izin verilmiyor"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"BT yöneticinizden daha fazla bilgi alabilirsiniz."</string>
<string name="root_recent" msgid="1080156975424341623">"Son"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Yeni ad"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> dosyasını önizleyin"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> adlı iş dosyasını önizleyin"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> dosyasını (<xliff:g id="FILENAME">%2$s</xliff:g>) önizleyin"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Diğer uygulamalardaki dosyalara göz atın"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Adsız"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Bu klasörü kullan"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Bu klasör kullanılamıyor"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Gizliliğinizi korumak için başka bir klasör seçin"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Yeni klasör oluştur"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Bu telefonu arayın"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Bu cihazda arama yapın"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Arama geçmişini sil <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Kişisel"</string>
<string name="work_tab" msgid="7265359366883747413">"İş"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 30d8d79..170e4fc 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Зараз не вдається завантажити вміст"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Робочі додатки призупинено"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Увімкнути робочі додатки"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Додатки профілю \"<xliff:g id="PROFILE">%1$s</xliff:g>\" призупинено"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Увімкнути додатки в профілі \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Не вдається вибрати робочі файли"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Ваш ІТ-адміністратор не дозволяє отримувати доступ до робочих файлів з особистого додатка"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Не вдається вибрати особисті файли"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Ваш ІТ-адміністратор не дозволяє отримувати доступ до особистих файлів із робочого додатка"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Не вдається вибрати файли в профілі \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Ваш адміністратор не дозволяє отримувати доступ до файлів профілю \"<xliff:g id="PROFILE_0">%1$s</xliff:g>\" із цього додатка (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Не вдається зберегти в робочому профілі"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Ваш ІТ-адміністратор не дозволяє зберігати особисті файли в робочому профілі"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Не вдається зберегти в особистому профілі"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Ваш ІТ-адміністратор не дозволяє зберігати робочі файли в особистому профілі"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Не вдається зберегти файли в профілі \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Ваш адміністратор не дозволяє зберігати файли з одного профілю (<xliff:g id="PROFILE_0">%1$s</xliff:g>) в іншому (<xliff:g id="PROFILE_1">%2$s</xliff:g>)"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Ця дія заборонена"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Щоб дізнатися більше, зверніться до ІТ-адміністратора"</string>
<string name="root_recent" msgid="1080156975424341623">"Останні"</string>
@@ -310,6 +316,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Нова назва"</string>
<string name="preview_file" msgid="4056622696305432343">"Переглянути файл \"<xliff:g id="FILENAME">%1$s</xliff:g>\""</string>
<string name="preview_work_file" msgid="4495643735563487273">"Попередній перегляд робочого файлу \"<xliff:g id="FILENAME">%1$s</xliff:g>\""</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Перегляньте файл <xliff:g id="FILENAME">%2$s</xliff:g> профілю \"<xliff:g id="PROFILE">%1$s</xliff:g>\""</string>
<string name="apps_row_title" msgid="3340490016663092925">"Пошук файлів в інших додатках"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Анонімно"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Використовувати цю папку"</string>
@@ -318,7 +325,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Не вдається вибрати цю папку"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Щоб захистити свою конфіденційність, виберіть іншу папку"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Створити папку"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Пошук на цьому телефоні"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Пошук на цьому пристрої"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Видалити історію пошуку (<xliff:g id="TEXT">%1$s</xliff:g>)"</string>
<string name="personal_tab" msgid="3878576287868528503">"Особисте"</string>
<string name="work_tab" msgid="7265359366883747413">"Робоче"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index e2d3d1c..b0ee055 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"اس وقت مواد لوڈ نہیں ہو سکتا"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"ورک ایپس موقوف ہیں"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"ورک ایپس آن کریں"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> ایپس موقوف ہیں"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> ایپس آن کریں"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"دفتری فائلز منتخب نہیں کر سکتے"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"آپ کا IT منتظم آپ کو ذاتی ایپ سے دفتری فائلز تک رسائی حاصل کرنے کی اجازت نہیں دیتا ہے"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"ذاتی فائلز منتخب نہیں کر سکتے"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"آپ کا IT منتظم آپ کو دفتری ایپ سے ذاتی فائلز تک رسائی حاصل کرنے کی اجازت نہیں دیتا ہے"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> فائلز منتخب نہیں کر سکتے"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"آپ کا IT منتظم آپ کو <xliff:g id="PROFILE_1">%2$s</xliff:g> ایپ سے <xliff:g id="PROFILE_0">%1$s</xliff:g> فائلز تک رسائی کی اجازت نہیں دیتا ہے"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"دفتری پروفائل میں محفوظ نہیں کر سکتے"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"آپ کا IT منتظم آپ کو اپنی دفتری پروفائل میں ذاتی فائلز کو محفوظ کرنے کی اجازت نہیں دیتا ہے"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"ذاتی پروفائل میں محفوظ نہیں کر سکتے"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"آپ کا IT منتظم آپ کو اپنی ذاتی پروفائل میں دفتری فائلز کو محفوظ کرنے کی اجازت نہیں دیتا ہے"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> پروفائل میں محفوظ نہیں کیا جا سکتا"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"آپ کا IT منتظم آپ کو اپنی <xliff:g id="PROFILE_1">%2$s</xliff:g> پروفائل میں <xliff:g id="PROFILE_0">%1$s</xliff:g> فائلز محفوظ کرنے کی اجازت نہیں دیتا ہے"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"اس کارروائی کی اجازت نہیں ہے"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"مزید جاننے کے لیے، اپنے IT منتظم سے رابطہ کریں۔"</string>
<string name="root_recent" msgid="1080156975424341623">"حالیہ"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"نیا نام"</string>
<string name="preview_file" msgid="4056622696305432343">"فائل <xliff:g id="FILENAME">%1$s</xliff:g> کا پیش منظر"</string>
<string name="preview_work_file" msgid="4495643735563487273">"دفتری فائل <xliff:g id="FILENAME">%1$s</xliff:g> کا پیش منظر"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> کی فائل <xliff:g id="FILENAME">%2$s</xliff:g> کا پیش منظر دکھائیں"</string>
<string name="apps_row_title" msgid="3340490016663092925">"دیگر ایپس میں فائلز کو براؤز کریں"</string>
<string name="anonymous_application" msgid="7633027057951625862">"گمنام"</string>
<string name="open_tree_button" msgid="6402871398424497776">"اس فولڈر کو استعمال کریں"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"اس فولڈر کا استعمال نہیں کیا جا سکتا"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"اپنی رازداری کے تحفظ کے لیے کوئی دوسرا فولڈر منتخب کریں"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"نیا فولڈر بنائیں"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"اس فون میں تلاش کریں"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"اس آلے پر تلاش کریں"</string>
<string name="delete_search_history" msgid="2202015025607694515">"تلاش کی سرگزشت کی <xliff:g id="TEXT">%1$s</xliff:g> حذف کریں"</string>
<string name="personal_tab" msgid="3878576287868528503">"ذاتی"</string>
<string name="work_tab" msgid="7265359366883747413">"دفتری"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index dd005e2..02bdfb3 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Ayni paytda kontentni yuklab bo‘lmayapti"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Ishga oid ilovalar pauza qilingan"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Ishga oid ilovalarni yoqish"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g> ilovalari pauzada"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"<xliff:g id="PROFILE">%1$s</xliff:g> ilovalarini yoqish"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Ishga oid fayllarni tanlash imkonsiz"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"AT administratoringiz shaxsiy ilovadan ishga oid fayllarga kirishni taqiqlagan"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Shaxsiy fayllar tanlanmadi"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"AT administratoringiz ishga oid ilovadan shaxsiy fayllarga kirishni taqiqlagan"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"<xliff:g id="PROFILE">%1$s</xliff:g> fayllari tanlanmadi"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"AT administratoringiz <xliff:g id="PROFILE_1">%2$s</xliff:g> ilovasidan <xliff:g id="PROFILE_0">%1$s</xliff:g> fayllariga kirishni taqiqlagan"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Ish profiliga saqlash imkonsiz"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"AT administratoringiz shaxsiy fayllarni ish profiliga saqlashni taqiqlagan"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Shaxsiy profilga saqlash imkonsiz"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"AT administratoringiz ishga oid fayllarni shaxsiy profilingizga saqlashni taqiqlagan"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"<xliff:g id="PROFILE">%1$s</xliff:g> profiliga saqlanmadi"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"AT administratoringiz <xliff:g id="PROFILE_1">%2$s</xliff:g> profiliga <xliff:g id="PROFILE_0">%1$s</xliff:g> fayllarini saqlashni taqiqlagan"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Bu amalga ruxsat berilmagan"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Batafsil axborot olish uchun AT administratoringizga murojaat qiling"</string>
<string name="root_recent" msgid="1080156975424341623">"Yaqinda"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Yangi nom"</string>
<string name="preview_file" msgid="4056622696305432343">"<xliff:g id="FILENAME">%1$s</xliff:g> fayliga nazar solish"</string>
<string name="preview_work_file" msgid="4495643735563487273">"<xliff:g id="FILENAME">%1$s</xliff:g> ish fayliga nazar solish"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"<xliff:g id="PROFILE">%1$s</xliff:g> <xliff:g id="FILENAME">%2$s</xliff:g> fayliga nazar solish"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Boshqa ilovalardagi fayllarni topish"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Anonim"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Bu jilddan foydalanish"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Bu jilddan foydalanish imkonsiz"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Maxfiyligingizni muhofaza qilish uchun boshqa jildni tanlang"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Yangi jild yaratish"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Shu telefondan qidirish"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Shu qurilmadan qidirish"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Qidiruv tarixini tozalash (<xliff:g id="TEXT">%1$s</xliff:g>)"</string>
<string name="personal_tab" msgid="3878576287868528503">"Shaxsiy"</string>
<string name="work_tab" msgid="7265359366883747413">"Ish"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index b52f20a..235d372 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Không thể tải nội dung vào lúc này"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Ứng dụng công việc đã tạm dừng"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Bật ứng dụng công việc"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Các ứng dụng <xliff:g id="PROFILE">%1$s</xliff:g> đang bị tạm dừng"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Bật các ứng dụng <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Không thể chọn các tệp công việc"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Quản trị viên CNTT không cho phép bạn truy cập vào tệp công việc từ ứng dụng cá nhân"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Không thể chọn các tệp cá nhân"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Quản trị viên CNTT không cho phép bạn truy cập vào tệp cá nhân từ ứng dụng công việc"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Không chọn được tệp <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Quản trị viên CNTT của bạn không cho phép bạn truy cập tệp <xliff:g id="PROFILE_0">%1$s</xliff:g> từ ứng dụng <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Không thể lưu vào hồ sơ công việc"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Quản trị viên CNTT không cho phép bạn lưu tệp cá nhân vào hồ sơ công việc của bạn"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Không thể lưu vào hồ sơ cá nhân"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Quản trị viên CNTT không cho phép bạn lưu tệp công việc vào hồ sơ cá nhân của bạn"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Không lưu được vào hồ sơ <xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Quản trị viên CNTT của bạn không cho phép bạn lưu tệp <xliff:g id="PROFILE_0">%1$s</xliff:g> vào hồ sơ <xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Quản trị viên CNTT không cho phép thực hiện thao tác này"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Hãy liên hệ với quản trị viên CNTT để tìm hiểu thêm"</string>
<string name="root_recent" msgid="1080156975424341623">"Gần đây"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Tên mới"</string>
<string name="preview_file" msgid="4056622696305432343">"Xem trước tệp <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Xem trước tệp công việc <xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Xem trước tệp <xliff:g id="PROFILE">%1$s</xliff:g> <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Duyệt qua tệp trong các ứng dụng khác"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Ẩn danh"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Sử dụng thư mục này"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Không thể dùng thư mục này"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Để bảo vệ quyền riêng tư của bạn, hãy chọn một thư mục khác"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Tạo thư mục mới"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Tìm kiếm trên điện thoại này"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Tìm kiếm trên thiết bị này"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Xoá nhật ký tìm kiếm <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Cá nhân"</string>
<string name="work_tab" msgid="7265359366883747413">"Công việc"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 1167256..992c571 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"暂时无法加载内容"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"工作应用已暂停"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"开启工作应用"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g>应用已暂停"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"启用<xliff:g id="PROFILE">%1$s</xliff:g>应用"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"无法选择工作文件"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"您的 IT 管理员不允许您通过个人应用访问工作文件"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"无法选择个人文件"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"您的 IT 管理员不允许您通过工作应用访问个人文件"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"无法选择<xliff:g id="PROFILE">%1$s</xliff:g>文件"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"您的 IT 管理员不允许从<xliff:g id="PROFILE_1">%2$s</xliff:g>应用访问<xliff:g id="PROFILE_0">%1$s</xliff:g>文件"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"无法保存到工作资料"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"您的 IT 管理员不允许您将个人文件保存到工作资料"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"无法保存到个人资料"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"您的 IT 管理员不允许您将工作文件保存到个人资料"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"无法保存到<xliff:g id="PROFILE">%1$s</xliff:g>个人资料"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"您的 IT 管理员不允许将<xliff:g id="PROFILE_0">%1$s</xliff:g>文件保存到<xliff:g id="PROFILE_1">%2$s</xliff:g>个人资料"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"不允许执行该操作"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"如需了解详情,请与您的 IT 管理员联系"</string>
<string name="root_recent" msgid="1080156975424341623">"最近"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"新名称"</string>
<string name="preview_file" msgid="4056622696305432343">"预览“<xliff:g id="FILENAME">%1$s</xliff:g>”文件"</string>
<string name="preview_work_file" msgid="4495643735563487273">"预览工作文件“<xliff:g id="FILENAME">%1$s</xliff:g>”"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"预览<xliff:g id="PROFILE">%1$s</xliff:g>文件“<xliff:g id="FILENAME">%2$s</xliff:g>”"</string>
<string name="apps_row_title" msgid="3340490016663092925">"浏览其他应用中的文件"</string>
<string name="anonymous_application" msgid="7633027057951625862">"匿名"</string>
<string name="open_tree_button" msgid="6402871398424497776">"使用此文件夹"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"无法使用此文件夹"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"为保护您的隐私,请选择其他文件夹"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"新建文件夹"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"在此手机内搜索"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"在此设备上搜索"</string>
<string name="delete_search_history" msgid="2202015025607694515">"删除搜索记录“<xliff:g id="TEXT">%1$s</xliff:g>”"</string>
<string name="personal_tab" msgid="3878576287868528503">"个人"</string>
<string name="work_tab" msgid="7265359366883747413">"工作"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 7cd2401..eec2956 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"目前無法載入內容"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"已暫停工作應用程式"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"開啟工作應用程式"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"已暫停<xliff:g id="PROFILE">%1$s</xliff:g>應用程式"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"開啟<xliff:g id="PROFILE">%1$s</xliff:g>應用程式"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"無法選取工作檔案"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"IT 管理員不允許你透過個人應用程式存取工作檔案"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"無法選取個人檔案"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"IT 管理員不允許你透過工作應用程式存取個人檔案"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"無法選取<xliff:g id="PROFILE">%1$s</xliff:g>檔案"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT 管理員不允許你使用<xliff:g id="PROFILE_1">%2$s</xliff:g>應用程式存取<xliff:g id="PROFILE_0">%1$s</xliff:g>檔案"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"無法儲存至工作設定檔"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"IT 管理員不允許你將個人檔案儲存至工作設定檔"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"無法儲存至個人設定檔"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"IT 管理員不允許你將工作檔案儲存至個人設定檔"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"無法儲存至<xliff:g id="PROFILE">%1$s</xliff:g>設定檔"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT 管理員不允許你將<xliff:g id="PROFILE_0">%1$s</xliff:g>檔案儲存至<xliff:g id="PROFILE_1">%2$s</xliff:g>設定檔"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"不允許執行這項操作"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"詳情請聯絡 IT 管理員。"</string>
<string name="root_recent" msgid="1080156975424341623">"最近項目"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"新名稱"</string>
<string name="preview_file" msgid="4056622696305432343">"預覽 <xliff:g id="FILENAME">%1$s</xliff:g> 檔案"</string>
<string name="preview_work_file" msgid="4495643735563487273">"預覽工作檔案「<xliff:g id="FILENAME">%1$s</xliff:g>」"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"預覽<xliff:g id="PROFILE">%1$s</xliff:g>檔案 <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"瀏覽其他應用程式中的檔案"</string>
<string name="anonymous_application" msgid="7633027057951625862">"匿名"</string>
<string name="open_tree_button" msgid="6402871398424497776">"使用此資料夾"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"無法使用此資料夾"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"為保護你的私隱,請選擇其他資料夾"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"建立新資料夾"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"在這部手機中搜尋"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"搜尋此裝置"</string>
<string name="delete_search_history" msgid="2202015025607694515">"刪除搜尋記錄 <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"個人"</string>
<string name="work_tab" msgid="7265359366883747413">"工作"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 892a75b..16d0a73 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"目前無法載入內容"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"系統已暫停工作應用程式"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"開啟工作應用程式"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"<xliff:g id="PROFILE">%1$s</xliff:g>應用程式已暫停"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"開啟<xliff:g id="PROFILE">%1$s</xliff:g>應用程式"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"無法選取工作檔案"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"你的 IT 管理員不允許你透過個人應用程式存取工作檔案"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"無法選取個人檔案"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"你的 IT 管理員不允許你透過工作應用程式存取個人檔案"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"無法選取<xliff:g id="PROFILE">%1$s</xliff:g>的檔案"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"IT 管理員不允許你使用<xliff:g id="PROFILE_1">%2$s</xliff:g>應用程式存取<xliff:g id="PROFILE_0">%1$s</xliff:g>檔案"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"無法儲存到工作資料夾"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"你的 IT 管理員不允許你將個人檔案儲存到工作資料夾"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"無法儲存到個人資料夾"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"你的 IT 管理員不允許你將工作檔案儲存到個人資料夾"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"無法儲存到<xliff:g id="PROFILE">%1$s</xliff:g>資料夾"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"IT 管理員不允許你將<xliff:g id="PROFILE_0">%1$s</xliff:g>檔案儲存到<xliff:g id="PROFILE_1">%2$s</xliff:g>資料夾"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"不允許執行這項動作"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"如要瞭解詳情,請與你的 IT 管理員聯絡"</string>
<string name="root_recent" msgid="1080156975424341623">"最近"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"新名稱"</string>
<string name="preview_file" msgid="4056622696305432343">"預覽 <xliff:g id="FILENAME">%1$s</xliff:g> 檔案"</string>
<string name="preview_work_file" msgid="4495643735563487273">"預覽工作檔案「<xliff:g id="FILENAME">%1$s</xliff:g>」"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"預覽<xliff:g id="PROFILE">%1$s</xliff:g>檔案 <xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"瀏覽其他應用程式中的檔案"</string>
<string name="anonymous_application" msgid="7633027057951625862">"匿名"</string>
<string name="open_tree_button" msgid="6402871398424497776">"使用這個資料夾"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"無法使用這個資料夾"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"為保護你的隱私,請選擇其他資料夾"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"建立新資料夾"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"在手機內搜尋"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"搜尋這部裝置"</string>
<string name="delete_search_history" msgid="2202015025607694515">"刪除搜尋記錄 <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"個人"</string>
<string name="work_tab" msgid="7265359366883747413">"工作"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 3015e20..83a6542 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -94,14 +94,20 @@
<string name="query_error" msgid="6625421453613879336">"Ayikwazanga ukulayisha okuqukethwe okwamanje"</string>
<string name="quiet_mode_error_title" msgid="554319751414657910">"Ama-app omsebenzi amisiwe"</string>
<string name="quiet_mode_button" msgid="8051436551926677305">"Vula ama-app omsebenzi"</string>
+ <string name="profile_quiet_mode_error_title" msgid="7126962749634841843">"Ama-app e-<xliff:g id="PROFILE">%1$s</xliff:g> amisiwe"</string>
+ <string name="profile_quiet_mode_button" msgid="6791235010992920102">"Vula ama-app we-<xliff:g id="PROFILE">%1$s</xliff:g>"</string>
<string name="cant_select_work_files_error_title" msgid="6688716319549644354">"Ayikwazi ukukhetha amafayela omsebenzi"</string>
<string name="cant_select_work_files_error_message" msgid="683480676150690641">"Umphathi wakho we-IT akakuvumeli ukuba ufinyelele amafayela omsebenzi avela kuhlelo lokusebenza lomuntu siqu"</string>
<string name="cant_select_personal_files_error_title" msgid="3200697170148617742">"Ayikwazi ukukhetha amafayela akho siqu"</string>
<string name="cant_select_personal_files_error_message" msgid="4105905035459118209">"Umphathi wakho we-IT akakuvumeli ukuba ufinyelele amafayela akho siqu avela ohlelweni lokusebenza lomsebenzi"</string>
+ <string name="cant_select_cross_profile_files_error_title" msgid="17010948874969413">"Ayikwazi ukukhetha amafayela we-<xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_select_cross_profile_files_error_message" msgid="3815829574883844944">"Umphathi wakho we-IT akakuvumeli ukuthi ufinyelele amafayela we-<xliff:g id="PROFILE_0">%1$s</xliff:g> usebenzisa i-app ye-<xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cant_save_to_work_error_title" msgid="1351323070040641358">"Ayikwazi ukulondoloza kuphrofayela lomsebenzi"</string>
<string name="cant_save_to_work_error_message" msgid="4975583233814059890">"Umphathi wakho we-IT akakuvumeli ukuba ulondoloze amafayela akho siqu kwiphrofayela lakho lomsebenzi"</string>
<string name="cant_save_to_personal_error_title" msgid="858327493694069780">"Ayikwazi ukulondoloza kuphrofayela lakho siqu"</string>
<string name="cant_save_to_personal_error_message" msgid="6991758723736381751">"Umphathi wakho we-IT akakuvumeli ukuba ulondoloze amafayela akho omsebenzi kwiphrofayela lakho"</string>
+ <string name="cant_save_to_cross_profile_error_title" msgid="5158984057654779022">"Ayikwazi ukulondoloza kuphrofayela ye-<xliff:g id="PROFILE">%1$s</xliff:g>"</string>
+ <string name="cant_save_to_cross_profile_error_message" msgid="5845240315510422749">"Umphathi wakho we-IT akakuvumeli ukuthi ulondoloze amafayela we-<xliff:g id="PROFILE_0">%1$s</xliff:g> kuphrofayela yakho ye-<xliff:g id="PROFILE_1">%2$s</xliff:g>"</string>
<string name="cross_profile_action_not_allowed_title" msgid="6611281348716476478">"Lesi senzo asivunyelwe"</string>
<string name="cross_profile_action_not_allowed_message" msgid="7331275433061690947">"Ukuze ufunde kabanzi, xhumana nomphathi wakho we-IT"</string>
<string name="root_recent" msgid="1080156975424341623">"Okwakamuva"</string>
@@ -266,6 +272,7 @@
<string name="input_hint_rename" msgid="8390711744270994452">"Igama elisha"</string>
<string name="preview_file" msgid="4056622696305432343">"Buka kuqala ifayela le-<xliff:g id="FILENAME">%1$s</xliff:g>"</string>
<string name="preview_work_file" msgid="4495643735563487273">"Hlola kuqala ifayela lomsebenzi i-<xliff:g id="FILENAME">%1$s</xliff:g>"</string>
+ <string name="preview_cross_profile_file" msgid="7457849216193029610">"Buka kuqala i-<xliff:g id="PROFILE">%1$s</xliff:g> yefayela le-<xliff:g id="FILENAME">%2$s</xliff:g>"</string>
<string name="apps_row_title" msgid="3340490016663092925">"Phequlula amafayela kwezinye izinhlelo zokusebenza"</string>
<string name="anonymous_application" msgid="7633027057951625862">"Okungaziwa"</string>
<string name="open_tree_button" msgid="6402871398424497776">"Sebenzisa le folda"</string>
@@ -274,7 +281,7 @@
<string name="directory_blocked_header_title" msgid="1164584889578740066">"Awukwazi ukusebenzisa le folda"</string>
<string name="directory_blocked_header_subtitle" msgid="2829150911849033408">"Ukuvikela ubumfihlo bakho, khetha enye ifolda"</string>
<string name="create_new_folder_button" msgid="8859613309559794890">"Dala ifolda entsha"</string>
- <string name="search_bar_hint" msgid="4517366509897977321">"Sesha le foni"</string>
+ <string name="search_bar_hint" msgid="146031513183888721">"Sesha le divayisi"</string>
<string name="delete_search_history" msgid="2202015025607694515">"Susa umlando wokusesha <xliff:g id="TEXT">%1$s</xliff:g>"</string>
<string name="personal_tab" msgid="3878576287868528503">"Okomuntu siqu"</string>
<string name="work_tab" msgid="7265359366883747413">"Umsebenzi"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a1d6982..89e40ac 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -189,6 +189,15 @@
<!-- Button text shown on a button when work profile is paused. Tapping the button will switch on the work profile [CHAR LIMIT=48] -->
<string name="quiet_mode_button">Turn on work apps</string>
+ <!-- Title of an error message. This screen is shown when the selected profile is paused. [CHAR LIMIT=72] -->
+ <string name="profile_quiet_mode_error_title">
+ <xliff:g id="profile" example="Work">%1$s</xliff:g> apps are paused
+ </string>
+ <!-- Button text shown on a button when selected profile is paused. Tapping the button will switch on the selected profile [CHAR LIMIT=48] -->
+ <string name="profile_quiet_mode_button">
+ Turn on <xliff:g id="profile" example="work">%1$s</xliff:g> apps
+ </string>
+
<!-- Error message title shown when a user's IT admin does not allow the user to select work files from a personal app. [CHAR LIMIT=72] -->
<string name="cant_select_work_files_error_title">Can\u2019t select work files</string>
<!-- Error message that's shown when the user's IT admin doesn't allow the user to select work files from a personal app. [CHAR LIMIT=200] -->
@@ -203,6 +212,16 @@
access personal files from a work app
</string>
+ <!-- Error message title shown when a user's cross profile setting does not allow the user to select one profile's files from another profile app. [CHAR LIMIT=72] -->
+ <string name="cant_select_cross_profile_files_error_title">Can\u2019t select
+ <xliff:g id="profile" example="work">%1$s</xliff:g> files
+ </string>
+ <!-- Error message that's shown when the user's cross profile setting doesn't allow the user to select one profile's files from another profile app. [CHAR LIMIT=200] -->
+ <string name="cant_select_cross_profile_files_error_message">Your IT admin doesn\u2019t allow
+ you to access <xliff:g id="profile" example="work">%1$s</xliff:g> files from a
+ <xliff:g id="profile" example="personal">%2$s</xliff:g> app
+ </string>
+
<!-- Error message title shown when the admin does not allow the user to save files from their personal profile to their work profile. [CHAR LIMIT=72] -->
<string name="cant_save_to_work_error_title">Can\u2019t save to work profile</string>
<!-- Error message shown when the user's IT admin doesn't allow the user to save files from their personal profile to their work profile. [CHAR LIMIT=200] -->
@@ -217,6 +236,16 @@
work files to your personal profile
</string>
+ <!-- Error message title shown when the user's cross profile setting does not allow the user to save files from one profile to another profile. [CHAR LIMIT=72] -->
+ <string name="cant_save_to_cross_profile_error_title">Can\u2019t save to
+ <xliff:g id="profile" example="work">%1$s</xliff:g> profile
+ </string>
+ <!-- Error message shown when the user's cross profile setting doesn't allow the user to save files from one profile to another profile. [CHAR LIMIT=200] -->
+ <string name="cant_save_to_cross_profile_error_message">Your IT admin doesn\u2019t allow you to
+ save <xliff:g id="profile" example="personal">%1$s</xliff:g> files to your
+ <xliff:g id="profile" example="work">%2$s</xliff:g> profile
+ </string>
+
<!-- Error message title. This message is shown when a user tries to do something on their work device, but that action isn't allowed by their IT admin. [CHAR LIMIT=72] -->
<string name="cross_profile_action_not_allowed_title">This action isn\u2019t allowed</string>
<!-- Error message. This message is shown when a user tries to do something on their work device, but that action isn't allowed by their IT admin. [CHAR LIMIT=200] -->
@@ -509,6 +538,8 @@
<string name="preview_file">Preview the file <xliff:g id="fileName" example="example.jpg">%1$s</xliff:g></string>
<!-- Content description text that's spoken by a screen reader. This text is for previewing a work file before opening it. -->
<string name="preview_work_file">Preview the work file <xliff:g id="fileName" example="example.jpg">%1$s</xliff:g></string>
+ <!-- Content description text that's spoken by a screen reader. This text is for previewing a private file before opening it. -->
+ <string name="preview_cross_profile_file">Preview the <xliff:g id="profile" example="work">%1$s</xliff:g> file <xliff:g id="fileName" example="example.jpg">%2$s</xliff:g></string>
<!-- Apps row title. [CHAR_LIMIT=60] -->
<string name="apps_row_title">Browse files in other apps</string>
@@ -530,7 +561,7 @@
<!-- Search hint on search view. [CHAR LIMIT=48] -->
- <string name="search_bar_hint">Search this phone</string>
+ <string name="search_bar_hint">Search this device</string>
<!-- Content description for deleting search history. [CHAR_LIMIT=60] -->
<string name="delete_search_history">Delete search history <xliff:g id="text" example="image">%1$s</xliff:g></string>
diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java
index 4407a62..e348d6b 100644
--- a/src/com/android/documentsui/AbstractActionHandler.java
+++ b/src/com/android/documentsui/AbstractActionHandler.java
@@ -119,6 +119,7 @@
public void registerDisplayStateChangedListener(Runnable l) {
mDisplayStateChangedListener = l;
}
+
@Override
public void unregisterDisplayStateChangedListener(Runnable l) {
if (mDisplayStateChangedListener == l) {
@@ -135,12 +136,12 @@
Lookup<String, Executor> executors,
Injector<?> injector) {
- assert(activity != null);
- assert(state != null);
- assert(providers != null);
- assert(searchMgr != null);
- assert(docs != null);
- assert(injector != null);
+ assert (activity != null);
+ assert (state != null);
+ assert (providers != null);
+ assert (searchMgr != null);
+ assert (docs != null);
+ assert (injector != null);
mActivity = activity;
mState = state;
@@ -359,7 +360,7 @@
@Override
public void openContainerDocument(DocumentInfo doc) {
- assert(doc.isContainer());
+ assert (doc.isContainer());
if (mSearchMgr.isSearching()) {
loadDocument(
@@ -372,6 +373,7 @@
}
// TODO: Make this private and make tests call interface method instead.
+
/**
* Behavior when a document is opened.
*/
@@ -620,7 +622,7 @@
currentDoc = mDocs.getArchiveDocument(doc.derivedUri, doc.userId);
}
- assert(currentDoc != null);
+ assert (currentDoc != null);
if (currentDoc.equals(mState.stack.peek())) {
Log.w(TAG, "This DocumentInfo is already in current DocumentsStack");
return;
@@ -676,8 +678,8 @@
ComponentName component = new ComponentName(
mActivity.getPackageName(), Shared.LAUNCHER_TARGET_CLASS);
pm.setComponentEnabledSetting(component, enalbled
- ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED
- : PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED
+ : PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
}
@@ -714,7 +716,7 @@
mDocs,
userId,
callback
- ).executeOnExecutor(mExecutors.lookup(uri.getAuthority()), uri);
+ ).executeOnExecutor(mExecutors.lookup(uri.getAuthority()), uri);
}
@Override
@@ -826,8 +828,8 @@
private void onRootLoaded(@Nullable RootInfo root) {
boolean invalidRootForAction =
(root != null
- && !root.supportsChildren()
- && mState.action == State.ACTION_OPEN_TREE);
+ && !root.supportsChildren()
+ && mState.action == State.ACTION_OPEN_TREE);
if (invalidRootForAction) {
loadDeviceRoot();
@@ -942,8 +944,8 @@
if (DEBUG) {
Log.d(TAG,
- "Creating new directory loader for: "
- + DocumentInfo.debugString(mState.stack.peek()));
+ "Creating new directory loader for: "
+ + DocumentInfo.debugString(mState.stack.peek()));
}
return new DirectoryLoader(
@@ -961,9 +963,9 @@
public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) {
if (DEBUG) {
Log.d(TAG, "Loader has finished for: "
- + DocumentInfo.debugString(mState.stack.peek()));
+ + DocumentInfo.debugString(mState.stack.peek()));
}
- assert(result != null);
+ assert (result != null);
mInjector.getModel().update(result);
mLoaderSemaphore.release();
@@ -974,24 +976,34 @@
mLoaderSemaphore.release();
}
}
+
/**
* A class primarily for the support of isolating our tests
* from our concrete activity implementations.
*/
public interface CommonAddons {
void restoreRootAndDirectory();
+
void refreshCurrentRootAndDirectory(@AnimationType int anim);
+
void onRootPicked(RootInfo root);
+
// TODO: Move this to PickAddons as multi-document picking is exclusive to that activity.
void onDocumentsPicked(List<DocumentInfo> docs);
+
void onDocumentPicked(DocumentInfo doc);
+
RootInfo getCurrentRoot();
+
DocumentInfo getCurrentDirectory();
+
UserId getSelectedUser();
+
/**
* Check whether current directory is root of recent.
*/
boolean isInRecents();
+
void setRootsDrawerOpen(boolean open);
/**
diff --git a/src/com/android/documentsui/ActionModeController.java b/src/com/android/documentsui/ActionModeController.java
index 89b8ff3..1bd4eea 100644
--- a/src/com/android/documentsui/ActionModeController.java
+++ b/src/com/android/documentsui/ActionModeController.java
@@ -79,7 +79,8 @@
Log.d(TAG, "Starting action mode.");
}
mActionMode = mActivity.startActionMode(this);
- final View closeButton = mActivity.findViewById(R.id.action_mode_close_button);
+ final View closeButton =
+ mActivity.findViewById(androidx.appcompat.R.id.action_mode_close_button);
if (closeButton != null) {
closeButton.setContentDescription(mActivity.getString(android.R.string.cancel));
}
diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java
index f08294e..4228ead 100644
--- a/src/com/android/documentsui/BaseActivity.java
+++ b/src/com/android/documentsui/BaseActivity.java
@@ -91,6 +91,7 @@
protected SearchViewManager mSearchManager;
protected AppsRowManager mAppsRowManager;
protected UserIdManager mUserIdManager;
+ protected UserManagerState mUserManagerState;
protected State mState;
@Injected
@@ -102,6 +103,7 @@
protected NavigationViewManager mNavigator;
protected SortController mSortController;
+ protected ConfigStore mConfigStore;
private final List<EventListener> mEventListeners = new ArrayList<>();
private final String mTag;
@@ -116,18 +118,36 @@
private PreferencesMonitor mPreferencesMonitor;
+ private boolean mHasProfileBecomeUnavailable = false;
+
+ public void setHasProfileBecomeUnavailable(boolean hasProfileBecomeUnavailable) {
+ mHasProfileBecomeUnavailable = hasProfileBecomeUnavailable;
+ }
+
public BaseActivity(@LayoutRes int layoutId, String tag) {
mLayoutId = layoutId;
mTag = tag;
}
protected abstract void refreshDirectory(int anim);
+
/** Allows sub-classes to include information in a newly created State instance. */
protected abstract void includeState(State initialState);
+
protected abstract void onDirectoryCreated(DocumentInfo doc);
public abstract Injector<?> getInjector();
+ @VisibleForTesting
+ protected void initConfigStore() {
+ mConfigStore = DocumentsApplication.getConfigStore(this);
+ }
+
+ @VisibleForTesting
+ public void setConfigStore(ConfigStore configStore) {
+ mConfigStore = configStore;
+ }
+
@CallSuper
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -149,6 +169,8 @@
setContainer();
+ initConfigStore();
+
mInjector = getInjector();
mState = getState(savedInstanceState);
mDrawer = DrawerController.create(this, mInjector.config);
@@ -161,12 +183,11 @@
setSupportActionBar(toolbar);
Breadcrumb breadcrumb = findViewById(R.id.horizontal_breadcrumb);
- assert(breadcrumb != null);
+ assert (breadcrumb != null);
View profileTabsContainer = findViewById(R.id.tabs_container);
assert (profileTabsContainer != null);
- mNavigator = new NavigationViewManager(this, mDrawer, mState, this, breadcrumb,
- profileTabsContainer, DocumentsApplication.getUserIdManager(this));
+ mNavigator = getNavigationViewManager(breadcrumb, profileTabsContainer);
AppBarLayout appBarLayout = findViewById(R.id.app_bar);
if (appBarLayout != null) {
appBarLayout.addOnOffsetChangedListener(mNavigator);
@@ -263,7 +284,9 @@
cmdInterceptor);
ViewGroup chipGroup = findViewById(R.id.search_chip_group);
+
mUserIdManager = DocumentsApplication.getUserIdManager(this);
+ mUserManagerState = DocumentsApplication.getUserManagerState(this);
mSearchManager = new SearchViewManager(searchListener, queryInterceptor,
chipGroup, savedInstanceState);
// initialize the chip sets by accept mime types
@@ -313,7 +336,12 @@
// The activity will clear search on root picked. If we don't clear the search,
// user may see the search result screen show up briefly and then get cleared.
mSearchManager.cancelSearch();
- mInjector.actions.loadCrossProfileRoot(getCurrentRoot(), userId);
+ // When a profile with user property SHOW_IN_QUIET_MODE_HIDDEN is currently
+ // selected, and it becomes unavailable, we reset the roots to recents.
+ // We do not reset it to recents when pick activity is due to ACTION_CREATE_DOCUMENT
+ mInjector.actions.loadCrossProfileRoot(
+ (mHasProfileBecomeUnavailable && mState.action != State.ACTION_CREATE)
+ ? getRecentsRoot() : getCurrentRoot(), userId);
}
});
@@ -329,6 +357,18 @@
setResult(AppCompatActivity.RESULT_CANCELED);
}
+ private NavigationViewManager getNavigationViewManager(Breadcrumb breadcrumb,
+ View profileTabsContainer) {
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ return new NavigationViewManager(this, mDrawer, mState, this, breadcrumb,
+ profileTabsContainer, DocumentsApplication.getUserManagerState(this),
+ mConfigStore);
+ }
+ return new NavigationViewManager(this, mDrawer, mState, this, breadcrumb,
+ profileTabsContainer, DocumentsApplication.getUserIdManager(this),
+ mConfigStore);
+ }
+
public void onPreferenceChanged(String pref) {
// For now, we only work with prefs that we backup. This
// just limits the scope of what we expect to come flowing
@@ -386,6 +426,8 @@
mRootsMonitor.stop();
mPreferencesMonitor.stop();
mSortController.destroy();
+ DocumentsApplication.invalidateUserManagerState(this);
+ DocumentsApplication.invalidateConfigStore();
super.onDestroy();
}
@@ -411,6 +453,7 @@
getApplicationContext()
.getResources()
.getBoolean(R.bool.show_hidden_files_by_default));
+ state.configStore = mConfigStore;
includeState(state);
@@ -544,7 +587,6 @@
/**
* Returns true if a directory can be created in the current location.
- * @return
*/
protected boolean canCreateDirectory() {
final RootInfo root = getCurrentRoot();
@@ -582,7 +624,6 @@
/**
* Refreshes the content of the director and the menu/action bar.
* The current directory name and selection will get updated.
- * @param anim
*/
@Override
public final void refreshCurrentRootAndDirectory(int anim) {
@@ -632,7 +673,7 @@
try {
PackageInfo pkgInfo = getPackageManager().getPackageInfo(packageName,
PackageManager.GET_PROVIDERS);
- for (ProviderInfo provider: pkgInfo.providers) {
+ for (ProviderInfo provider : pkgInfo.providers) {
authorities.add(provider.authority);
}
} catch (PackageManager.NameNotFoundException e) {
@@ -708,9 +749,14 @@
}
}
- public void updateHeader(boolean shouldHideHeader){
+ /**
+ * Updates headerContainer by setting its visibility
+ *
+ * @param shouldHideHeader whether to hide header container or not
+ */
+ public void updateHeader(boolean shouldHideHeader) {
View headerContainer = findViewById(R.id.header_container);
- if(headerContainer == null){
+ if (headerContainer == null) {
updateHeaderTitle();
return;
}
@@ -779,7 +825,7 @@
private String getHeaderDownloadsTitle() {
return getString(mState.isPhotoPicking()
- ? R.string.root_info_header_image_downloads : R.string.root_info_header_downloads);
+ ? R.string.root_info_header_image_downloads : R.string.root_info_header_downloads);
}
private String getHeaderStorageTitle(String rootTitle) {
@@ -809,6 +855,7 @@
/**
* Get title string equal to the string action bar displayed.
+ *
* @return current directory title name
*/
public String getCurrentTitle() {
@@ -849,6 +896,10 @@
}
}
+ public RootInfo getRecentsRoot() {
+ return mProviders.generateRecentsRoot(getSelectedUser());
+ }
+
@Override
public DocumentInfo getCurrentDirectory() {
return mState.stack.peek();
diff --git a/src/com/android/documentsui/ConfigStore.java b/src/com/android/documentsui/ConfigStore.java
new file mode 100644
index 0000000..09255c7
--- /dev/null
+++ b/src/com/android/documentsui/ConfigStore.java
@@ -0,0 +1,85 @@
+/*
+ * 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.documentsui;
+
+import android.os.Binder;
+import android.provider.DeviceConfig;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.common.base.Supplier;
+
+public interface ConfigStore {
+ // TODO(b/288066342): Remove and replace after new constant definition in
+ // {@link android.provider.DeviceConfig}.
+ String NAMESPACE_MEDIAPROVIDER = "mediaprovider";
+
+ boolean DEFAULT_PICKER_PRIVATE_SPACE_ENABLED = false;
+
+ /**
+ * @return if the Private-Space-in-DocsUI is enabled
+ */
+ default boolean isPrivateSpaceInDocsUIEnabled() {
+ return DEFAULT_PICKER_PRIVATE_SPACE_ENABLED;
+ }
+
+ /**
+ * Implementation of the {@link ConfigStore} that reads "real" configs from
+ * {@link android.provider.DeviceConfig}. Meant to be used by the "production" code.
+ */
+ class ConfigStoreImpl implements ConfigStore {
+ @VisibleForTesting
+ public static final String KEY_PRIVATE_SPACE_FEATURE_ENABLED =
+ "private_space_feature_enabled";
+
+ private static final boolean sCanReadDeviceConfig = SdkLevel.isAtLeastS();
+
+ private Boolean mIsPrivateSpaceEnabled = null;
+
+ @Override
+ public boolean isPrivateSpaceInDocsUIEnabled() {
+ if (mIsPrivateSpaceEnabled == null) {
+ mIsPrivateSpaceEnabled = getBooleanDeviceConfig(
+ NAMESPACE_MEDIAPROVIDER,
+ KEY_PRIVATE_SPACE_FEATURE_ENABLED,
+ DEFAULT_PICKER_PRIVATE_SPACE_ENABLED);
+ }
+ return sCanReadDeviceConfig && mIsPrivateSpaceEnabled;
+ }
+
+ private static boolean getBooleanDeviceConfig(@NonNull String namespace,
+ @NonNull String key, boolean defaultValue) {
+ if (!sCanReadDeviceConfig) {
+ return defaultValue;
+ }
+ return withCleanCallingIdentity(
+ () -> DeviceConfig.getBoolean(namespace, key, defaultValue));
+ }
+
+ private static <T> T withCleanCallingIdentity(@NonNull Supplier<T> action) {
+ final long callingIdentity = Binder.clearCallingIdentity();
+ try {
+ return action.get();
+ } finally {
+ Binder.restoreCallingIdentity(callingIdentity);
+ }
+ }
+ }
+}
diff --git a/src/com/android/documentsui/DirectoryLoader.java b/src/com/android/documentsui/DirectoryLoader.java
index 8161447..870e998 100644
--- a/src/com/android/documentsui/DirectoryLoader.java
+++ b/src/com/android/documentsui/DirectoryLoader.java
@@ -129,8 +129,7 @@
if (mSearchMode) {
queryArgs.putAll(mQueryArgs);
if (shouldSearchAcrossProfile()) {
- for (UserId userId : DocumentsApplication.getUserIdManager(
- getContext()).getUserIds()) {
+ for (UserId userId : getUserIds()) {
if (mState.canInteractWith(userId)) {
userIds.add(userId);
}
@@ -330,4 +329,11 @@
}
return false;
}
+
+ private List<UserId> getUserIds() {
+ if (mState.configStore.isPrivateSpaceInDocsUIEnabled()) {
+ return DocumentsApplication.getUserManagerState(getContext()).getUserIds();
+ }
+ return DocumentsApplication.getUserIdManager(getContext()).getUserIds();
+ }
}
diff --git a/src/com/android/documentsui/DocumentsAccess.java b/src/com/android/documentsui/DocumentsAccess.java
index e3b6abd..fcd3471 100644
--- a/src/com/android/documentsui/DocumentsAccess.java
+++ b/src/com/android/documentsui/DocumentsAccess.java
@@ -69,7 +69,6 @@
public final class RuntimeDocumentAccess implements DocumentsAccess {
private static final String TAG = "DocumentAccess";
-
private final Context mContext;
private final State mState;
diff --git a/src/com/android/documentsui/DocumentsApplication.java b/src/com/android/documentsui/DocumentsApplication.java
index c576851..92aa3f7 100644
--- a/src/com/android/documentsui/DocumentsApplication.java
+++ b/src/com/android/documentsui/DocumentsApplication.java
@@ -28,9 +28,11 @@
import android.content.om.OverlayManager;
import android.net.Uri;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.text.format.DateUtils;
import android.util.Log;
+import androidx.annotation.Nullable;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.android.documentsui.base.Lookup;
@@ -41,11 +43,14 @@
import com.android.documentsui.queries.SearchHistoryManager;
import com.android.documentsui.roots.ProvidersCache;
import com.android.documentsui.theme.ThemeOverlayManager;
+import com.android.modules.utils.build.SdkLevel;
import com.google.common.collect.Lists;
import java.util.List;
+import javax.annotation.concurrent.GuardedBy;
+
public class DocumentsApplication extends Application {
private static final String TAG = "DocumentsApplication";
private static final long PROVIDER_ANR_TIMEOUT = 20 * DateUtils.SECOND_IN_MILLIS;
@@ -57,23 +62,41 @@
Intent.ACTION_PACKAGE_DATA_CLEARED
);
- private static final List<String> MANAGED_PROFILE_FILTER_ACTIONS = Lists.newArrayList(
+ private static final List<String> PROFILE_FILTER_ACTIONS = Lists.newArrayList(
Intent.ACTION_MANAGED_PROFILE_ADDED,
Intent.ACTION_MANAGED_PROFILE_REMOVED,
Intent.ACTION_MANAGED_PROFILE_UNLOCKED,
Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE
);
+ @GuardedBy("DocumentsApplication.class")
+ @Nullable
+ private static volatile ConfigStore sConfigStore;
+
private ProvidersCache mProviders;
private ThumbnailCache mThumbnailCache;
private ClipStorage mClipStore;
private DocumentClipper mClipper;
private DragAndDropManager mDragAndDropManager;
private UserIdManager mUserIdManager;
+ private UserManagerState mUserManagerState;
private Lookup<String, String> mFileTypeLookup;
public static ProvidersCache getProvidersCache(Context context) {
- return ((DocumentsApplication) context.getApplicationContext()).mProviders;
+ ProvidersCache providers =
+ ((DocumentsApplication) context.getApplicationContext()).mProviders;
+ final ConfigStore configStore = getConfigStore(context);
+ // When private space in DocsUI is enabled then ProvidersCache should use UserManagerState
+ // else it should use UserIdManager. The following if-check will ensure the construction of
+ // a new ProvidersCache instance whenever there is a mismatch in this.
+ if (configStore.isPrivateSpaceInDocsUIEnabled()
+ != providers.isProvidersCacheUsingUserManagerState()) {
+ providers = configStore.isPrivateSpaceInDocsUIEnabled()
+ ? new ProvidersCache(context, getUserManagerState(context), configStore)
+ : new ProvidersCache(context, getUserIdManager(context), configStore);
+ ((DocumentsApplication) context.getApplicationContext()).mProviders = providers;
+ }
+ return providers;
}
public static ThumbnailCache getThumbnailCache(Context context) {
@@ -101,7 +124,28 @@
}
public static UserIdManager getUserIdManager(Context context) {
- return ((DocumentsApplication) context.getApplicationContext()).mUserIdManager;
+ UserIdManager userIdManager =
+ ((DocumentsApplication) context.getApplicationContext()).mUserIdManager;
+ if (userIdManager == null) {
+ userIdManager = UserIdManager.create(context);
+ ((DocumentsApplication) context.getApplicationContext()).mUserIdManager = userIdManager;
+ }
+ return userIdManager;
+ }
+
+ /**
+ * UserManagerState class is used to maintain the list of userIds and other details like
+ * cross profile access, label and badge associated with these userIds.
+ */
+ public static UserManagerState getUserManagerState(Context context) {
+ UserManagerState userManagerState =
+ ((DocumentsApplication) context.getApplicationContext()).mUserManagerState;
+ if (userManagerState == null && getConfigStore(context).isPrivateSpaceInDocsUIEnabled()) {
+ userManagerState = UserManagerState.create(context);
+ ((DocumentsApplication) context.getApplicationContext()).mUserManagerState =
+ userManagerState;
+ }
+ return userManagerState;
}
public static DragAndDropManager getDragAndDropManager(Context context) {
@@ -112,6 +156,42 @@
return ((DocumentsApplication) context.getApplicationContext()).mFileTypeLookup;
}
+ /**
+ * Retrieve {@link ConfigStore} instance to access feature flags in production code.
+ */
+ public static synchronized ConfigStore getConfigStore(Context context) {
+ if (sConfigStore == null) {
+ sConfigStore = new ConfigStore.ConfigStoreImpl();
+ }
+ return sConfigStore;
+ }
+
+ /**
+ * Set {@link #mProviders} as null onDestroy of BaseActivity so that new session uses new
+ * instance of {@link #mProviders}
+ */
+ public static void invalidateProvidersCache(Context context) {
+ ((DocumentsApplication) context.getApplicationContext()).mProviders = null;
+ }
+
+ /**
+ * Set {@link #mUserManagerState} as null onDestroy of BaseActivity so that new session uses new
+ * instance of {@link #mUserManagerState}
+ */
+ public static void invalidateUserManagerState(Context context) {
+ ((DocumentsApplication) context.getApplicationContext()).mUserManagerState = null;
+ }
+
+ /**
+ * Set {@link #sConfigStore} as null onDestroy of BaseActivity so that new session uses new
+ * instance of {@link #sConfigStore}
+ */
+ public static void invalidateConfigStore() {
+ synchronized (DocumentsApplication.class) {
+ sConfigStore = null;
+ }
+ }
+
private void onApplyOverlayFinish(boolean result) {
Log.d(TAG, "OverlayManager.setEnabled() result: " + result);
}
@@ -120,6 +200,11 @@
@Override
public void onCreate() {
super.onCreate();
+ synchronized (DocumentsApplication.class) {
+ if (sConfigStore == null) {
+ sConfigStore = new ConfigStore.ConfigStoreImpl();
+ }
+ }
final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final OverlayManager om = getSystemService(OverlayManager.class);
@@ -132,9 +217,20 @@
Log.w(TAG, "Can't obtain OverlayManager from System Service!");
}
- mUserIdManager = UserIdManager.create(this);
+ if (getConfigStore(this).isPrivateSpaceInDocsUIEnabled()) {
+ mUserManagerState = UserManagerState.create(this);
+ mUserIdManager = null;
+ synchronized (DocumentsApplication.class) {
+ mProviders = new ProvidersCache(this, mUserManagerState, getConfigStore(this));
+ }
+ } else {
+ mUserManagerState = null;
+ mUserIdManager = UserIdManager.create(this);
+ synchronized (DocumentsApplication.class) {
+ mProviders = new ProvidersCache(this, mUserIdManager, getConfigStore(this));
+ }
+ }
- mProviders = new ProvidersCache(this, mUserIdManager);
mProviders.updateAsync(/* forceRefreshAll= */ false, /* callback= */ null);
mThumbnailCache = new ThumbnailCache(memoryClassBytes / 4);
@@ -159,11 +255,19 @@
localeFilter.addAction(Intent.ACTION_LOCALE_CHANGED);
registerReceiver(mCacheReceiver, localeFilter);
- final IntentFilter managedProfileFilter = new IntentFilter();
- for (String managedProfileAction : MANAGED_PROFILE_FILTER_ACTIONS) {
- managedProfileFilter.addAction(managedProfileAction);
+ if (SdkLevel.isAtLeastV()) {
+ PROFILE_FILTER_ACTIONS.addAll(Lists.newArrayList(
+ Intent.ACTION_PROFILE_ADDED,
+ Intent.ACTION_PROFILE_REMOVED,
+ Intent.ACTION_PROFILE_AVAILABLE,
+ Intent.ACTION_PROFILE_UNAVAILABLE
+ ));
}
- registerReceiver(mCacheReceiver, managedProfileFilter);
+ final IntentFilter profileFilter = new IntentFilter();
+ for (String profileAction : PROFILE_FILTER_ACTIONS) {
+ profileFilter.addAction(profileAction);
+ }
+ registerReceiver(mCacheReceiver, profileFilter);
SearchHistoryManager.getInstance(getApplicationContext());
}
@@ -183,9 +287,14 @@
if (PACKAGE_FILTER_ACTIONS.contains(action) && data != null) {
final String packageName = data.getSchemeSpecificPart();
mProviders.updatePackageAsync(UserId.DEFAULT_USER, packageName);
- } else if (MANAGED_PROFILE_FILTER_ACTIONS.contains(action)) {
+ } else if (PROFILE_FILTER_ACTIONS.contains(action)) {
// After we have reloaded roots. Resend the broadcast locally so the other
// components can reload properly after roots are updated.
+ if (getConfigStore(context).isPrivateSpaceInDocsUIEnabled()) {
+ UserHandle userHandle = intent.getParcelableExtra(Intent.EXTRA_USER);
+ UserId userId = UserId.of(userHandle);
+ getUserManagerState(context).onProfileActionStatusChange(action, userId);
+ }
mProviders.updateAsync(/* forceRefreshAll= */ true,
() -> LocalBroadcastManager.getInstance(context).sendBroadcast(intent));
} else {
diff --git a/src/com/android/documentsui/MultiRootDocumentsLoader.java b/src/com/android/documentsui/MultiRootDocumentsLoader.java
index 7668b06..f450814 100644
--- a/src/com/android/documentsui/MultiRootDocumentsLoader.java
+++ b/src/com/android/documentsui/MultiRootDocumentsLoader.java
@@ -196,11 +196,11 @@
final FilteringCursorWrapper filteredCursor =
new FilteringCursorWrapper(cursor) {
- @Override
- public void close() {
- // Ignored, since we manage cursor lifecycle internally
- }
- };
+ @Override
+ public void close() {
+ // Ignored, since we manage cursor lifecycle internally
+ }
+ };
filteredCursor.filterHiddenFiles(mState.showHiddenFiles);
filteredCursor.filterMimes(mState.acceptMimes, getRejectMimes());
filteredCursor.filterLastModified(rejectBefore);
diff --git a/src/com/android/documentsui/NavigationViewManager.java b/src/com/android/documentsui/NavigationViewManager.java
index a9dec9e..6727f1c 100644
--- a/src/com/android/documentsui/NavigationViewManager.java
+++ b/src/com/android/documentsui/NavigationViewManager.java
@@ -68,6 +68,7 @@
private final ViewOutlineProvider mDefaultOutlineProvider;
private final ViewOutlineProvider mSearchBarOutlineProvider;
private final boolean mShowSearchBar;
+ private final ConfigStore mConfigStore;
private boolean mIsActionModeActivated = false;
private @ColorRes int mDefaultStatusBarColorResId;
@@ -79,7 +80,35 @@
NavigationViewManager.Environment env,
Breadcrumb breadcrumb,
View tabLayoutContainer,
- UserIdManager userIdManager) {
+ UserIdManager userIdManager,
+ ConfigStore configStore) {
+ this(activity, drawer, state, env, breadcrumb, tabLayoutContainer, userIdManager, null,
+ configStore);
+ }
+
+ public NavigationViewManager(
+ BaseActivity activity,
+ DrawerController drawer,
+ State state,
+ NavigationViewManager.Environment env,
+ Breadcrumb breadcrumb,
+ View tabLayoutContainer,
+ UserManagerState userManagerState,
+ ConfigStore configStore) {
+ this(activity, drawer, state, env, breadcrumb, tabLayoutContainer, null, userManagerState,
+ configStore);
+ }
+
+ public NavigationViewManager(
+ BaseActivity activity,
+ DrawerController drawer,
+ State state,
+ NavigationViewManager.Environment env,
+ Breadcrumb breadcrumb,
+ View tabLayoutContainer,
+ UserIdManager userIdManager,
+ UserManagerState userManagerState,
+ ConfigStore configStore) {
mActivity = activity;
mToolbar = activity.findViewById(R.id.toolbar);
@@ -89,7 +118,9 @@
mEnv = env;
mBreadcrumb = breadcrumb;
mBreadcrumb.setup(env, state, this::onNavigationItemSelected);
- mProfileTabs = new ProfileTabs(tabLayoutContainer, mState, userIdManager, mEnv, activity);
+ mConfigStore = configStore;
+ mProfileTabs =
+ getProfileTabs(tabLayoutContainer, userIdManager, userManagerState, activity);
mToolbar.setNavigationOnClickListener(
new View.OnClickListener() {
@@ -128,6 +159,15 @@
};
}
+ private ProfileTabs getProfileTabs(View tabLayoutContainer, UserIdManager userIdManager,
+ UserManagerState userManagerState, BaseActivity activity) {
+ return mConfigStore.isPrivateSpaceInDocsUIEnabled()
+ ? new ProfileTabs(tabLayoutContainer, mState, userManagerState, mEnv, activity,
+ mConfigStore)
+ : new ProfileTabs(tabLayoutContainer, mState, userIdManager, mEnv, activity,
+ mConfigStore);
+ }
+
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int offset) {
if (!VersionUtils.isAtLeastS()) {
@@ -141,7 +181,8 @@
// move directory_header out of the AppBarLayout.
Window window = mActivity.getWindow();
- View actionBar = window.getDecorView().findViewById(R.id.action_mode_bar);
+ View actionBar =
+ window.getDecorView().findViewById(androidx.appcompat.R.id.action_mode_bar);
int dynamicHeaderColor = ContextCompat.getColor(mActivity,
offset == 0 ? mDefaultStatusBarColorResId : R.color.color_surface_header);
if (actionBar != null) {
diff --git a/src/com/android/documentsui/ProfileTabs.java b/src/com/android/documentsui/ProfileTabs.java
index 59a94e6..d096d59 100644
--- a/src/com/android/documentsui/ProfileTabs.java
+++ b/src/com/android/documentsui/ProfileTabs.java
@@ -23,6 +23,7 @@
import android.app.admin.DevicePolicyManager;
import android.os.Build;
+import android.os.UserManager;
import android.view.View;
import android.view.ViewGroup;
@@ -37,8 +38,10 @@
import com.google.android.material.tabs.TabLayout;
import com.google.common.base.Objects;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
/**
* A manager class to control UI on a {@link TabLayout} for cross-profile purpose.
@@ -51,7 +54,11 @@
private final State mState;
private final NavigationViewManager.Environment mEnv;
private final AbstractActionHandler.CommonAddons mCommonAddons;
+ @Nullable
private final UserIdManager mUserIdManager;
+ @Nullable
+ private final UserManagerState mUserManagerState;
+ private final ConfigStore mConfigStore;
private List<UserId> mUserIds;
@Nullable
private Listener mListener;
@@ -60,13 +67,32 @@
public ProfileTabs(View tabLayoutContainer, State state, UserIdManager userIdManager,
NavigationViewManager.Environment env,
- AbstractActionHandler.CommonAddons commonAddons) {
+ AbstractActionHandler.CommonAddons commonAddons, ConfigStore configStore) {
+ this(tabLayoutContainer, state, userIdManager, null, env, commonAddons, configStore);
+ }
+
+ public ProfileTabs(View tabLayoutContainer, State state, UserManagerState userManagerState,
+ NavigationViewManager.Environment env,
+ AbstractActionHandler.CommonAddons commonAddons, ConfigStore configStore) {
+ this(tabLayoutContainer, state, null, userManagerState, env, commonAddons, configStore);
+ }
+
+ public ProfileTabs(View tabLayoutContainer, State state, @Nullable UserIdManager userIdManager,
+ @Nullable UserManagerState userManagerState, NavigationViewManager.Environment env,
+ AbstractActionHandler.CommonAddons commonAddons, ConfigStore configStore) {
mTabsContainer = checkNotNull(tabLayoutContainer);
mTabs = tabLayoutContainer.findViewById(R.id.tabs);
mState = checkNotNull(state);
mEnv = checkNotNull(env);
mCommonAddons = checkNotNull(commonAddons);
- mUserIdManager = checkNotNull(userIdManager);
+ mConfigStore = configStore;
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ mUserIdManager = userIdManager;
+ mUserManagerState = checkNotNull(userManagerState);
+ } else {
+ mUserIdManager = checkNotNull(userIdManager);
+ mUserManagerState = userManagerState;
+ }
mTabs.removeAllTabs();
mUserIds = Collections.singletonList(UserId.CURRENT_USER);
mTabSeparator = tabLayoutContainer.findViewById(R.id.tab_separator);
@@ -92,7 +118,7 @@
}
/**
- * Update the tab layout based on conditions.
+ * Update the tab layout based on status of availability of the hidden profile.
*/
public void updateView() {
updateTabsIfNeeded();
@@ -102,21 +128,26 @@
// Update the layout according to the current root if necessary.
// Make sure we do not invoke callback. Otherwise, it is likely to cause infinite loop.
mTabs.removeOnTabSelectedListener(mOnTabSelectedListener);
- mTabs.selectTab(mTabs.getTabAt(mUserIds.indexOf(currentRoot.userId)));
- mTabs.addOnTabSelectedListener(mOnTabSelectedListener);
+ if (!mUserIds.contains(currentRoot.userId)) {
+ mTabs.addOnTabSelectedListener(mOnTabSelectedListener);
+ mTabs.selectTab(mTabs.getTabAt(mUserIds.indexOf(UserId.CURRENT_USER)));
+ } else {
+ mTabs.selectTab(mTabs.getTabAt(mUserIds.indexOf(currentRoot.userId)));
+ mTabs.addOnTabSelectedListener(mOnTabSelectedListener);
+ }
}
mTabsContainer.setVisibility(shouldShow() ? View.VISIBLE : View.GONE);
// Material next changes apply only for version S or greater
if (SdkLevel.isAtLeastS()) {
mTabSeparator.setVisibility(View.GONE);
- int tabContainerHeightInDp = (int)mTabsContainer.getContext().getResources().
- getDimension(R.dimen.tab_container_height);
+ int tabContainerHeightInDp = (int) mTabsContainer.getContext().getResources()
+ .getDimension(R.dimen.tab_container_height);
mTabsContainer.getLayoutParams().height = tabContainerHeightInDp;
ViewGroup.MarginLayoutParams tabContainerMarginLayoutParams =
- (ViewGroup.MarginLayoutParams) mTabsContainer.getLayoutParams();
- int tabContainerMarginTop = (int)mTabsContainer.getContext().getResources().
- getDimension(R.dimen.profile_tab_margin_top);
+ (ViewGroup.MarginLayoutParams) mTabsContainer.getLayoutParams();
+ int tabContainerMarginTop = (int) mTabsContainer.getContext().getResources()
+ .getDimension(R.dimen.profile_tab_margin_top);
tabContainerMarginLayoutParams.setMargins(0, tabContainerMarginTop, 0, 0);
mTabsContainer.requestLayout();
for (int i = 0; i < mTabs.getTabCount(); i++) {
@@ -127,11 +158,11 @@
// Get individual tab to set the style
ViewGroup.MarginLayoutParams marginLayoutParams =
(ViewGroup.MarginLayoutParams) tab.getLayoutParams();
- int tabMarginSide = (int)mTabsContainer.getContext().getResources().
- getDimension(R.dimen.profile_tab_margin_side);
+ int tabMarginSide = (int) mTabsContainer.getContext().getResources()
+ .getDimension(R.dimen.profile_tab_margin_side);
marginLayoutParams.setMargins(tabMarginSide, 0, tabMarginSide, 0);
- int tabHeightInDp = (int)mTabsContainer.getContext().getResources().
- getDimension(R.dimen.tab_height);
+ int tabHeightInDp = (int) mTabsContainer.getContext().getResources()
+ .getDimension(R.dimen.tab_height);
tab.getLayoutParams().height = tabHeightInDp;
tab.requestLayout();
tab.setBackgroundResource(R.drawable.tab_border_rounded);
@@ -145,25 +176,55 @@
}
private void updateTabsIfNeeded() {
- List<UserId> userIds = mUserIdManager.getUserIds();
+ List<UserId> userIds = getUserIds();
// Add tabs if the userIds is not equals to cached mUserIds.
// Given that mUserIds was initialized with only the current user, if getUserIds()
// returns just the current user, we don't need to do anything on the tab layout.
if (!userIds.equals(mUserIds)) {
- mUserIds = userIds;
+ mUserIds = new ArrayList<>();
+ mUserIds.addAll(userIds);
mTabs.removeAllTabs();
if (mUserIds.size() > 1) {
- // set setSelected to false otherwise it will trigger callback.
- mTabs.addTab(createTab(
- getEnterpriseString(PERSONAL_TAB, R.string.personal_tab),
- mUserIdManager.getSystemUser()), /* setSelected= */false);
- mTabs.addTab(createTab(
- getEnterpriseString(WORK_TAB, R.string.work_tab),
- mUserIdManager.getManagedUser()), /* setSelected= */false);
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ addTabsPrivateSpaceEnabled();
+ } else {
+ addTabsPrivateSpaceDisabled();
+ }
}
}
}
+ private List<UserId> getUserIds() {
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ assert mUserManagerState != null;
+ return mUserManagerState.getUserIds();
+ }
+ assert mUserIdManager != null;
+ return mUserIdManager.getUserIds();
+ }
+
+ private void addTabsPrivateSpaceEnabled() {
+ // set setSelected to false otherwise it will trigger callback.
+ assert mUserManagerState != null;
+ Map<UserId, String> userIdToLabelMap = mUserManagerState.getUserIdToLabelMap();
+ UserManager userManager = mTabsContainer.getContext().getSystemService(UserManager.class);
+ assert userManager != null;
+ for (UserId userId : mUserIds) {
+ mTabs.addTab(createTab(userIdToLabelMap.get(userId), userId), /* setSelected= */false);
+ }
+ }
+
+ private void addTabsPrivateSpaceDisabled() {
+ // set setSelected to false otherwise it will trigger callback.
+ assert mUserIdManager != null;
+ mTabs.addTab(createTab(
+ getEnterpriseString(PERSONAL_TAB, R.string.personal_tab),
+ mUserIdManager.getSystemUser()), /* setSelected= */false);
+ mTabs.addTab(createTab(
+ getEnterpriseString(WORK_TAB, R.string.work_tab),
+ mUserIdManager.getManagedUser()), /* setSelected= */false);
+ }
+
private String getEnterpriseString(String updatableStringId, int defaultStringId) {
if (SdkLevel.isAtLeastT()) {
return getUpdatableEnterpriseString(updatableStringId, defaultStringId);
diff --git a/src/com/android/documentsui/RecentsLoader.java b/src/com/android/documentsui/RecentsLoader.java
index 62ea6d0..b3cfa01 100644
--- a/src/com/android/documentsui/RecentsLoader.java
+++ b/src/com/android/documentsui/RecentsLoader.java
@@ -35,6 +35,7 @@
public class RecentsLoader extends MultiRootDocumentsLoader {
+ private static final String TAG = "RecentsLoader";
/** Ignore documents older than this age. */
private static final long REJECT_OLDER_THAN = 45 * DateUtils.DAY_IN_MILLIS;
diff --git a/src/com/android/documentsui/UserManagerState.java b/src/com/android/documentsui/UserManagerState.java
new file mode 100644
index 0000000..28a83e8
--- /dev/null
+++ b/src/com/android/documentsui/UserManagerState.java
@@ -0,0 +1,624 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.documentsui;
+
+import static androidx.core.util.Preconditions.checkNotNull;
+
+import static com.android.documentsui.DevicePolicyResources.Drawables.Style.SOLID_COLORED;
+import static com.android.documentsui.DevicePolicyResources.Drawables.WORK_PROFILE_ICON;
+import static com.android.documentsui.DevicePolicyResources.Strings.PERSONAL_TAB;
+import static com.android.documentsui.DevicePolicyResources.Strings.WORK_TAB;
+import static com.android.documentsui.base.SharedMinimal.DEBUG;
+
+import android.Manifest;
+import android.annotation.SuppressLint;
+import android.app.ActivityManager;
+import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.UserProperties;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.documentsui.base.Features;
+import com.android.documentsui.base.UserId;
+import com.android.documentsui.util.CrossProfileUtils;
+import com.android.documentsui.util.VersionUtils;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.common.base.Objects;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public interface UserManagerState {
+
+ /**
+ * Returns the {@link UserId} of each profile which should be queried for documents. This will
+ * always
+ * include {@link UserId#CURRENT_USER}.
+ */
+ List<UserId> getUserIds();
+
+ /**
+ * Returns mapping between the {@link UserId} and the label for the profile
+ */
+ Map<UserId, String> getUserIdToLabelMap();
+
+ /**
+ * Returns mapping between the {@link UserId} and the drawable badge for the profile
+ *
+ * returns {@code null} for non-profile userId
+ */
+ Map<UserId, Drawable> getUserIdToBadgeMap();
+
+ /**
+ * Returns a map of {@link UserId} to boolean value indicating whether
+ * the {@link UserId}.CURRENT_USER can forward {@link Intent} to that {@link UserId}
+ */
+ Map<UserId, Boolean> getCanForwardToProfileIdMap(Intent intent);
+
+ /**
+ * Updates the state of the list of userIds and all the associated maps according the intent
+ * received in broadcast
+ *
+ * @param userId {@link UserId} for the profile for which the availability status changed
+ * @param action {@link Intent}.ACTION_PROFILE_UNAVAILABLE or
+ * {@link Intent}.ACTION_PROFILE_AVAILABLE
+ */
+ void onProfileActionStatusChange(String action, UserId userId);
+
+ /**
+ * Creates an implementation of {@link UserManagerState}.
+ */
+ // TODO: b/314746383 Make this class a singleton
+ static UserManagerState create(Context context) {
+ return new RuntimeUserManagerState(context);
+ }
+
+ /**
+ * Implementation of {@link UserManagerState}
+ */
+ final class RuntimeUserManagerState implements UserManagerState {
+
+ private static final String TAG = "UserManagerState";
+ private final Context mContext;
+ private final UserId mCurrentUser;
+ private final boolean mIsDeviceSupported;
+ private final UserManager mUserManager;
+ private final ConfigStore mConfigStore;
+ /**
+ * List of all the {@link UserId} that have the {@link UserProperties.ShowInSharingSurfaces}
+ * set as `SHOW_IN_SHARING_SURFACES_SEPARATE` OR it is a system/personal user
+ */
+ @GuardedBy("mUserIds")
+ private final List<UserId> mUserIds = new ArrayList<>();
+ /**
+ * Mapping between the {@link UserId} to the corresponding profile label
+ */
+ @GuardedBy("mUserIdToLabelMap")
+ private final Map<UserId, String> mUserIdToLabelMap = new HashMap<>();
+ /**
+ * Mapping between the {@link UserId} to the corresponding profile badge
+ */
+ @GuardedBy("mUserIdToBadgeMap")
+ private final Map<UserId, Drawable> mUserIdToBadgeMap = new HashMap<>();
+ /**
+ * Map containing {@link UserId}, other than that of the current user, as key and boolean
+ * denoting whether it is accessible by the current user or not as value
+ */
+ @GuardedBy("mCanFrowardToProfileIdMap")
+ private final Map<UserId, Boolean> mCanFrowardToProfileIdMap = new HashMap<>();
+
+
+ private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ synchronized (mUserIds) {
+ mUserIds.clear();
+ }
+ synchronized (mUserIdToLabelMap) {
+ mUserIdToLabelMap.clear();
+ }
+ synchronized (mUserIdToBadgeMap) {
+ mUserIdToBadgeMap.clear();
+ }
+ synchronized (mCanFrowardToProfileIdMap) {
+ mCanFrowardToProfileIdMap.clear();
+ }
+ }
+ };
+
+
+ private RuntimeUserManagerState(Context context) {
+ this(context, UserId.CURRENT_USER,
+ Features.CROSS_PROFILE_TABS && isDeviceSupported(context),
+ DocumentsApplication.getConfigStore(context));
+ }
+
+ @VisibleForTesting
+ RuntimeUserManagerState(Context context, UserId currentUser, boolean isDeviceSupported,
+ ConfigStore configStore) {
+ mContext = context.getApplicationContext();
+ mCurrentUser = checkNotNull(currentUser);
+ mIsDeviceSupported = isDeviceSupported;
+ mUserManager = mContext.getSystemService(UserManager.class);
+ mConfigStore = configStore;
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
+ filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
+ if (SdkLevel.isAtLeastV() && mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ filter.addAction(Intent.ACTION_PROFILE_ADDED);
+ filter.addAction(Intent.ACTION_PROFILE_REMOVED);
+ }
+ mContext.registerReceiver(mIntentReceiver, filter);
+ }
+
+ @Override
+ public List<UserId> getUserIds() {
+ synchronized (mUserIds) {
+ if (mUserIds.isEmpty()) {
+ Log.d("profileAction", "user ids empty");
+ mUserIds.addAll(getUserIdsInternal());
+ }
+ return mUserIds;
+ }
+ }
+
+ @Override
+ public Map<UserId, String> getUserIdToLabelMap() {
+ synchronized (mUserIdToLabelMap) {
+ if (mUserIdToLabelMap.isEmpty()) {
+ getUserIdToLabelMapInternal();
+ }
+ return mUserIdToLabelMap;
+ }
+ }
+
+ @Override
+ public Map<UserId, Drawable> getUserIdToBadgeMap() {
+ synchronized (mUserIdToBadgeMap) {
+ if (mUserIdToBadgeMap.isEmpty()) {
+ getUserIdToBadgeMapInternal();
+ }
+ return mUserIdToBadgeMap;
+ }
+ }
+
+ @Override
+ public Map<UserId, Boolean> getCanForwardToProfileIdMap(Intent intent) {
+ synchronized (mCanFrowardToProfileIdMap) {
+ if (mCanFrowardToProfileIdMap.isEmpty()) {
+ getCanForwardToProfileIdMapInternal(intent);
+ }
+ return mCanFrowardToProfileIdMap;
+ }
+ }
+
+ @Override
+ @SuppressLint("NewApi")
+ public void onProfileActionStatusChange(String action, UserId userId) {
+ UserProperties userProperties = mUserManager.getUserProperties(
+ UserHandle.of(userId.getIdentifier()));
+ if (userProperties.getShowInQuietMode() != UserProperties.SHOW_IN_QUIET_MODE_HIDDEN) {
+ return;
+ }
+ if (Intent.ACTION_PROFILE_UNAVAILABLE.equals(action)) {
+ synchronized (mUserIds) {
+ mUserIds.remove(userId);
+ }
+ synchronized (mUserIdToLabelMap) {
+ mUserIdToLabelMap.remove(userId);
+ }
+ synchronized (mUserIdToBadgeMap) {
+ mUserIdToBadgeMap.remove(userId);
+ }
+ synchronized (mCanFrowardToProfileIdMap) {
+ mCanFrowardToProfileIdMap.remove(userId);
+ }
+ } else if (Intent.ACTION_PROFILE_AVAILABLE.equals(action)) {
+ synchronized (mUserIds) {
+ if (!mUserIds.contains(userId)) {
+ mUserIds.add(userId);
+ }
+ }
+ synchronized (mUserIdToLabelMap) {
+ mUserIdToLabelMap.put(userId, getProfileLabel(userId));
+ }
+ synchronized (mUserIdToBadgeMap) {
+ mUserIdToBadgeMap.put(userId, getProfileBadge(userId));
+ }
+ synchronized (mCanFrowardToProfileIdMap) {
+ mCanFrowardToProfileIdMap.put(userId, true);
+ }
+ } else {
+ Log.e(TAG, "Unexpected action received: " + action);
+ }
+ }
+
+ private List<UserId> getUserIdsInternal() {
+ final List<UserId> result = new ArrayList<>();
+
+ if (!mIsDeviceSupported) {
+ result.add(mCurrentUser);
+ return result;
+ }
+
+ if (mUserManager == null) {
+ Log.e(TAG, "cannot obtain user manager");
+ result.add(mCurrentUser);
+ return result;
+ }
+
+ final List<UserHandle> userProfiles = mUserManager.getUserProfiles();
+ if (userProfiles.size() < 2) {
+ result.add(mCurrentUser);
+ return result;
+ }
+
+ if (SdkLevel.isAtLeastV()) {
+ getUserIdsInternalPostV(userProfiles, result);
+ } else {
+ getUserIdsInternalPreV(userProfiles, result);
+ }
+ return result;
+ }
+
+ @SuppressLint("NewApi")
+ private void getUserIdsInternalPostV(List<UserHandle> userProfiles, List<UserId> result) {
+ for (UserHandle userHandle : userProfiles) {
+ if (userHandle.getIdentifier() == ActivityManager.getCurrentUser()) {
+ result.add(UserId.of(userHandle));
+ } else {
+ // Out of all the profiles returned by user manager the profiles that are
+ // returned should satisfy both the following conditions:
+ // 1. It has user property SHOW_IN_SHARING_SURFACES_SEPARATE
+ // 2. Quite mode is not enabled, if it is enabled then the profile's user
+ // property is not SHOW_IN_QUIET_MODE_HIDDEN
+ if (isProfileAllowed(userHandle)) {
+ result.add(UserId.of(userHandle));
+ }
+ }
+ }
+ if (result.isEmpty()) {
+ result.add(mCurrentUser);
+ }
+ }
+
+ @SuppressLint("NewApi")
+ private boolean isProfileAllowed(UserHandle userHandle) {
+ final UserProperties userProperties =
+ mUserManager.getUserProperties(userHandle);
+ if (userProperties.getShowInSharingSurfaces()
+ == UserProperties.SHOW_IN_SHARING_SURFACES_SEPARATE) {
+ return !UserId.of(userHandle).isQuietModeEnabled(mContext)
+ || userProperties.getShowInQuietMode()
+ != UserProperties.SHOW_IN_QUIET_MODE_HIDDEN;
+ }
+ return false;
+ }
+
+ private void getUserIdsInternalPreV(List<UserHandle> userProfiles, List<UserId> result) {
+ result.add(mCurrentUser);
+ UserId systemUser = null;
+ UserId managedUser = null;
+ for (UserHandle userHandle : userProfiles) {
+ if (userHandle.isSystem()) {
+ systemUser = UserId.of(userHandle);
+ } else if (mUserManager.isManagedProfile(userHandle.getIdentifier())) {
+ managedUser = UserId.of(userHandle);
+ }
+ }
+ if (mCurrentUser.isSystem() && managedUser != null) {
+ result.add(managedUser);
+ } else if (mCurrentUser.isManagedProfile(mUserManager) && systemUser != null) {
+ result.add(0, systemUser);
+ } else {
+ if (DEBUG) {
+ Log.w(TAG, "The current user " + UserId.CURRENT_USER
+ + " is neither system nor managed user. has system user: "
+ + (systemUser != null));
+ }
+ }
+ }
+
+ private void getUserIdToLabelMapInternal() {
+ if (SdkLevel.isAtLeastV()) {
+ getUserIdToLabelMapInternalPostV();
+ } else {
+ getUserIdToLabelMapInternalPreV();
+ }
+ }
+
+ @SuppressLint("NewApi")
+ private void getUserIdToLabelMapInternalPostV() {
+ if (mUserManager == null) {
+ Log.e(TAG, "cannot obtain user manager");
+ return;
+ }
+ List<UserId> userIds = getUserIds();
+ for (UserId userId : userIds) {
+ synchronized (mUserIdToLabelMap) {
+ mUserIdToLabelMap.put(userId, getProfileLabel(userId));
+ }
+ }
+ }
+
+ private void getUserIdToLabelMapInternalPreV() {
+ if (mUserManager == null) {
+ Log.e(TAG, "cannot obtain user manager");
+ return;
+ }
+ List<UserId> userIds = getUserIds();
+ for (UserId userId : userIds) {
+ if (mUserManager.isManagedProfile(userId.getIdentifier())) {
+ synchronized (mUserIdToLabelMap) {
+ mUserIdToLabelMap.put(userId,
+ getEnterpriseString(WORK_TAB, R.string.work_tab));
+ }
+ } else {
+ synchronized (mUserIdToLabelMap) {
+ mUserIdToLabelMap.put(userId,
+ getEnterpriseString(PERSONAL_TAB, R.string.personal_tab));
+ }
+ }
+ }
+ }
+
+ @SuppressLint("NewApi")
+ private String getProfileLabel(UserId userId) {
+ if (userId.getIdentifier() == ActivityManager.getCurrentUser()) {
+ return getEnterpriseString(PERSONAL_TAB, R.string.personal_tab);
+ }
+ try {
+ Context userContext = mContext.createContextAsUser(
+ UserHandle.of(userId.getIdentifier()), 0 /* flags */);
+ UserManager userManagerAsUser = userContext.getSystemService(UserManager.class);
+ if (userManagerAsUser == null) {
+ Log.e(TAG, "cannot obtain user manager");
+ return null;
+ }
+ return userManagerAsUser.getProfileLabel();
+ } catch (Exception e) {
+ Log.e(TAG, "Exception occurred while trying to get profile label:\n" + e);
+ return null;
+ }
+ }
+
+ private String getEnterpriseString(String updatableStringId, int defaultStringId) {
+ if (SdkLevel.isAtLeastT()) {
+ return getUpdatableEnterpriseString(updatableStringId, defaultStringId);
+ } else {
+ return mContext.getString(defaultStringId);
+ }
+ }
+
+ @RequiresApi(Build.VERSION_CODES.TIRAMISU)
+ private String getUpdatableEnterpriseString(String updatableStringId, int defaultStringId) {
+ DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
+ if (Objects.equal(dpm, null)) {
+ Log.e(TAG, "can not get device policy manager");
+ return mContext.getString(defaultStringId);
+ }
+ return dpm.getResources().getString(
+ updatableStringId,
+ () -> mContext.getString(defaultStringId));
+ }
+
+ private void getUserIdToBadgeMapInternal() {
+ if (SdkLevel.isAtLeastV()) {
+ getUserIdToBadgeMapInternalPostV();
+ } else {
+ getUserIdToBadgeMapInternalPreV();
+ }
+ }
+
+ @SuppressLint("NewApi")
+ private void getUserIdToBadgeMapInternalPostV() {
+ if (mUserManager == null) {
+ Log.e(TAG, "cannot obtain user manager");
+ return;
+ }
+ List<UserId> userIds = getUserIds();
+ for (UserId userId : userIds) {
+ synchronized (mUserIdToBadgeMap) {
+ mUserIdToBadgeMap.put(userId, getProfileBadge(userId));
+ }
+ }
+ }
+
+ private void getUserIdToBadgeMapInternalPreV() {
+ if (!SdkLevel.isAtLeastR()) return;
+ if (mUserManager == null) {
+ Log.e(TAG, "cannot obtain user manager");
+ return;
+ }
+ List<UserId> userIds = getUserIds();
+ for (UserId userId : userIds) {
+ if (mUserManager.isManagedProfile(userId.getIdentifier())) {
+ synchronized (mUserIdToBadgeMap) {
+ mUserIdToBadgeMap.put(userId,
+ SdkLevel.isAtLeastT() ? getWorkProfileBadge()
+ : mContext.getDrawable(R.drawable.ic_briefcase));
+ }
+ }
+ }
+ }
+
+ @SuppressLint("NewApi")
+ private Drawable getProfileBadge(UserId userId) {
+ if (userId.getIdentifier() == ActivityManager.getCurrentUser()) {
+ return null;
+ }
+ try {
+ Context userContext = mContext.createContextAsUser(
+ UserHandle.of(userId.getIdentifier()), 0 /* flags */);
+ UserManager userManagerAsUser = userContext.getSystemService(UserManager.class);
+ if (userManagerAsUser == null) {
+ Log.e(TAG, "cannot obtain user manager");
+ return null;
+ }
+ return userManagerAsUser.getUserBadge();
+ } catch (Exception e) {
+ Log.e(TAG, "Exception occurred while trying to get profile badge:\n" + e);
+ return null;
+ }
+ }
+
+ @RequiresApi(Build.VERSION_CODES.TIRAMISU)
+ private Drawable getWorkProfileBadge() {
+ DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
+ Drawable drawable = dpm.getResources().getDrawable(WORK_PROFILE_ICON, SOLID_COLORED,
+ () ->
+ mContext.getDrawable(R.drawable.ic_briefcase));
+ return drawable;
+ }
+
+ private void getCanForwardToProfileIdMapInternal(Intent intent) {
+ // Versions less than V will not have the user properties required to determine whether
+ // cross profile check is delegated from parent or not
+ if (!SdkLevel.isAtLeastV()) {
+ getCanForwardToProfileIdMapPreV(intent);
+ return;
+ }
+ if (mUserManager == null) {
+ Log.e(TAG, "can not get user manager");
+ return;
+ }
+
+ List<UserId> parentOrDelegatedFromParent = new ArrayList<>();
+ List<UserId> canForwardToProfileIds = new ArrayList<>();
+ List<UserId> noDelegation = new ArrayList<>();
+
+ List<UserId> userIds = getUserIds();
+ for (UserId userId : userIds) {
+ final UserHandle userHandle = UserHandle.of(userId.getIdentifier());
+ // Parent (personal) profile and all the child profiles that delegate cross profile
+ // content sharing check to parent can share among each other
+ if (userId.getIdentifier() == ActivityManager.getCurrentUser()
+ || isCrossProfileContentSharingStrategyDelegatedFromParent(userHandle)) {
+ parentOrDelegatedFromParent.add(userId);
+ } else {
+ noDelegation.add(userId);
+ }
+ }
+
+ if (noDelegation.size() > 1) {
+ Log.e(TAG, "There cannot be more than one profile delegating cross profile "
+ + "content sharing check from self.");
+ }
+
+ /*
+ * Cross profile resolve info need to be checked in the following 2 cases:
+ * 1. current user is either parent or delegates check to parent and the target user
+ * does
+ * not delegate to parent
+ * 2. current user does not delegate check to the parent and the target user is the
+ * parent profile
+ */
+ UserId needToCheck = null;
+ if (parentOrDelegatedFromParent.contains(mCurrentUser)
+ && !noDelegation.isEmpty()) {
+ needToCheck = noDelegation.get(0);
+ } else if (mCurrentUser.getIdentifier() != ActivityManager.getCurrentUser()) {
+ final UserHandle parentProfile = mUserManager.getProfileParent(
+ UserHandle.of(mCurrentUser.getIdentifier()));
+ needToCheck = UserId.of(parentProfile);
+ }
+
+ if (needToCheck != null && CrossProfileUtils.getCrossProfileResolveInfo(mCurrentUser,
+ mContext.getPackageManager(), intent, mContext,
+ mConfigStore.isPrivateSpaceInDocsUIEnabled()) != null) {
+ if (parentOrDelegatedFromParent.contains(needToCheck)) {
+ canForwardToProfileIds.addAll(parentOrDelegatedFromParent);
+ } else {
+ canForwardToProfileIds.add(needToCheck);
+ }
+ }
+
+ if (parentOrDelegatedFromParent.contains(mCurrentUser)) {
+ canForwardToProfileIds.addAll(parentOrDelegatedFromParent);
+ }
+
+ for (UserId userId : userIds) {
+ synchronized (mCanFrowardToProfileIdMap) {
+ if (userId.equals(mCurrentUser)) {
+ mCanFrowardToProfileIdMap.put(userId, true);
+ continue;
+ }
+ mCanFrowardToProfileIdMap.put(userId, canForwardToProfileIds.contains(userId));
+ }
+ }
+ }
+
+ @SuppressLint("NewApi")
+ private boolean isCrossProfileContentSharingStrategyDelegatedFromParent(
+ UserHandle userHandle) {
+ if (mUserManager == null) {
+ Log.e(TAG, "can not obtain user manager");
+ return false;
+ }
+ UserProperties userProperties = mUserManager.getUserProperties(userHandle);
+ if (java.util.Objects.equals(userProperties, null)) {
+ Log.e(TAG, "can not obtain user properties");
+ return false;
+ }
+
+ return userProperties.getCrossProfileContentSharingStrategy()
+ == UserProperties.CROSS_PROFILE_CONTENT_SHARING_DELEGATE_FROM_PARENT;
+ }
+
+ private void getCanForwardToProfileIdMapPreV(Intent intent) {
+ // There only two profiles pre V
+ List<UserId> userIds = getUserIds();
+ for (UserId userId : userIds) {
+ synchronized (mCanFrowardToProfileIdMap) {
+ if (mCurrentUser.equals(userId)) {
+ mCanFrowardToProfileIdMap.put(userId, true);
+ } else {
+ mCanFrowardToProfileIdMap.put(userId,
+ CrossProfileUtils.getCrossProfileResolveInfo(
+ mCurrentUser, mContext.getPackageManager(), intent,
+ mContext, mConfigStore.isPrivateSpaceInDocsUIEnabled())
+ != null);
+ }
+ }
+ }
+ }
+
+ private static boolean isDeviceSupported(Context context) {
+ // The feature requires Android R DocumentsContract APIs and INTERACT_ACROSS_USERS_FULL
+ // permission.
+ return VersionUtils.isAtLeastR()
+ && context.checkSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+ }
+}
diff --git a/src/com/android/documentsui/base/State.java b/src/com/android/documentsui/base/State.java
index cff5ce4..aa11f6f 100644
--- a/src/com/android/documentsui/base/State.java
+++ b/src/com/android/documentsui/base/State.java
@@ -23,6 +23,7 @@
import androidx.annotation.IntDef;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.services.FileOperationService;
import com.android.documentsui.services.FileOperationService.OpType;
import com.android.documentsui.sorting.SortModel;
@@ -33,6 +34,7 @@
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
public class State implements android.os.Parcelable {
@@ -47,7 +49,9 @@
ACTION_OPEN_TREE
})
@Retention(RetentionPolicy.SOURCE)
- public @interface ActionType {}
+ public @interface ActionType {
+ }
+
// File manager and related private picking activity.
public static final int ACTION_BROWSE = 1;
public static final int ACTION_PICK_COPY_DESTINATION = 2;
@@ -63,7 +67,9 @@
MODE_GRID
})
@Retention(RetentionPolicy.SOURCE)
- public @interface ViewMode {}
+ public @interface ViewMode {
+ }
+
public static final int MODE_UNKNOWN = 0;
public static final int MODE_LIST = 1;
public static final int MODE_GRID = 2;
@@ -85,6 +91,7 @@
public boolean openableOnly;
public boolean restrictScopeStorage;
public boolean showHiddenFiles;
+ public ConfigStore configStore;
/**
* Represents whether the state supports cross-profile file picking.
@@ -100,10 +107,19 @@
* Returns true if we are allowed to interact with the user.
*/
public boolean canInteractWith(UserId userId) {
+ if (configStore.isPrivateSpaceInDocsUIEnabled()) {
+ return canForwardToProfileIdMap.getOrDefault(userId, false);
+ }
return canShareAcrossProfile || UserId.CURRENT_USER.equals(userId);
}
/**
+ * Represents whether the intent can be forwarded to the {@link UserId} in the map
+ */
+ public Map<UserId, Boolean> canForwardToProfileIdMap = new HashMap<>();
+
+
+ /**
* This is basically a sub-type for the copy operation. It can be either COPY,
* COMPRESS, EXTRACT or MOVE.
* The only legal values, if set, are: OPERATION_COPY, OPERATION_COMPRESS,
@@ -125,12 +141,13 @@
if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
} else {
- acceptMimes = new String[] { defaultAcceptMimeType };
+ acceptMimes = new String[]{defaultAcceptMimeType};
}
}
/**
* Check current action should have preview function or not.
+ *
* @return True, if the action should have preview.
*/
public boolean shouldShowPreview() {
@@ -141,6 +158,7 @@
/**
* Check the action is file picking and acceptMimes are all images type or not.
+ *
* @return True, if acceptMimes are all image type and action is file picking.
*/
public boolean isPhotoPicking() {
diff --git a/src/com/android/documentsui/base/UserId.java b/src/com/android/documentsui/base/UserId.java
index 642ebe6..2184291 100644
--- a/src/com/android/documentsui/base/UserId.java
+++ b/src/com/android/documentsui/base/UserId.java
@@ -149,8 +149,8 @@
* Returns true if the this user is in quiet mode.
*/
public boolean isQuietModeEnabled(Context context) {
- final UserManager userManager =
- (UserManager) context.getSystemService(Context.USER_SERVICE);
+ final UserManager userManager = context.getSystemService(UserManager.class);
+ assert userManager != null;
return userManager.isQuietModeEnabled(mUserHandle);
}
diff --git a/src/com/android/documentsui/dirlist/AppsRowManager.java b/src/com/android/documentsui/dirlist/AppsRowManager.java
index 60138f6..092d5ec 100644
--- a/src/com/android/documentsui/dirlist/AppsRowManager.java
+++ b/src/com/android/documentsui/dirlist/AppsRowManager.java
@@ -16,7 +16,6 @@
package com.android.documentsui.dirlist;
-import android.os.UserManager;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -26,8 +25,10 @@
import com.android.documentsui.ActionHandler;
import com.android.documentsui.BaseActivity;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.R;
import com.android.documentsui.UserIdManager;
+import com.android.documentsui.UserManagerState;
import com.android.documentsui.base.State;
import com.android.documentsui.base.UserId;
import com.android.documentsui.dirlist.AppsRowItemData.AppData;
@@ -50,13 +51,27 @@
private final List<AppsRowItemData> mDataList;
private final boolean mMaybeShowBadge;
private final UserIdManager mUserIdManager;
+ private final UserManagerState mUserManagerState;
+ private final ConfigStore mConfigStore;
public AppsRowManager(ActionHandler handler, boolean maybeShowBadge,
- UserIdManager userIdManager) {
+ UserIdManager userIdManager, ConfigStore configStore) {
mDataList = new ArrayList<>();
mActionHandler = handler;
mMaybeShowBadge = maybeShowBadge;
mUserIdManager = userIdManager;
+ mUserManagerState = null;
+ mConfigStore = configStore;
+ }
+
+ public AppsRowManager(ActionHandler handler, boolean maybeShowBadge,
+ UserManagerState userManagerState, ConfigStore configStore) {
+ mDataList = new ArrayList<>();
+ mActionHandler = handler;
+ mMaybeShowBadge = maybeShowBadge;
+ mUserIdManager = null;
+ mUserManagerState = userManagerState;
+ mConfigStore = configStore;
}
public List<AppsRowItemData> updateList(List<Item> itemList) {
@@ -89,7 +104,7 @@
boolean isHiddenAction = state.action == State.ACTION_CREATE
|| state.action == State.ACTION_OPEN_TREE
|| state.action == State.ACTION_PICK_COPY_DESTINATION;
- boolean isSearchExpandedAcrossProfile = mUserIdManager.getUserIds().size() > 1
+ boolean isSearchExpandedAcrossProfile = getUserIds().size() > 1
&& state.supportsCrossProfile()
&& isSearchExpanded;
@@ -134,4 +149,11 @@
summary.setVisibility(data.getSummary() != null ? View.VISIBLE : View.GONE);
view.setOnClickListener(v -> data.onClicked());
}
+
+ private List<UserId> getUserIds() {
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ return mUserManagerState.getUserIds();
+ }
+ return mUserIdManager.getUserIds();
+ }
}
diff --git a/src/com/android/documentsui/dirlist/DirectoryAddonsAdapter.java b/src/com/android/documentsui/dirlist/DirectoryAddonsAdapter.java
index 7bccbac..8989853 100644
--- a/src/com/android/documentsui/dirlist/DirectoryAddonsAdapter.java
+++ b/src/com/android/documentsui/dirlist/DirectoryAddonsAdapter.java
@@ -16,19 +16,24 @@
package com.android.documentsui.dirlist;
+import android.os.UserManager;
import android.view.ViewGroup;
+import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.Model;
import com.android.documentsui.Model.Update;
import com.android.documentsui.base.EventListener;
import com.android.documentsui.base.State;
+import com.android.documentsui.base.UserId;
import com.android.documentsui.dirlist.Message.HeaderMessage;
import com.android.documentsui.dirlist.Message.InflateMessage;
import java.util.List;
+import java.util.Map;
/**
* Adapter wrapper that embellishes the directory list by inserting Holder views inbetween
@@ -47,14 +52,30 @@
// now.
private final Message mHeaderMessage;
private final Message mInflateMessage;
+ private final ConfigStore mConfigStore;
- DirectoryAddonsAdapter(Environment environment, DocumentsAdapter delegate) {
+ DirectoryAddonsAdapter(Environment environment, DocumentsAdapter delegate,
+ ConfigStore configStore) {
+ this(environment, delegate, null, null, null, null, configStore);
+ }
+
+ DirectoryAddonsAdapter(Environment environment, DocumentsAdapter delegate,
+ @Nullable UserId sourceUserId, @Nullable UserId selectedUserId,
+ @Nullable Map<UserId, String> userIdLabelMap, @Nullable UserManager userManager,
+ ConfigStore configStore) {
mEnv = environment;
mDelegate = delegate;
+ mConfigStore = configStore;
// TODO: We should not instantiate the messages here, but rather instantiate them
// when we get an update event.
- mHeaderMessage = new HeaderMessage(environment, this::onDismissHeaderMessage);
- mInflateMessage = new InflateMessage(environment, this::onDismissHeaderMessage);
+ mHeaderMessage = new HeaderMessage(environment, this::onDismissHeaderMessage, mConfigStore);
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ mInflateMessage = new InflateMessage(environment, this::onDismissHeaderMessage,
+ sourceUserId, selectedUserId, userIdLabelMap, userManager, mConfigStore);
+ } else {
+ mInflateMessage = new InflateMessage(environment, this::onDismissHeaderMessage,
+ mConfigStore);
+ }
// Relay events published by our delegate to our listeners (presumably RecyclerView)
// with adjusted positions.
@@ -98,15 +119,15 @@
DocumentHolder holder = null;
switch (viewType) {
case ITEM_TYPE_SECTION_BREAK:
- holder = new TransparentDividerDocumentHolder(mEnv.getContext());
+ holder = new TransparentDividerDocumentHolder(mEnv.getContext(), mConfigStore);
mEnv.initDocumentHolder(holder);
break;
case ITEM_TYPE_HEADER_MESSAGE:
- holder = new HeaderMessageDocumentHolder(mEnv.getContext(), parent);
+ holder = new HeaderMessageDocumentHolder(mEnv.getContext(), parent, mConfigStore);
mEnv.initDocumentHolder(holder);
break;
case ITEM_TYPE_INFLATED_MESSAGE:
- holder = new InflateMessageDocumentHolder(mEnv.getContext(), parent);
+ holder = new InflateMessageDocumentHolder(mEnv.getContext(), parent, mConfigStore);
mEnv.initDocumentHolder(holder);
break;
default:
@@ -295,13 +316,13 @@
@Override
public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
- assert(itemCount == 1);
+ assert (itemCount == 1);
notifyItemRangeChanged(toViewPosition(positionStart), itemCount, payload);
}
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
- assert(itemCount == 1);
+ assert (itemCount == 1);
if (positionStart < mBreakPosition) {
mBreakPosition++;
}
@@ -310,7 +331,7 @@
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
- assert(itemCount == 1);
+ assert (itemCount == 1);
if (positionStart < mBreakPosition) {
mBreakPosition--;
}
diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java
index 4444a9c..32f3683 100644
--- a/src/com/android/documentsui/dirlist/DirectoryFragment.java
+++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java
@@ -28,6 +28,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.UserProperties;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
@@ -35,6 +36,7 @@
import android.os.Looper;
import android.os.Parcelable;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.util.Log;
@@ -111,6 +113,7 @@
import com.android.documentsui.sorting.SortDimension;
import com.android.documentsui.sorting.SortModel;
import com.android.documentsui.util.VersionUtils;
+import com.android.modules.utils.build.SdkLevel;
import com.google.common.base.Objects;
@@ -132,7 +135,8 @@
REQUEST_COPY_DESTINATION
})
@Retention(RetentionPolicy.SOURCE)
- public @interface RequestCode {}
+ public @interface RequestCode {
+ }
public static final int REQUEST_COPY_DESTINATION = 1;
@@ -236,33 +240,91 @@
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
- if (isManagedProfileAction(action)) {
- UserHandle userHandle = intent.getParcelableExtra(Intent.EXTRA_USER);
- UserId userId = UserId.of(userHandle);
+ if (SdkLevel.isAtLeastV()
+ && mState.configStore.isPrivateSpaceInDocsUIEnabled()) {
+ profileStatusReceiverPostV(intent, action);
+ } else {
+ profileStatusReceiverPreV(intent, action);
+ }
+
+ }
+
+ private void profileStatusReceiverPostV(Intent intent, String action) {
+ if (!SdkLevel.isAtLeastV()) return;
+ if (!isProfileStatusAction(action)) return;
+ UserHandle userHandle = intent.getParcelableExtra(Intent.EXTRA_USER);
+ UserId userId = UserId.of(userHandle);
+ UserManager userManager = mActivity.getSystemService(UserManager.class);
+ if (userManager == null) {
+ Log.e(TAG, "cannot obtain user manager");
+ return;
+ }
+ UserProperties userProperties = userManager.getUserProperties(userHandle);
+ if (userProperties.getShowInQuietMode()
+ == UserProperties.SHOW_IN_QUIET_MODE_PAUSED) {
if (Objects.equal(mActivity.getSelectedUser(), userId)) {
// We only need to refresh the layout when the selected user is equal to the
// received profile user.
- if (Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) {
- // If the managed profile is turned off, we need to refresh the directory
- // to update the UI to show an appropriate error message.
- if (mProviderTestRunnable != null) {
- mHandler.removeCallbacks(mProviderTestRunnable);
- mProviderTestRunnable = null;
- }
- onRefresh();
- return;
- }
-
- // When the managed profile becomes available, the provider may not be available
- // immediately, we need to check if it is ready before we reload the content.
- if (Intent.ACTION_MANAGED_PROFILE_UNLOCKED.equals(action)) {
- checkUriAndScheduleCheckIfNeeded(userId);
- }
+ onPausedProfileStatusChange(action, userId);
}
+ return;
+ }
+ if (userProperties.getShowInQuietMode()
+ == UserProperties.SHOW_IN_QUIET_MODE_HIDDEN) {
+ onHiddenProfileStatusChange(action, userId);
+ }
+ }
+
+ private void profileStatusReceiverPreV(Intent intent, String action) {
+ if (!isManagedProfileAction(action)) return;
+ UserHandle userHandle = intent.getParcelableExtra(Intent.EXTRA_USER);
+ UserId userId = UserId.of(userHandle);
+ if (Objects.equal(mActivity.getSelectedUser(), userId)) {
+ // We only need to refresh the layout when the selected user is equal to the
+ // received profile user.
+ onPausedProfileStatusChange(action, userId);
}
}
};
+ private void onPausedProfileStatusChange(String action, UserId userId) {
+ if (Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)
+ || (SdkLevel.isAtLeastV() && Intent.ACTION_PROFILE_UNAVAILABLE.equals(action))) {
+ // If the managed/paused profile is turned off, we need to refresh the directory
+ // to update the UI to show an appropriate error message.
+ if (mProviderTestRunnable != null) {
+ mHandler.removeCallbacks(mProviderTestRunnable);
+ mProviderTestRunnable = null;
+ }
+ onRefresh();
+ return;
+ }
+
+ // When the managed/paused profile becomes available, the provider may not be available
+ // immediately, we need to check if it is ready before we reload the content.
+ if (Intent.ACTION_MANAGED_PROFILE_UNLOCKED.equals(action)
+ || (SdkLevel.isAtLeastV() && Intent.ACTION_PROFILE_AVAILABLE.equals(action))) {
+ checkUriAndScheduleCheckIfNeeded(userId);
+ }
+ }
+
+ private void onHiddenProfileStatusChange(String action, UserId userId) {
+ if (Intent.ACTION_PROFILE_UNAVAILABLE.equals(action)) {
+ mActivity.setHasProfileBecomeUnavailable(true);
+ if (mProviderTestRunnable != null) {
+ mHandler.removeCallbacks(mProviderTestRunnable);
+ mProviderTestRunnable = null;
+ }
+ while (mState.stack.size() > 0) {
+ mState.stack.pop();
+ }
+ mActivity.updateNavigator();
+ mActivity.setHasProfileBecomeUnavailable(false);
+ } else {
+ checkUriAndScheduleCheckIfNeeded(userId);
+ }
+ }
+
private final BroadcastReceiver mSdCardBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -288,7 +350,7 @@
mHandler.removeCallbacks(mProviderTestRunnable);
mProviderTestRunnable = null;
}
- mHandler.post(() -> onRefresh());
+ mHandler.post(this::onRefresh);
} else {
checkUriWithDelay(/* numOfRetries= */1, uri, userId);
}
@@ -326,8 +388,8 @@
private boolean isProviderAvailable(Uri uri, UserId userId) {
try (ContentProviderClient userClient =
- DocumentsApplication.acquireUnstableProviderOrThrow(
- userId.getContentResolver(mActivity), uri.getAuthority())) {
+ DocumentsApplication.acquireUnstableProviderOrThrow(
+ userId.getContentResolver(mActivity), uri.getAuthority())) {
Cursor testCursor = userClient.query(uri, /* projection= */ null,
/* queryArgs= */null, /* cancellationSignal= */ null);
if (testCursor != null) {
@@ -339,6 +401,12 @@
return false;
}
+ private boolean isProfileStatusAction(String action) {
+ if (!SdkLevel.isAtLeastV()) return isManagedProfileAction(action);
+ return Intent.ACTION_PROFILE_AVAILABLE.equals(action)
+ || Intent.ACTION_PROFILE_UNAVAILABLE.equals(action);
+ }
+
private static boolean isManagedProfileAction(String action) {
return Intent.ACTION_MANAGED_PROFILE_UNLOCKED.equals(action)
|| Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action);
@@ -445,12 +513,10 @@
mLocalState.mSelectionId = Integer.toHexString(System.identityHashCode(mRecView));
}
- mIconHelper = new IconHelper(mActivity, MODE_GRID, mState.supportsCrossProfile());
+ mIconHelper = new IconHelper(mActivity, MODE_GRID, mState.supportsCrossProfile(),
+ mState.configStore);
- mAdapter = new DirectoryAddonsAdapter(
- mAdapterEnv,
- new ModelBackedDocumentsAdapter(mAdapterEnv, mIconHelper, mInjector.fileTypeLookup)
- );
+ mAdapter = getModelBackedDocumentsAdapter();
mRecView.setAdapter(mAdapter);
@@ -486,14 +552,14 @@
DragStartListener dragStartListener = mInjector.config.dragAndDropEnabled()
? DragStartListener.create(
- mIconHelper,
- mModel,
- mSelectionMgr,
- mSelectionMetadata,
- mState,
- this::getModelId,
- mRecView::findChildViewUnder,
- DocumentsApplication.getDragAndDropManager(mActivity))
+ mIconHelper,
+ mModel,
+ mSelectionMgr,
+ mSelectionMetadata,
+ mState,
+ this::getModelId,
+ mRecView::findChildViewUnder,
+ DocumentsApplication.getDragAndDropManager(mActivity))
: DragStartListener.STUB;
{
@@ -505,16 +571,16 @@
new DocsStableIdProvider(mAdapter),
mDetailsLookup,
StorageStrategy.createStringStorage())
- .withBandOverlay(R.drawable.band_select_overlay)
- .withFocusDelegate(mFocusManager)
- .withOnDragInitiatedListener(dragStartListener::onDragEvent)
- .withOnContextClickListener(this::onContextMenuClick)
- .withOnItemActivatedListener(this::onItemActivated)
- .withOperationMonitor(mContentLock.getMonitor())
- .withSelectionPredicate(selectionPredicate)
- .withGestureTooltypes(MotionEvent.TOOL_TYPE_FINGER,
- MotionEvent.TOOL_TYPE_STYLUS)
- .build();
+ .withBandOverlay(R.drawable.band_select_overlay)
+ .withFocusDelegate(mFocusManager)
+ .withOnDragInitiatedListener(dragStartListener::onDragEvent)
+ .withOnContextClickListener(this::onContextMenuClick)
+ .withOnItemActivatedListener(this::onItemActivated)
+ .withOperationMonitor(mContentLock.getMonitor())
+ .withSelectionPredicate(selectionPredicate)
+ .withGestureTooltypes(MotionEvent.TOOL_TYPE_FINGER,
+ MotionEvent.TOOL_TYPE_STYLUS)
+ .build();
mInjector.updateSharedSelectionTracker(localTracker);
}
@@ -573,6 +639,10 @@
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNLOCKED);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
+ if (SdkLevel.isAtLeastV()) {
+ filter.addAction(Intent.ACTION_PROFILE_AVAILABLE);
+ filter.addAction(Intent.ACTION_PROFILE_UNAVAILABLE);
+ }
// DocumentsApplication will resend the broadcast locally after roots are updated.
// Register to a local broadcast manager to avoid this fragment from updating before
// roots are updated.
@@ -581,6 +651,22 @@
getContext().registerReceiver(mSdCardBroadcastReceiver, getSdCardStateChangeFilter());
}
+ private DocumentsAdapter getModelBackedDocumentsAdapter() {
+ return mState.configStore.isPrivateSpaceInDocsUIEnabled()
+ ? new DirectoryAddonsAdapter(
+ mAdapterEnv, new ModelBackedDocumentsAdapter(mAdapterEnv, mIconHelper,
+ mInjector.fileTypeLookup, mState.configStore),
+ UserId.CURRENT_USER,
+ mActivity.getSelectedUser(),
+ DocumentsApplication.getUserManagerState(getContext()).getUserIdToLabelMap(),
+ getContext().getSystemService(UserManager.class), mState.configStore)
+ : new DirectoryAddonsAdapter(
+ mAdapterEnv,
+ new ModelBackedDocumentsAdapter(mAdapterEnv, mIconHelper,
+ mInjector.fileTypeLookup, mState.configStore),
+ mState.configStore);
+ }
+
@Override
public void onStart() {
super.onStart();
@@ -737,7 +823,7 @@
/**
* Updates the layout after the view mode switches.
*
- * @param mode The new view mode.
+ * @param scale The new view mode.
*/
private void scaleLayout(float scale) {
assert DEBUG;
@@ -1330,7 +1416,6 @@
mRefreshLayout.setRefreshing(false);
if (rootDoc != null && mActivity.getCurrentDirectory() == null) {
// Make sure the stack does not change during task was running.
- Log.d(TAG, "Root doc is retrieved. Pushing to the stack");
mState.stack.push(rootDoc);
mActivity.updateNavigator();
mActions.loadDocumentsForCurrentStack();
diff --git a/src/com/android/documentsui/dirlist/DocumentHolder.java b/src/com/android/documentsui/dirlist/DocumentHolder.java
index 5e38b48..b664bbc 100644
--- a/src/com/android/documentsui/dirlist/DocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/DocumentHolder.java
@@ -36,9 +36,13 @@
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import androidx.recyclerview.widget.RecyclerView;
+import com.android.documentsui.ConfigStore;
+import com.android.documentsui.DocumentsApplication;
import com.android.documentsui.R;
+import com.android.documentsui.UserManagerState;
import com.android.documentsui.base.Shared;
import com.android.documentsui.base.State;
+import com.android.documentsui.base.UserId;
import com.android.modules.utils.build.SdkLevel;
import java.util.function.Function;
@@ -58,30 +62,29 @@
protected @Nullable String mModelId;
protected @State.ActionType int mAction;
+ protected final ConfigStore mConfigStore;
// See #addKeyEventListener for details on the need for this field.
private KeyboardEventListener<DocumentItemDetails> mKeyEventListener;
private final DocumentItemDetails mDetails;
- public DocumentHolder(Context context, ViewGroup parent, int layout) {
- this(context, inflateLayout(context, parent, layout));
+ public DocumentHolder(Context context, ViewGroup parent, int layout, ConfigStore configStore) {
+ this(context, inflateLayout(context, parent, layout), configStore);
}
- public DocumentHolder(Context context, View item) {
+ public DocumentHolder(Context context, View item, ConfigStore configStore) {
super(item);
itemView.setOnKeyListener(this);
mContext = context;
mDetails = new DocumentItemDetails(this);
+ mConfigStore = configStore;
}
/**
* Binds the view to the given item data.
- * @param cursor
- * @param modelId
- * @param state
*/
public abstract void bind(Cursor cursor, String modelId);
@@ -95,10 +98,10 @@
* TODO: Use the DirectoryItemAnimator instead of manually controlling animation using a boolean
* flag.
*
- * @param selected
* @param animate Whether or not to animate the change. Only selection changes initiated by the
- * selection manager should be animated. See
- * {@link ModelBackedDocumentsAdapter#onBindViewHolder(DocumentHolder, int, java.util.List)}
+ * selection manager should be animated. See
+ * {@link ModelBackedDocumentsAdapter#onBindViewHolder(DocumentHolder, int,
+ * java.util.List)}
*/
public void setSelected(boolean selected, boolean animate) {
itemView.setActivated(selected);
@@ -113,13 +116,31 @@
mAction = action;
}
- public void bindPreviewIcon(boolean show, Function<View, Boolean> clickCallback) {}
+ /**
+ * @param show boolean denoting whether the current profile is non-personal
+ * @param clickCallback call back function
+ */
+ public void bindPreviewIcon(boolean show, Function<View, Boolean> clickCallback) {
+ }
- public void bindBriefcaseIcon(boolean show) {}
+ /**
+ * @param show boolean denoting whether the current profile is managed
+ */
+ public void bindBriefcaseIcon(boolean show) {
+ }
+
+ /**
+ * Binds profile badge icon to the documents thumbnail
+ *
+ * @param show boolean denoting whether the current profile is non-personal/parent
+ * @param userIdIdentifier user id of the profile the document belongs to
+ */
+ public void bindProfileIcon(boolean show, int userIdIdentifier) {
+ }
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
- assert(mKeyEventListener != null);
+ assert (mKeyEventListener != null);
DocumentItemDetails details = getItemDetails();
return (details == null)
? false
@@ -135,7 +156,7 @@
* <p>Ideally we'd not involve DocumentHolder in propagation of events like this.
*/
public void addKeyEventListener(KeyboardEventListener<DocumentItemDetails> listener) {
- assert(mKeyEventListener == null);
+ assert (mKeyEventListener == null);
mKeyEventListener = listener;
}
@@ -179,12 +200,22 @@
return view.animate().setDuration(Shared.CHECK_ANIMATION_DURATION).alpha(alpha);
}
- protected String getPreviewIconContentDescription(boolean isWorkProfile, String fileName) {
+ protected String getPreviewIconContentDescription(boolean isNonPersonalProfile,
+ String fileName, UserId userId) {
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ UserManagerState userManagerState = DocumentsApplication.getUserManagerState(mContext);
+ String profileLabel = userManagerState.getUserIdToLabelMap().get(userId);
+ return isNonPersonalProfile
+ ? itemView.getResources().getString(R.string.preview_cross_profile_file,
+ profileLabel, fileName)
+ : itemView.getResources().getString(R.string.preview_file, fileName);
+ }
if (SdkLevel.isAtLeastT()) {
- return getUpdatablePreviewIconContentDescription(isWorkProfile, fileName);
+ return getUpdatablePreviewIconContentDescription(isNonPersonalProfile, fileName);
} else {
return itemView.getResources().getString(
- isWorkProfile ? R.string.preview_work_file : R.string.preview_file, fileName);
+ isNonPersonalProfile ? R.string.preview_work_file : R.string.preview_file,
+ fileName);
}
}
diff --git a/src/com/android/documentsui/dirlist/GridDirectoryHolder.java b/src/com/android/documentsui/dirlist/GridDirectoryHolder.java
index 744b0c9..caa3ec2 100644
--- a/src/com/android/documentsui/dirlist/GridDirectoryHolder.java
+++ b/src/com/android/documentsui/dirlist/GridDirectoryHolder.java
@@ -35,33 +35,37 @@
import androidx.annotation.RequiresApi;
+import com.android.documentsui.ConfigStore;
+import com.android.documentsui.DocumentsApplication;
import com.android.documentsui.IconUtils;
import com.android.documentsui.R;
import com.android.documentsui.base.State;
+import com.android.documentsui.base.UserId;
import com.android.documentsui.ui.Views;
import com.android.modules.utils.build.SdkLevel;
-final class GridDirectoryHolder extends DocumentHolder {
+import java.util.Map;
+final class GridDirectoryHolder extends DocumentHolder {
final TextView mTitle;
private final ImageView mIconCheck;
private final ImageView mIconMime;
- private final ImageView mIconBriefcase;
+ private final ImageView mIconBadge;
private final View mIconLayout;
- public GridDirectoryHolder(Context context, ViewGroup parent) {
- super(context, parent, R.layout.item_dir_grid);
+ GridDirectoryHolder(Context context, ViewGroup parent, ConfigStore configStore) {
+ super(context, parent, R.layout.item_dir_grid, configStore);
mIconLayout = itemView.findViewById(R.id.icon);
mTitle = (TextView) itemView.findViewById(android.R.id.title);
mIconMime = (ImageView) itemView.findViewById(R.id.icon_mime_sm);
mIconCheck = (ImageView) itemView.findViewById(R.id.icon_check);
- mIconBriefcase = (ImageView) itemView.findViewById(R.id.icon_briefcase);
+ mIconBadge = (ImageView) itemView.findViewById(R.id.icon_profile_badge);
mIconMime.setImageDrawable(
IconUtils.loadMimeIcon(context, DocumentsContract.Document.MIME_TYPE_DIR));
- if (SdkLevel.isAtLeastT()) {
+ if (SdkLevel.isAtLeastT() && !mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
setUpdatableWorkProfileIcon(context);
}
}
@@ -71,7 +75,7 @@
DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
Drawable drawable = dpm.getResources().getDrawable(WORK_PROFILE_ICON, SOLID_COLORED, () ->
context.getDrawable(R.drawable.ic_briefcase));
- mIconBriefcase.setImageDrawable(drawable);
+ mIconBadge.setImageDrawable(drawable);
}
@Override
@@ -90,7 +94,16 @@
@Override
public void bindBriefcaseIcon(boolean show) {
- mIconBriefcase.setVisibility(show ? View.VISIBLE : View.GONE);
+ mIconBadge.setVisibility(show ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void bindProfileIcon(boolean show, int userIdIdentifier) {
+ Map<UserId, Drawable> userIdToBadgeMap = DocumentsApplication.getUserManagerState(
+ mContext).getUserIdToBadgeMap();
+ Drawable drawable = userIdToBadgeMap.get(UserId.of(userIdIdentifier));
+ mIconBadge.setImageDrawable(drawable);
+ mIconBadge.setVisibility(show ? View.VISIBLE : View.GONE);
}
@Override
@@ -107,12 +120,13 @@
/**
* Bind this view to the given document for display.
- * @param cursor Pointing to the item to be bound.
+ *
+ * @param cursor Pointing to the item to be bound.
* @param modelId The model ID of the item.
*/
@Override
public void bind(Cursor cursor, String modelId) {
- assert(cursor != null);
+ assert (cursor != null);
this.mModelId = modelId;
diff --git a/src/com/android/documentsui/dirlist/GridDocumentHolder.java b/src/com/android/documentsui/dirlist/GridDocumentHolder.java
index 2da5382..981e659 100644
--- a/src/com/android/documentsui/dirlist/GridDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/GridDocumentHolder.java
@@ -37,6 +37,8 @@
import androidx.annotation.RequiresApi;
+import com.android.documentsui.ConfigStore;
+import com.android.documentsui.DocumentsApplication;
import com.android.documentsui.R;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.Shared;
@@ -45,6 +47,7 @@
import com.android.documentsui.ui.Views;
import com.android.modules.utils.build.SdkLevel;
+import java.util.Map;
import java.util.function.Function;
final class GridDocumentHolder extends DocumentHolder {
@@ -56,7 +59,7 @@
final ImageView mIconMimeSm;
final ImageView mIconThumb;
final ImageView mIconCheck;
- final ImageView mIconBriefcase;
+ final ImageView mIconBadge;
final IconHelper mIconHelper;
final View mIconLayout;
final View mPreviewIcon;
@@ -64,8 +67,9 @@
// This is used in as a convenience in our bind method.
private final DocumentInfo mDoc = new DocumentInfo();
- public GridDocumentHolder(Context context, ViewGroup parent, IconHelper iconHelper) {
- super(context, parent, R.layout.item_doc_grid);
+ GridDocumentHolder(Context context, ViewGroup parent, IconHelper iconHelper,
+ ConfigStore configStore) {
+ super(context, parent, R.layout.item_doc_grid, configStore);
mIconLayout = itemView.findViewById(R.id.icon);
mTitle = (TextView) itemView.findViewById(android.R.id.title);
@@ -75,12 +79,12 @@
mIconMimeSm = (ImageView) itemView.findViewById(R.id.icon_mime_sm);
mIconThumb = (ImageView) itemView.findViewById(R.id.icon_thumb);
mIconCheck = (ImageView) itemView.findViewById(R.id.icon_check);
- mIconBriefcase = (ImageView) itemView.findViewById(R.id.icon_briefcase);
+ mIconBadge = (ImageView) itemView.findViewById(R.id.icon_profile_badge);
mPreviewIcon = itemView.findViewById(R.id.preview_icon);
mIconHelper = iconHelper;
- if (SdkLevel.isAtLeastT()) {
+ if (SdkLevel.isAtLeastT() && !mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
setUpdatableWorkProfileIcon(context);
}
}
@@ -90,7 +94,7 @@
DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
Drawable drawable = dpm.getResources().getDrawable(WORK_PROFILE_ICON, SOLID_COLORED, () ->
context.getDrawable(R.drawable.ic_briefcase));
- mIconBriefcase.setImageDrawable(drawable);
+ mIconBadge.setImageDrawable(drawable);
}
@Override
@@ -108,7 +112,7 @@
// But it should be an error to be set to selected && be disabled.
if (!itemView.isEnabled()) {
- assert(!selected);
+ assert (!selected);
}
super.setSelected(selected, animate);
@@ -138,19 +142,28 @@
mPreviewIcon.setContentDescription(
getPreviewIconContentDescription(
mIconHelper.shouldShowBadge(mDoc.userId.getIdentifier()),
- mDoc.displayName));
+ mDoc.displayName, mDoc.userId));
mPreviewIcon.setAccessibilityDelegate(new PreviewAccessibilityDelegate(clickCallback));
}
}
@Override
public void bindBriefcaseIcon(boolean show) {
- mIconBriefcase.setVisibility(show ? View.VISIBLE : View.GONE);
+ mIconBadge.setVisibility(show ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void bindProfileIcon(boolean show, int userIdIdentifier) {
+ Map<UserId, Drawable> userIdToBadgeMap = DocumentsApplication.getUserManagerState(
+ mContext).getUserIdToBadgeMap();
+ Drawable drawable = userIdToBadgeMap.get(UserId.of(userIdIdentifier));
+ mIconBadge.setImageDrawable(drawable);
+ mIconBadge.setVisibility(show ? View.VISIBLE : View.GONE);
}
@Override
public boolean inDragRegion(MotionEvent event) {
- // Entire grid box should be draggable
+ // Entire grid box should be draggable
return true;
}
@@ -166,12 +179,13 @@
/**
* Bind this view to the given document for display.
- * @param cursor Pointing to the item to be bound.
+ *
+ * @param cursor Pointing to the item to be bound.
* @param modelId The model ID of the item.
*/
@Override
public void bind(Cursor cursor, String modelId) {
- assert(cursor != null);
+ assert (cursor != null);
mModelId = modelId;
diff --git a/src/com/android/documentsui/dirlist/GridPhotoHolder.java b/src/com/android/documentsui/dirlist/GridPhotoHolder.java
index 0618506..8fab852 100644
--- a/src/com/android/documentsui/dirlist/GridPhotoHolder.java
+++ b/src/com/android/documentsui/dirlist/GridPhotoHolder.java
@@ -36,6 +36,8 @@
import androidx.annotation.RequiresApi;
+import com.android.documentsui.ConfigStore;
+import com.android.documentsui.DocumentsApplication;
import com.android.documentsui.R;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.Shared;
@@ -44,6 +46,7 @@
import com.android.documentsui.ui.Views;
import com.android.modules.utils.build.SdkLevel;
+import java.util.Map;
import java.util.function.Function;
final class GridPhotoHolder extends DocumentHolder {
@@ -53,23 +56,24 @@
private final ImageView mIconCheck;
private final IconHelper mIconHelper;
private final View mPreviewIcon;
- private final View mIconBriefcase;
+ private final View mIconBadge;
// This is used in as a convenience in our bind method.
private final DocumentInfo mDoc = new DocumentInfo();
- public GridPhotoHolder(Context context, ViewGroup parent, IconHelper iconHelper) {
- super(context, parent, R.layout.item_photo_grid);
+ GridPhotoHolder(Context context, ViewGroup parent, IconHelper iconHelper,
+ ConfigStore configStore) {
+ super(context, parent, R.layout.item_photo_grid, configStore);
mIconMimeLg = (ImageView) itemView.findViewById(R.id.icon_mime_lg);
mIconThumb = (ImageView) itemView.findViewById(R.id.icon_thumb);
mIconCheck = (ImageView) itemView.findViewById(R.id.icon_check);
- mIconBriefcase = itemView.findViewById(R.id.icon_briefcase);
+ mIconBadge = itemView.findViewById(R.id.icon_profile_badge);
mPreviewIcon = itemView.findViewById(R.id.preview_icon);
mIconHelper = iconHelper;
- if (SdkLevel.isAtLeastT()) {
+ if (SdkLevel.isAtLeastT() && !mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
setUpdatableWorkProfileIcon(context);
}
}
@@ -80,7 +84,7 @@
Drawable drawable = dpm.getResources().getDrawable(
WORK_PROFILE_ICON, SOLID_NOT_COLORED, () ->
context.getDrawable(R.drawable.ic_briefcase));
- ImageView icon = (ImageView) mIconBriefcase.findViewById(R.id.icon_id);
+ ImageView icon = (ImageView) mIconBadge.findViewById(R.id.icon_id);
icon.setImageDrawable(drawable);
}
@@ -123,14 +127,24 @@
mPreviewIcon.setContentDescription(
getPreviewIconContentDescription(
mIconHelper.shouldShowBadge(mDoc.userId.getIdentifier()),
- mDoc.displayName));
+ mDoc.displayName, mDoc.userId));
mPreviewIcon.setAccessibilityDelegate(new PreviewAccessibilityDelegate(clickCallback));
}
}
@Override
public void bindBriefcaseIcon(boolean show) {
- mIconBriefcase.setVisibility(show ? View.VISIBLE : View.GONE);
+ mIconBadge.setVisibility(show ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void bindProfileIcon(boolean show, int userIdIdentifier) {
+ Map<UserId, Drawable> userIdToBadgeMap = DocumentsApplication.getUserManagerState(
+ mContext).getUserIdToBadgeMap();
+ Drawable drawable = userIdToBadgeMap.get(UserId.of(userIdIdentifier));
+ ImageView icon = mIconBadge.findViewById(R.id.icon_id);
+ icon.setImageDrawable(drawable);
+ mIconBadge.setVisibility(show ? View.VISIBLE : View.GONE);
}
@Override
@@ -152,7 +166,8 @@
/**
* Bind this view to the given document for display.
- * @param cursor Pointing to the item to be bound.
+ *
+ * @param cursor Pointing to the item to be bound.
* @param modelId The model ID of the item.
*/
@Override
diff --git a/src/com/android/documentsui/dirlist/HeaderMessageDocumentHolder.java b/src/com/android/documentsui/dirlist/HeaderMessageDocumentHolder.java
index bb98894..aa41708 100644
--- a/src/com/android/documentsui/dirlist/HeaderMessageDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/HeaderMessageDocumentHolder.java
@@ -26,6 +26,7 @@
import android.widget.ImageView;
import android.widget.TextView;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.R;
import com.android.documentsui.base.State.ViewMode;
@@ -45,8 +46,8 @@
private final Button mActionButton;
private Message mMessage;
- public HeaderMessageDocumentHolder(Context context, ViewGroup parent) {
- super(context, parent, R.layout.item_doc_header_message);
+ HeaderMessageDocumentHolder(Context context, ViewGroup parent, ConfigStore configStore) {
+ super(context, parent, R.layout.item_doc_header_message, configStore);
mRoot = itemView.findViewById(R.id.item_root);
mIcon = (ImageView) itemView.findViewById(R.id.message_icon);
diff --git a/src/com/android/documentsui/dirlist/IconHelper.java b/src/com/android/documentsui/dirlist/IconHelper.java
index e2c9905..be86880 100644
--- a/src/com/android/documentsui/dirlist/IconHelper.java
+++ b/src/com/android/documentsui/dirlist/IconHelper.java
@@ -20,6 +20,7 @@
import static com.android.documentsui.base.State.MODE_GRID;
import static com.android.documentsui.base.State.MODE_LIST;
+import android.app.ActivityManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Point;
@@ -34,6 +35,7 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.DocumentsApplication;
import com.android.documentsui.IconUtils;
import com.android.documentsui.ProviderExecutor;
@@ -41,6 +43,7 @@
import com.android.documentsui.ThumbnailCache;
import com.android.documentsui.ThumbnailCache.Result;
import com.android.documentsui.ThumbnailLoader;
+import com.android.documentsui.UserManagerState;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.MimeTypes;
import com.android.documentsui.base.State;
@@ -66,31 +69,37 @@
private final boolean mMaybeShowBadge;
@Nullable
private final UserId mManagedUser;
+ private final UserManagerState mUserManagerState;
+ private final ConfigStore mConfigStore;
/**
- * @param context
* @param mode MODE_GRID or MODE_LIST
*/
- public IconHelper(Context context, int mode, boolean maybeShowBadge) {
+ public IconHelper(Context context, int mode, boolean maybeShowBadge, ConfigStore configStore) {
this(context, mode, maybeShowBadge, DocumentsApplication.getThumbnailCache(context),
- DocumentsApplication.getUserIdManager(context).getManagedUser());
+ configStore.isPrivateSpaceInDocsUIEnabled() ? null
+ : DocumentsApplication.getUserIdManager(context).getManagedUser(),
+ configStore.isPrivateSpaceInDocsUIEnabled()
+ ? DocumentsApplication.getUserManagerState(context) : null,
+ configStore);
}
@VisibleForTesting
IconHelper(Context context, int mode, boolean maybeShowBadge, ThumbnailCache thumbnailCache,
- @Nullable UserId managedUser) {
+ @Nullable UserId managedUser, @Nullable UserManagerState userManagerState,
+ ConfigStore configStore) {
mContext = context;
setViewMode(mode);
mThumbnailCache = thumbnailCache;
mManagedUser = managedUser;
mMaybeShowBadge = maybeShowBadge;
+ mUserManagerState = userManagerState;
+ mConfigStore = configStore;
}
/**
* Enables or disables thumbnails. When thumbnails are disabled, mime icons (or custom icons, if
* specified by the document) are used instead.
- *
- * @param enabled
*/
public void setThumbnailsEnabled(boolean enabled) {
mThumbnailsEnabled = enabled;
@@ -99,7 +108,7 @@
/**
* Sets the current display mode. This affects the thumbnail sizes that are loaded.
*
- * @param mode See {@link State.MODE_LIST} and {@link State.MODE_GRID}.
+ * @param mode See {@link State#MODE_LIST} and {@link State#MODE_GRID}.
*/
public void setViewMode(@ViewMode int mode) {
mMode = mode;
@@ -125,8 +134,6 @@
/**
* Cancels any ongoing load operations associated with the given ImageView.
- *
- * @param icon
*/
public void stopLoading(ImageView icon) {
final ThumbnailLoader oldTask = (ThumbnailLoader) icon.getTag();
@@ -139,11 +146,10 @@
/**
* Load thumbnails for a directory list item.
*
- * @param doc The document
- * @param iconThumb The itemview's thumbnail icon.
- * @param iconMime The itemview's mime icon. Hidden when iconThumb is shown.
+ * @param doc The document
+ * @param iconThumb The itemview's thumbnail icon.
+ * @param iconMime The itemview's mime icon. Hidden when iconThumb is shown.
* @param subIconMime The second itemview's mime icon. Always visible.
- * @return
*/
public void load(
DocumentInfo doc,
@@ -157,15 +163,14 @@
/**
* Load thumbnails for a directory list item.
*
- * @param uri The URI for the file being represented.
- * @param mimeType The mime type of the file being represented.
- * @param docFlags Flags for the file being represented.
- * @param docIcon Custom icon (if any) for the file being requested.
+ * @param uri The URI for the file being represented.
+ * @param mimeType The mime type of the file being represented.
+ * @param docFlags Flags for the file being represented.
+ * @param docIcon Custom icon (if any) for the file being requested.
* @param docLastModified the last modified value of the file being requested.
- * @param iconThumb The itemview's thumbnail icon.
- * @param iconMime The itemview's mime icon. Hidden when iconThumb is shown.
- * @param subIconMime The second itemview's mime icon. Always visible.
- * @return
+ * @param iconThumb The itemview's thumbnail icon.
+ * @param iconMime The itemview's mime icon. Hidden when iconThumb is shown.
+ * @param subIconMime The second itemview's mime icon. Always visible.
*/
public void load(Uri uri, UserId userId, String mimeType, int docFlags, int docIcon,
long docLastModified, ImageView iconThumb, ImageView iconMime,
@@ -180,7 +185,7 @@
final boolean showThumbnail = supportsThumbnail && allowThumbnail && mThumbnailsEnabled;
if (showThumbnail) {
loadedThumbnail =
- loadThumbnail(uri, userId, docAuthority, docLastModified, iconThumb, iconMime);
+ loadThumbnail(uri, userId, docAuthority, docLastModified, iconThumb, iconMime);
}
final Drawable mimeIcon = getDocumentIcon(mContext, userId, docAuthority,
@@ -207,9 +212,11 @@
iconThumb.setImageBitmap(cachedThumbnail);
boolean stale = (docLastModified > result.getLastModified());
- if (VERBOSE) Log.v(TAG,
- String.format("Load thumbnail for %s, got result %d and stale %b.",
- uri.toString(), result.getStatus(), stale));
+ if (VERBOSE) {
+ Log.v(TAG,
+ String.format("Load thumbnail for %s, got result %d and stale %b.",
+ uri.toString(), result.getStatus(), stale));
+ }
if (!result.isExactHit() || stale) {
final BiConsumer<View, View> animator =
(cachedThumbnail == null ? ThumbnailLoader.ANIM_FADE_IN :
@@ -264,6 +271,11 @@
* Returns true if we should show a briefcase icon for the given user.
*/
public boolean shouldShowBadge(int userIdIdentifier) {
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ return mMaybeShowBadge
+ && mUserManagerState.getUserIds().size() > 1
+ && ActivityManager.getCurrentUser() != userIdIdentifier;
+ }
return mMaybeShowBadge && mManagedUser != null
&& mManagedUser.getIdentifier() == userIdIdentifier;
}
diff --git a/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java b/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java
index 2e2b921..1fbb32b 100644
--- a/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java
@@ -25,6 +25,7 @@
import android.widget.ProgressBar;
import android.widget.TextView;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.R;
import com.android.documentsui.util.VersionUtils;
@@ -52,8 +53,8 @@
private View mCrossProfileContent;
private ProgressBar mCrossProfileProgress;
- public InflateMessageDocumentHolder(Context context, ViewGroup parent) {
- super(context, parent, R.layout.item_doc_inflated_message);
+ InflateMessageDocumentHolder(Context context, ViewGroup parent, ConfigStore configStore) {
+ super(context, parent, R.layout.item_doc_inflated_message, configStore);
mContentView = itemView.findViewById(R.id.content);
mCrossProfileView = itemView.findViewById(R.id.cross_profile);
mCrossProfileContent = mCrossProfileView.findViewById(R.id.cross_profile_content);
diff --git a/src/com/android/documentsui/dirlist/ListDocumentHolder.java b/src/com/android/documentsui/dirlist/ListDocumentHolder.java
index 96c49e0..e287b76 100644
--- a/src/com/android/documentsui/dirlist/ListDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/ListDocumentHolder.java
@@ -40,6 +40,8 @@
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
+import com.android.documentsui.ConfigStore;
+import com.android.documentsui.DocumentsApplication;
import com.android.documentsui.R;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.Lookup;
@@ -51,6 +53,7 @@
import com.android.modules.utils.build.SdkLevel;
import java.util.ArrayList;
+import java.util.Map;
import java.util.function.Function;
final class ListDocumentHolder extends DocumentHolder {
@@ -67,7 +70,7 @@
private final ImageView mIconMime;
private final ImageView mIconThumb;
private final ImageView mIconCheck;
- private final ImageView mIconBriefcase;
+ private final ImageView mIconBadge;
private final View mIconLayout;
final View mPreviewIcon;
@@ -77,14 +80,14 @@
private final DocumentInfo mDoc;
public ListDocumentHolder(Context context, ViewGroup parent, IconHelper iconHelper,
- Lookup<String, String> fileTypeLookup) {
- super(context, parent, R.layout.item_doc_list);
+ Lookup<String, String> fileTypeLookup, ConfigStore configStore) {
+ super(context, parent, R.layout.item_doc_list, configStore);
mIconLayout = itemView.findViewById(R.id.icon);
mIconMime = (ImageView) itemView.findViewById(R.id.icon_mime);
mIconThumb = (ImageView) itemView.findViewById(R.id.icon_thumb);
mIconCheck = (ImageView) itemView.findViewById(R.id.icon_check);
- mIconBriefcase = (ImageView) itemView.findViewById(R.id.icon_briefcase);
+ mIconBadge = (ImageView) itemView.findViewById(R.id.icon_profile_badge);
mTitle = (TextView) itemView.findViewById(android.R.id.title);
mSize = (TextView) itemView.findViewById(R.id.size);
mDate = (TextView) itemView.findViewById(R.id.date);
@@ -98,7 +101,7 @@
mFileTypeLookup = fileTypeLookup;
mDoc = new DocumentInfo();
- if (SdkLevel.isAtLeastT()) {
+ if (SdkLevel.isAtLeastT() && !mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
setUpdatableWorkProfileIcon(context);
}
}
@@ -108,7 +111,7 @@
DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
Drawable drawable = dpm.getResources().getDrawable(WORK_PROFILE_ICON, SOLID_COLORED, () ->
context.getDrawable(R.drawable.ic_briefcase));
- mIconBriefcase.setImageDrawable(drawable);
+ mIconBadge.setImageDrawable(drawable);
}
@Override
@@ -158,7 +161,7 @@
mPreviewIcon.setContentDescription(
getPreviewIconContentDescription(
mIconHelper.shouldShowBadge(mDoc.userId.getIdentifier()),
- mDoc.displayName));
+ mDoc.displayName, mDoc.userId));
mPreviewIcon.setAccessibilityDelegate(
new PreviewAccessibilityDelegate(clickCallback));
}
@@ -167,7 +170,16 @@
@Override
public void bindBriefcaseIcon(boolean show) {
- mIconBriefcase.setVisibility(show ? View.VISIBLE : View.GONE);
+ mIconBadge.setVisibility(show ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void bindProfileIcon(boolean show, int userIdIdentifier) {
+ Map<UserId, Drawable> userIdToBadgeMap = DocumentsApplication.getUserManagerState(
+ mContext).getUserIdToBadgeMap();
+ Drawable drawable = userIdToBadgeMap.get(UserId.of(userIdIdentifier));
+ mIconBadge.setImageDrawable(drawable);
+ mIconBadge.setVisibility(show ? View.VISIBLE : View.GONE);
}
@Override
@@ -209,7 +221,7 @@
/**
* Bind this view to the given document for display.
*
- * @param cursor Pointing to the item to be bound.
+ * @param cursor Pointing to the item to be bound.
* @param modelId The model ID of the item.
*/
@Override
diff --git a/src/com/android/documentsui/dirlist/Message.java b/src/com/android/documentsui/dirlist/Message.java
index ccdad46..d4c7e7e 100644
--- a/src/com/android/documentsui/dirlist/Message.java
+++ b/src/com/android/documentsui/dirlist/Message.java
@@ -35,12 +35,18 @@
import android.app.AuthenticationRequiredException;
import android.app.admin.DevicePolicyManager;
import android.content.pm.PackageManager;
+import android.content.pm.UserProperties;
+import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Build;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.CrossProfileException;
import com.android.documentsui.CrossProfileNoPermissionException;
import com.android.documentsui.CrossProfileQuietModeException;
@@ -54,11 +60,17 @@
import com.android.documentsui.dirlist.DocumentsAdapter.Environment;
import com.android.modules.utils.build.SdkLevel;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
/**
* Data object used by {@link InflateMessageDocumentHolder} and {@link HeaderMessageDocumentHolder}.
*/
abstract class Message {
+ private static final int ACCESS_CROSS_PROFILE_FILES = -1;
+
protected final Environment mEnv;
// If the message has a button, this will be the default button call back.
protected final Runnable mDefaultCallback;
@@ -72,13 +84,15 @@
private boolean mShouldShow = false;
protected boolean mShouldKeep = false;
protected int mLayout;
+ protected ConfigStore mConfigStore;
- Message(Environment env, Runnable defaultCallback) {
+ Message(Environment env, Runnable defaultCallback, ConfigStore configStore) {
mEnv = env;
mDefaultCallback = defaultCallback;
+ mConfigStore = configStore;
}
- abstract void update(Update Event);
+ abstract void update(Update event);
protected void update(@Nullable CharSequence messageTitle, CharSequence messageString,
@Nullable CharSequence buttonString, Drawable icon) {
@@ -121,6 +135,7 @@
/**
* Return this message should keep showing or not.
+ *
* @return true if this message should keep showing.
*/
boolean shouldKeep() {
@@ -143,8 +158,8 @@
private static final String TAG = "HeaderMessage";
- HeaderMessage(Environment env, Runnable callback) {
- super(env, callback);
+ HeaderMessage(Environment env, Runnable callback, ConfigStore configStore) {
+ super(env, callback, configStore);
}
@Override
@@ -173,7 +188,7 @@
}
private void updateToAuthenticationExceptionHeader(Update event) {
- assert(mEnv.getFeatures().isRemoteActionsEnabled());
+ assert (mEnv.getFeatures().isRemoteActionsEnabled());
RootInfo root = mEnv.getDisplayState().stack.getRoot();
String appName = DocumentsApplication.getProvidersCache(
@@ -199,15 +214,52 @@
final static class InflateMessage extends Message {
+ private static final String TAG = "InflateMessage";
+ private UserId mSourceUserId = null;
+ private UserId mSelectedUserId = null;
+ private Map<UserId, String> mUserIdToLabelMap = new HashMap<>();
private final boolean mCanModifyQuietMode;
+ private UserManager mUserManager = null;
- InflateMessage(Environment env, Runnable callback) {
- super(env, callback);
+ InflateMessage(Environment env, Runnable callback, ConfigStore configStore) {
+ super(env, callback, configStore);
mCanModifyQuietMode =
mEnv.getContext().checkSelfPermission(Manifest.permission.MODIFY_QUIET_MODE)
== PackageManager.PERMISSION_GRANTED;
}
+ InflateMessage(Environment env, Runnable callback, UserId sourceUserId,
+ UserId selectedUserId, Map<UserId, String> userIdToLabelMap,
+ UserManager userManager, ConfigStore configStore) {
+ super(env, callback, configStore);
+ mSourceUserId = sourceUserId;
+ mSelectedUserId = selectedUserId;
+ mUserIdToLabelMap = userIdToLabelMap;
+ mUserManager = userManager != null ? userManager
+ : mEnv.getContext().getSystemService(UserManager.class);
+ mCanModifyQuietMode = setCanModifyQuietMode();
+ }
+
+ private boolean setCanModifyQuietMode() {
+ if (SdkLevel.isAtLeastV() && mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ if (mUserManager == null) {
+ Log.e(TAG, "can not obtain user manager class");
+ return false;
+ }
+
+ UserProperties userProperties = mUserManager.getUserProperties(
+ UserHandle.of(mSelectedUserId.getIdentifier()));
+ return userProperties.getShowInQuietMode()
+ == UserProperties.SHOW_IN_QUIET_MODE_PAUSED
+ && mEnv.getContext().checkSelfPermission(
+ Manifest.permission.MODIFY_QUIET_MODE)
+ == PackageManager.PERMISSION_GRANTED;
+ } else {
+ return mEnv.getContext().checkSelfPermission(Manifest.permission.MODIFY_QUIET_MODE)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+ }
+
@Override
void update(Update event) {
reset();
@@ -233,16 +285,29 @@
private void updateToQuietModeErrorMessage(UserId userId) {
mLayout = InflateMessageDocumentHolder.LAYOUT_CROSS_PROFILE_ERROR;
- CharSequence buttonText = null;
+ String buttonText = null;
+ Resources res = null;
+ String selectedProfile = null;
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ res = mEnv.getContext().getResources();
+ assert mUserIdToLabelMap != null;
+ selectedProfile = mUserIdToLabelMap.get(userId);
+ }
if (mCanModifyQuietMode) {
- buttonText = getEnterpriseString(
- WORK_PROFILE_OFF_ENABLE_BUTTON, R.string.quiet_mode_button);
+ buttonText = mConfigStore.isPrivateSpaceInDocsUIEnabled()
+ ? res.getString(R.string.profile_quiet_mode_button,
+ selectedProfile.toLowerCase(Locale.getDefault()))
+ : getEnterpriseString(
+ WORK_PROFILE_OFF_ENABLE_BUTTON, R.string.quiet_mode_button);
mCallback = () -> mEnv.getActionHandler().requestQuietModeDisabled(
mEnv.getDisplayState().stack.getRoot(), userId);
}
- update(
- getEnterpriseString(
- WORK_PROFILE_OFF_ERROR_TITLE, R.string.quiet_mode_error_title),
+
+ update(mConfigStore.isPrivateSpaceInDocsUIEnabled()
+ ? res.getString(R.string.profile_quiet_mode_error_title,
+ selectedProfile)
+ : getEnterpriseString(
+ WORK_PROFILE_OFF_ERROR_TITLE, R.string.quiet_mode_error_title),
/* messageString= */ "",
buttonText,
getWorkProfileOffIcon());
@@ -257,58 +322,117 @@
}
private CharSequence getCrossProfileNoPermissionErrorTitle() {
- boolean currentUserIsSystem = UserId.CURRENT_USER.isSystem();
switch (mEnv.getDisplayState().action) {
case State.ACTION_GET_CONTENT:
case State.ACTION_OPEN:
case State.ACTION_OPEN_TREE:
- return currentUserIsSystem
- ? getEnterpriseString(
- CANT_SELECT_WORK_FILES_TITLE,
- R.string.cant_select_work_files_error_title)
- : getEnterpriseString(
- CANT_SELECT_PERSONAL_FILES_TITLE,
- R.string.cant_select_personal_files_error_title);
+ return mConfigStore.isPrivateSpaceInDocsUIEnabled()
+ ? getErrorTitlePrivateSpaceEnabled(ACCESS_CROSS_PROFILE_FILES)
+ : getErrorTitlePrivateSpaceDisabled(ACCESS_CROSS_PROFILE_FILES);
case State.ACTION_CREATE:
- return currentUserIsSystem
- ? getEnterpriseString(
- CANT_SAVE_TO_WORK_TITLE, R.string.cant_save_to_work_error_title)
- : getEnterpriseString(
- CANT_SAVE_TO_PERSONAL_TITLE,
- R.string.cant_save_to_personal_error_title);
+ return mConfigStore.isPrivateSpaceInDocsUIEnabled()
+ ? getErrorTitlePrivateSpaceEnabled(State.ACTION_CREATE)
+ : getErrorTitlePrivateSpaceDisabled(State.ACTION_CREATE);
}
return getEnterpriseString(
CROSS_PROFILE_NOT_ALLOWED_TITLE,
R.string.cross_profile_action_not_allowed_title);
}
- private CharSequence getCrossProfileNoPermissionErrorMessage() {
+ private CharSequence getErrorTitlePrivateSpaceEnabled(int action) {
+ Resources res = mEnv.getContext().getResources();
+ String selectedProfileLabel = mUserIdToLabelMap.get(mSelectedUserId);
+ if (selectedProfileLabel == null) return "";
+ if (action == ACCESS_CROSS_PROFILE_FILES) {
+ return res.getString(R.string.cant_select_cross_profile_files_error_title,
+ selectedProfileLabel.toLowerCase(Locale.getDefault()));
+ } else if (action == State.ACTION_CREATE) {
+ return res.getString(R.string.cant_save_to_cross_profile_error_title,
+ selectedProfileLabel.toLowerCase(Locale.getDefault()));
+ } else {
+ Log.e(TAG, "Unexpected intent action received.");
+ return "";
+ }
+ }
+
+ private CharSequence getErrorTitlePrivateSpaceDisabled(int action) {
boolean currentUserIsSystem = UserId.CURRENT_USER.isSystem();
+ if (action == ACCESS_CROSS_PROFILE_FILES) {
+ return currentUserIsSystem
+ ? getEnterpriseString(CANT_SELECT_WORK_FILES_TITLE,
+ R.string.cant_select_work_files_error_title)
+ : getEnterpriseString(CANT_SELECT_PERSONAL_FILES_TITLE,
+ R.string.cant_select_personal_files_error_title);
+ } else if (action == State.ACTION_CREATE) {
+ return currentUserIsSystem
+ ? getEnterpriseString(CANT_SAVE_TO_WORK_TITLE,
+ R.string.cant_save_to_work_error_title)
+ : getEnterpriseString(CANT_SAVE_TO_PERSONAL_TITLE,
+ R.string.cant_save_to_personal_error_title);
+ } else {
+ Log.e(TAG, "Unexpected intent action received.");
+ return "";
+ }
+ }
+
+ private CharSequence getCrossProfileNoPermissionErrorMessage() {
switch (mEnv.getDisplayState().action) {
case State.ACTION_GET_CONTENT:
case State.ACTION_OPEN:
case State.ACTION_OPEN_TREE:
- return currentUserIsSystem
- ? getEnterpriseString(
- CANT_SELECT_WORK_FILES_MESSAGE,
- R.string.cant_select_work_files_error_message)
- : getEnterpriseString(
- CANT_SELECT_PERSONAL_FILES_MESSAGE,
- R.string.cant_select_personal_files_error_message);
+ return mConfigStore.isPrivateSpaceInDocsUIEnabled()
+ ? getErrorMessagePrivateSpaceEnabled(ACCESS_CROSS_PROFILE_FILES)
+ : getErrorMessagePrivateSpaceDisabled(ACCESS_CROSS_PROFILE_FILES);
case State.ACTION_CREATE:
- return currentUserIsSystem
- ? getEnterpriseString(
- CANT_SAVE_TO_WORK_MESSAGE,
- R.string.cant_save_to_work_error_message)
- : getEnterpriseString(
- CANT_SAVE_TO_PERSONAL_MESSAGE,
- R.string.cant_save_to_personal_error_message);
+ return mConfigStore.isPrivateSpaceInDocsUIEnabled()
+ ? getErrorMessagePrivateSpaceEnabled(State.ACTION_CREATE)
+ : getErrorMessagePrivateSpaceDisabled(State.ACTION_CREATE);
+
}
return getEnterpriseString(
CROSS_PROFILE_NOT_ALLOWED_MESSAGE,
R.string.cross_profile_action_not_allowed_message);
}
+ private CharSequence getErrorMessagePrivateSpaceEnabled(int action) {
+ Resources res = mEnv.getContext().getResources();
+ String sourceProfileLabel = mUserIdToLabelMap.get(mSourceUserId);
+ String selectedProfileLabel = mUserIdToLabelMap.get(mSelectedUserId);
+ if (sourceProfileLabel == null || selectedProfileLabel == null) return "";
+ if (action == ACCESS_CROSS_PROFILE_FILES) {
+ return res.getString(R.string.cant_select_cross_profile_files_error_message,
+ selectedProfileLabel.toLowerCase(Locale.getDefault()),
+ sourceProfileLabel.toLowerCase(Locale.getDefault()));
+ } else if (action == State.ACTION_CREATE) {
+ return res.getString(R.string.cant_save_to_cross_profile_error_message,
+ sourceProfileLabel.toLowerCase(Locale.getDefault()),
+ selectedProfileLabel.toLowerCase(Locale.getDefault()));
+ } else {
+ Log.e(TAG, "Unexpected intent action received.");
+ return "";
+ }
+ }
+
+ private CharSequence getErrorMessagePrivateSpaceDisabled(int action) {
+ boolean currentUserIsSystem = UserId.CURRENT_USER.isSystem();
+ if (action == ACCESS_CROSS_PROFILE_FILES) {
+ return currentUserIsSystem
+ ? getEnterpriseString(CANT_SELECT_WORK_FILES_MESSAGE,
+ R.string.cant_select_work_files_error_message)
+ : getEnterpriseString(CANT_SELECT_PERSONAL_FILES_MESSAGE,
+ R.string.cant_select_personal_files_error_message);
+ } else if (action == State.ACTION_CREATE) {
+ return currentUserIsSystem
+ ? getEnterpriseString(CANT_SAVE_TO_WORK_MESSAGE,
+ R.string.cant_save_to_work_error_message)
+ : getEnterpriseString(CANT_SAVE_TO_PERSONAL_MESSAGE,
+ R.string.cant_save_to_personal_error_message);
+ } else {
+ Log.e(TAG, "Unexpected intent action received.");
+ return "";
+ }
+ }
+
private void updateToInflatedErrorMessage() {
update(null, mEnv.getContext().getResources().getText(R.string.query_error), null,
mEnv.getContext().getDrawable(R.drawable.hourglass));
diff --git a/src/com/android/documentsui/dirlist/MessageHolder.java b/src/com/android/documentsui/dirlist/MessageHolder.java
index 1d8d7d6..9853e44 100644
--- a/src/com/android/documentsui/dirlist/MessageHolder.java
+++ b/src/com/android/documentsui/dirlist/MessageHolder.java
@@ -20,16 +20,18 @@
import android.view.ViewGroup;
import android.widget.Space;
+import com.android.documentsui.ConfigStore;
+
/**
* Base class for all non-Document Holder classes.
*/
abstract class MessageHolder extends DocumentHolder {
- public MessageHolder(Context context, Space space) {
- super(context, space);
+ MessageHolder(Context context, Space space, ConfigStore configStore) {
+ super(context, space, configStore);
}
- public MessageHolder(Context context, ViewGroup parent, int layout) {
- super(context, parent, layout);
+ MessageHolder(Context context, ViewGroup parent, int layout, ConfigStore configStore) {
+ super(context, parent, layout, configStore);
}
@Override
diff --git a/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java b/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java
index f763607..beaa24b 100644
--- a/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java
+++ b/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java
@@ -29,6 +29,7 @@
import androidx.recyclerview.selection.SelectionTracker;
import androidx.recyclerview.widget.RecyclerView;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.Model;
import com.android.documentsui.Model.Update;
import com.android.documentsui.base.EventListener;
@@ -51,6 +52,7 @@
private final Environment mEnv;
private final IconHelper mIconHelper; // a transitive dependency of the holders.
private final Lookup<String, String> mFileTypeLookup;
+ private final ConfigStore mConfigStore;
/**
* An ordered list of model IDs. This is the data structure that determines what shows up in
@@ -60,10 +62,12 @@
private EventListener<Model.Update> mModelUpdateListener;
public ModelBackedDocumentsAdapter(
- Environment env, IconHelper iconHelper, Lookup<String, String> fileTypeLookup) {
+ Environment env, IconHelper iconHelper, Lookup<String, String> fileTypeLookup,
+ ConfigStore configStore) {
mEnv = env;
mIconHelper = iconHelper;
mFileTypeLookup = fileTypeLookup;
+ mConfigStore = configStore;
mModelUpdateListener = new EventListener<Model.Update>() {
@Override
@@ -90,12 +94,14 @@
case MODE_GRID:
switch (viewType) {
case ITEM_TYPE_DIRECTORY:
- holder = new GridDirectoryHolder(mEnv.getContext(), parent);
+ holder = new GridDirectoryHolder(mEnv.getContext(), parent, mConfigStore);
break;
case ITEM_TYPE_DOCUMENT:
holder = state.isPhotoPicking()
- ? new GridPhotoHolder(mEnv.getContext(), parent, mIconHelper)
- : new GridDocumentHolder(mEnv.getContext(), parent, mIconHelper);
+ ? new GridPhotoHolder(mEnv.getContext(), parent, mIconHelper,
+ mConfigStore)
+ : new GridDocumentHolder(mEnv.getContext(), parent, mIconHelper,
+ mConfigStore);
break;
default:
throw new IllegalStateException("Unsupported layout type.");
@@ -103,7 +109,7 @@
break;
case MODE_LIST:
holder = new ListDocumentHolder(
- mEnv.getContext(), parent, mIconHelper, mFileTypeLookup);
+ mEnv.getContext(), parent, mIconHelper, mFileTypeLookup, mConfigStore);
break;
default:
throw new IllegalStateException("Unsupported layout mode.");
@@ -136,14 +142,18 @@
boolean enabled = mEnv.isDocumentEnabled(docMimeType, docFlags);
boolean selected = mEnv.isSelected(modelId);
if (!enabled) {
- assert(!selected);
+ assert (!selected);
}
holder.setEnabled(enabled);
holder.setSelected(mEnv.isSelected(modelId), false);
holder.setAction(mEnv.getDisplayState().action);
holder.bindPreviewIcon(mEnv.getDisplayState().shouldShowPreview() && enabled,
view -> mEnv.getActionHandler().previewItem(holder.getItemDetails()));
- holder.bindBriefcaseIcon(mIconHelper.shouldShowBadge(userIdIdentifier));
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ holder.bindProfileIcon(mIconHelper.shouldShowBadge(userIdIdentifier), userIdIdentifier);
+ } else {
+ holder.bindBriefcaseIcon(mIconHelper.shouldShowBadge(userIdIdentifier));
+ }
mEnv.onBindDocumentHolder(holder, cursor);
}
diff --git a/src/com/android/documentsui/dirlist/TransparentDividerDocumentHolder.java b/src/com/android/documentsui/dirlist/TransparentDividerDocumentHolder.java
index 44efd80..cb65e70 100644
--- a/src/com/android/documentsui/dirlist/TransparentDividerDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/TransparentDividerDocumentHolder.java
@@ -21,6 +21,7 @@
import android.database.Cursor;
import android.widget.Space;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.R;
import com.android.documentsui.base.State;
@@ -32,8 +33,8 @@
private final int mVisibleHeight;
private State mState;
- public TransparentDividerDocumentHolder(Context context) {
- super(context, new Space(context));
+ TransparentDividerDocumentHolder(Context context, ConfigStore configStore) {
+ super(context, new Space(context), configStore);
mVisibleHeight = context.getResources().getDimensionPixelSize(
R.dimen.grid_section_separator_height);
@@ -51,6 +52,5 @@
} else {
itemView.setMinimumHeight(0);
}
- return;
}
}
\ No newline at end of file
diff --git a/src/com/android/documentsui/files/FilesActivity.java b/src/com/android/documentsui/files/FilesActivity.java
index c426a70..053e5db 100644
--- a/src/com/android/documentsui/files/FilesActivity.java
+++ b/src/com/android/documentsui/files/FilesActivity.java
@@ -83,8 +83,15 @@
}
// make these methods visible in this package to work around compiler bug http://b/62218600
- @Override protected boolean focusSidebar() { return super.focusSidebar(); }
- @Override protected boolean popDir() { return super.popDir(); }
+ @Override
+ protected boolean focusSidebar() {
+ return super.focusSidebar();
+ }
+
+ @Override
+ protected boolean popDir() {
+ return super.popDir();
+ }
@Override
public void onCreate(Bundle icicle) {
@@ -157,8 +164,7 @@
mInjector.selectionMgr,
mProfileTabsAddonsStub);
- mAppsRowManager = new AppsRowManager(mInjector.actions, mState.supportsCrossProfile(),
- mUserIdManager);
+ mAppsRowManager = getAppsRowManager();
mInjector.appsRowManager = mAppsRowManager;
mActivityInputHandler =
@@ -194,6 +200,14 @@
presentFileErrors(icicle, intent);
}
+ private AppsRowManager getAppsRowManager() {
+ return mConfigStore.isPrivateSpaceInDocsUIEnabled()
+ ? new AppsRowManager(mInjector.actions, mState.supportsCrossProfile(),
+ mUserManagerState, mConfigStore)
+ : new AppsRowManager(mInjector.actions, mState.supportsCrossProfile(),
+ mUserIdManager, mConfigStore);
+ }
+
// This is called in the intent contains label and icon resources.
// When that is true, the launcher activity has supplied them so we
// can adapt our presentation to how we were launched.
@@ -207,11 +221,11 @@
// called Downloads, which is also not the desired behavior.
private void updateTaskDescription(final Intent intent) {
int labelRes = intent.getIntExtra(LauncherActivity.TASK_LABEL_RES, -1);
- assert(labelRes > -1);
+ assert (labelRes > -1);
String label = getResources().getString(labelRes);
int iconRes = intent.getIntExtra(LauncherActivity.TASK_ICON_RES, -1);
- assert(iconRes > -1);
+ assert (iconRes > -1);
setTaskDescription(new TaskDescription(label, iconRes));
}
@@ -244,14 +258,14 @@
final Intent intent = getIntent();
// This is a remnant of old logic where we used to initialize accept MIME types in
- // BaseActivity. ProvidersAccess still rely on this being correctly initialized so we still have
- // to initialize it in FilesActivity.
+ // BaseActivity. ProvidersAccess still rely on this being correctly initialized, so we
+ // still have to initialize it in FilesActivity.
state.initAcceptMimes(intent, "*/*");
state.action = State.ACTION_BROWSE;
state.allowMultiple = true;
// Options specific to the DocumentsActivity.
- assert(!intent.hasExtra(Intent.EXTRA_LOCAL_ONLY));
+ assert (!intent.hasExtra(Intent.EXTRA_LOCAL_ONLY));
}
@Override
@@ -286,6 +300,11 @@
}
@Override
+ public void onDestroy() {
+ super.onDestroy();
+ }
+
+ @Override
public String getDrawerTitle() {
Intent intent = getIntent();
return (intent != null && intent.hasExtra(Intent.EXTRA_TITLE))
@@ -333,7 +352,7 @@
final RootInfo root = getCurrentRoot();
final DocumentInfo cwd = getCurrentDirectory();
- assert(!mSearchManager.isSearching());
+ assert (!mSearchManager.isSearching());
if (mState.stack.isRecents()) {
DirectoryFragment.showRecentsOpen(fm, anim);
@@ -355,7 +374,7 @@
@Override
public void onDirectoryCreated(DocumentInfo doc) {
- assert(doc.isDirectory());
+ assert (doc.isDirectory());
mInjector.focusManager.focusDocument(doc.documentId);
}
diff --git a/src/com/android/documentsui/inspector/KeyValueRow.java b/src/com/android/documentsui/inspector/KeyValueRow.java
index 00ef819..349d017 100644
--- a/src/com/android/documentsui/inspector/KeyValueRow.java
+++ b/src/com/android/documentsui/inspector/KeyValueRow.java
@@ -98,9 +98,11 @@
public void setOnClickListener(OnClickListener callback) {
TextView clickable = ((TextView) findViewById(R.id.table_row_value));
mDefaultTextColor = clickable.getTextColors();
- TypedArray ta = getContext().obtainStyledAttributes(R.styleable.TextAppearance);
- int linkColor = ta.getColor(R.styleable.TextAppearance_android_textColorLink,
- mDefaultTextColor.getDefaultColor());
+ TypedArray ta =
+ getContext().obtainStyledAttributes(androidx.appcompat.R.styleable.TextAppearance);
+ int linkColor =
+ ta.getColor(androidx.appcompat.R.styleable.TextAppearance_android_textColorLink,
+ mDefaultTextColor.getDefaultColor());
ta.recycle();
clickable.setTextColor(linkColor);
clickable.setPaintFlags(clickable.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
diff --git a/src/com/android/documentsui/picker/ActionHandler.java b/src/com/android/documentsui/picker/ActionHandler.java
index 1fc35b3..4ea7bbc 100644
--- a/src/com/android/documentsui/picker/ActionHandler.java
+++ b/src/com/android/documentsui/picker/ActionHandler.java
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.documentsui.picker;
import static android.provider.DocumentsContract.isDocumentUri;
@@ -53,7 +52,6 @@
import com.android.documentsui.Injector;
import com.android.documentsui.MetricConsts;
import com.android.documentsui.Metrics;
-import com.android.documentsui.UserIdManager;
import com.android.documentsui.base.BooleanConsumer;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.DocumentStack;
@@ -84,8 +82,8 @@
private static final String TAG = "PickerActionHandler";
/**
- * Used to prevent applications from using {@link Intent.ACTION_OPEN_DOCUMENT_TREE} and
- * the {@link Intent.ACTION_OPEN_DOCUMENT} actions to request that the user select individual
+ * Used to prevent applications from using {@link Intent#ACTION_OPEN_DOCUMENT_TREE} and
+ * the {@link Intent#ACTION_OPEN_DOCUMENT} actions to request that the user select individual
* files from "/Android/data", "/Android/obb", "/Android/sandbox" directories and all their
* subdirectories (on the external storage), in accordance with the SAF privacy restrictions
* introduced in Android 11 (R).
@@ -100,8 +98,6 @@
private final Features mFeatures;
private final ActivityConfig mConfig;
private final LastAccessedStorage mLastAccessed;
- private final UserIdManager mUserIdManager;
-
private UpdatePickResultTask mUpdatePickResultTask;
ActionHandler(
@@ -112,21 +108,19 @@
SearchViewManager searchMgr,
Lookup<String, Executor> executors,
Injector injector,
- LastAccessedStorage lastAccessed,
- UserIdManager userIdManager) {
+ LastAccessedStorage lastAccessed) {
super(activity, state, providers, docs, searchMgr, executors, injector);
mConfig = injector.config;
mFeatures = injector.features;
mLastAccessed = lastAccessed;
mUpdatePickResultTask = new UpdatePickResultTask(
- activity.getApplicationContext(), mInjector.pickResult);
- mUserIdManager = userIdManager;
+ activity.getApplicationContext(), mInjector.pickResult);
}
@Override
public void initLocation(Intent intent) {
- assert(intent != null);
+ assert (intent != null);
// stack is initialized if it's restored from bundle, which means we're restoring a
// previously stored state.
@@ -247,7 +241,7 @@
final String docId = DocumentsContract.getDocumentId(uri);
final String filePath;
try {
- filePath = FileUtils.getPathFromStorageDocId(docId);
+ filePath = FileUtils.getPathFromStorageDocId(docId);
} catch (IOException e) {
Log.w(TAG, "Could not get canonical file path from docId '" + docId + "'");
return true;
@@ -431,7 +425,7 @@
}
void pickDocument(FragmentManager fm, DocumentInfo pickTarget) {
- assert(pickTarget != null);
+ assert (pickTarget != null);
mInjector.pickResult.increaseActionCount();
Uri result;
switch (mState.action) {
@@ -450,7 +444,7 @@
void saveDocument(
String mimeType, String displayName, BooleanConsumer inProgressStateListener) {
- assert(mState.action == ACTION_CREATE);
+ assert (mState.action == ACTION_CREATE);
mInjector.pickResult.increaseActionCount();
new CreatePickedDocumentTask(
mActivity,
@@ -467,9 +461,9 @@
// User requested to overwrite a target. If confirmed by user #finishPicking() will be
// called.
void saveDocument(FragmentManager fm, DocumentInfo replaceTarget) {
- assert(mState.action == ACTION_CREATE);
+ assert (mState.action == ACTION_CREATE);
mInjector.pickResult.increaseActionCount();
- assert(replaceTarget != null);
+ assert (replaceTarget != null);
// Adding a confirmation dialog breaks an inherited CTS test (testCreateExisting), so we
// need to add a feature flag to bypass this feature in ARC++ environment.
@@ -488,7 +482,7 @@
() -> {
onPickFinished(docs);
}
- ) .executeOnExecutor(getExecutorForCurrentDirectory());
+ ).executeOnExecutor(getExecutorForCurrentDirectory());
}
private void onPickFinished(Uri... uris) {
@@ -509,7 +503,7 @@
}
updatePickResult(
- intent, mSearchMgr.isSearching(), Metrics.sanitizeRoot(mState.stack.getRoot()));
+ intent, mSearchMgr.isSearching(), Metrics.sanitizeRoot(mState.stack.getRoot()));
// TODO: Separate this piece of logic per action.
// We don't instantiate different objects for different actions at the first place, so it's
@@ -558,4 +552,4 @@
@VisibleForTesting
void setResult(int resultCode, Intent result, int notUsed);
}
-}
+}
\ No newline at end of file
diff --git a/src/com/android/documentsui/picker/PickActivity.java b/src/com/android/documentsui/picker/PickActivity.java
index c2fbd50..2061a8f 100644
--- a/src/com/android/documentsui/picker/PickActivity.java
+++ b/src/com/android/documentsui/picker/PickActivity.java
@@ -85,8 +85,15 @@
}
// make these methods visible in this package to work around compiler bug http://b/62218600
- @Override protected boolean focusSidebar() { return super.focusSidebar(); }
- @Override protected boolean popDir() { return super.popDir(); }
+ @Override
+ protected boolean focusSidebar() {
+ return super.focusSidebar();
+ }
+
+ @Override
+ protected boolean popDir() {
+ return super.popDir();
+ }
@Override
public void onCreate(Bundle icicle) {
@@ -99,7 +106,8 @@
new MessageBuilder(this),
DialogController.create(features, this),
DocumentsApplication.getFileTypeLookup(this),
- (Collection<RootInfo> roots) -> {});
+ (Collection<RootInfo> roots) -> {
+ });
super.onCreate(icicle);
@@ -138,15 +146,13 @@
mSearchManager,
ProviderExecutor::forAuthority,
mInjector,
- LastAccessedStorage.create(),
- mUserIdManager);
+ LastAccessedStorage.create());
mInjector.searchManager = mSearchManager;
Intent intent = getIntent();
- mAppsRowManager = new AppsRowManager(mInjector.actions, mState.supportsCrossProfile(),
- mUserIdManager);
+ mAppsRowManager = getAppsRowManager();
mInjector.appsRowManager = mAppsRowManager;
mSharedInputHandler =
@@ -163,6 +169,14 @@
Metrics.logPickerLaunchedFrom(Shared.getCallingPackageName(this));
}
+ private AppsRowManager getAppsRowManager() {
+ return mConfigStore.isPrivateSpaceInDocsUIEnabled()
+ ? new AppsRowManager(mInjector.actions, mState.supportsCrossProfile(),
+ mUserManagerState, mConfigStore)
+ : new AppsRowManager(mInjector.actions, mState.supportsCrossProfile(),
+ mUserIdManager, mConfigStore);
+ }
+
@Override
public void onBackPressed() {
super.onBackPressed();
@@ -203,7 +217,7 @@
final String title = intent.getStringExtra(Intent.EXTRA_TITLE);
SaveFragment.show(getSupportFragmentManager(), mimeType, title);
} else if (mState.action == ACTION_OPEN_TREE ||
- mState.action == ACTION_PICK_COPY_DESTINATION) {
+ mState.action == ACTION_PICK_COPY_DESTINATION) {
PickFragment.show(getSupportFragmentManager());
} else {
// If PickFragment or SaveFragment does not show,
@@ -215,10 +229,15 @@
final Intent moreApps = new Intent(intent);
moreApps.setComponent(null);
moreApps.setPackage(null);
- if (mState.supportsCrossProfile()
- && CrossProfileUtils.getCrossProfileResolveInfo(
- getPackageManager(), moreApps) != null) {
- mState.canShareAcrossProfile = true;
+ if (mState.supportsCrossProfile) {
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ mState.canForwardToProfileIdMap = mUserManagerState.getCanForwardToProfileIdMap(
+ moreApps);
+ } else if (CrossProfileUtils.getCrossProfileResolveInfo(UserId.CURRENT_USER,
+ getPackageManager(), moreApps, getApplicationContext(),
+ mConfigStore.isPrivateSpaceInDocsUIEnabled()) != null) {
+ mState.canShareAcrossProfile = true;
+ }
}
if (mState.action == ACTION_GET_CONTENT
@@ -345,8 +364,8 @@
MimeTypes.VISUAL_MIMES, mState.acceptMimes);
mState.derivedMode = visualMimes ? State.MODE_GRID : State.MODE_LIST;
} else {
- // Normal boring directory
- DirectoryFragment.showDirectory(fm, root, cwd, anim);
+ // Normal boring directory
+ DirectoryFragment.showDirectory(fm, root, cwd, anim);
}
// Forget any replacement target
@@ -358,7 +377,7 @@
}
if (mState.action == ACTION_OPEN_TREE ||
- mState.action == ACTION_PICK_COPY_DESTINATION) {
+ mState.action == ACTION_PICK_COPY_DESTINATION) {
final PickFragment pick = PickFragment.get(fm);
if (pick != null) {
pick.setPickTarget(mState.action,
@@ -369,7 +388,7 @@
@Override
protected void onDirectoryCreated(DocumentInfo doc) {
- assert(doc.isDirectory());
+ assert (doc.isDirectory());
mInjector.actions.openContainerDocument(doc);
}
diff --git a/src/com/android/documentsui/queries/SearchViewManager.java b/src/com/android/documentsui/queries/SearchViewManager.java
index b0c2987..053dc93 100644
--- a/src/com/android/documentsui/queries/SearchViewManager.java
+++ b/src/com/android/documentsui/queries/SearchViewManager.java
@@ -227,7 +227,7 @@
mSearchView.setOnCloseListener(this);
mSearchView.setOnSearchClickListener(this);
mSearchView.setOnQueryTextFocusChangeListener(this);
- final View clearButton = mSearchView.findViewById(R.id.search_close_btn);
+ final View clearButton = mSearchView.findViewById(androidx.appcompat.R.id.search_close_btn);
if (clearButton != null) {
clearButton.setPadding(clearButton.getPaddingStart() + getPixelForDp(4),
clearButton.getPaddingTop(), clearButton.getPaddingEnd() + getPixelForDp(4),
@@ -239,7 +239,7 @@
});
}
if (SdkLevel.isAtLeastU()) {
- final View textView = mSearchView.findViewById(R.id.search_src_text);
+ final View textView = mSearchView.findViewById(androidx.appcompat.R.id.search_src_text);
if (textView != null) {
try {
textView.setIsHandwritingDelegate(true);
diff --git a/src/com/android/documentsui/roots/ProvidersCache.java b/src/com/android/documentsui/roots/ProvidersCache.java
index e053b45..080b729 100644
--- a/src/com/android/documentsui/roots/ProvidersCache.java
+++ b/src/com/android/documentsui/roots/ProvidersCache.java
@@ -49,9 +49,11 @@
import androidx.annotation.Nullable;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.DocumentsApplication;
import com.android.documentsui.R;
import com.android.documentsui.UserIdManager;
+import com.android.documentsui.UserManagerState;
import com.android.documentsui.UserPackage;
import com.android.documentsui.archives.ArchivesProvider;
import com.android.documentsui.base.LookupApplicationName;
@@ -90,10 +92,10 @@
// empty results we don't cache them...unless they're in this magical list
// of beloved providers.
private static final List<String> PERMIT_EMPTY_CACHE = List.of(
- // MTP provider commonly returns no roots (if no devices are attached).
- Providers.AUTHORITY_MTP,
- // ArchivesProvider doesn't support any roots.
- ArchivesProvider.AUTHORITY);
+ // MTP provider commonly returns no roots (if no devices are attached).
+ Providers.AUTHORITY_MTP,
+ // ArchivesProvider doesn't support any roots.
+ ArchivesProvider.AUTHORITY);
private static final int FIRST_LOAD_TIMEOUT_MS = 5000;
private final Context mContext;
@@ -122,13 +124,32 @@
private final Map<UserAuthority, PackageDetails> mObservedAuthoritiesDetails = new HashMap<>();
private final UserIdManager mUserIdManager;
+ private final UserManagerState mUserManagerState;
+ private final ConfigStore mConfigStore;
- public ProvidersCache(Context context, UserIdManager userIdManager) {
+ public ProvidersCache(Context context, UserIdManager userIdManager, ConfigStore configStore) {
mContext = context;
mUserIdManager = userIdManager;
+ mUserManagerState = null;
+ mConfigStore = configStore;
}
- private RootInfo generateRecentsRoot(UserId rootUserId) {
+ public ProvidersCache(Context context, UserManagerState userManagerState,
+ ConfigStore configStore) {
+ mContext = context;
+ mUserIdManager = null;
+ mUserManagerState = userManagerState;
+ mConfigStore = configStore;
+ }
+
+ public boolean isProvidersCacheUsingUserManagerState() {
+ return mUserManagerState != null;
+ }
+
+ /**
+ * Generates recent root for the provided user id
+ */
+ public RootInfo generateRecentsRoot(UserId rootUserId) {
return new RootInfo() {{
// Special root for recents
userId = rootUserId;
@@ -199,7 +220,8 @@
// For that reason we update our RecentsRoot to reflect
// the current language.
final String title = mContext.getString(R.string.root_recent);
- for (UserId userId : mUserIdManager.getUserIds()) {
+ List<UserId> userIds = getUserIds();
+ for (UserId userId : userIds) {
RootInfo recentRoot = createOrGetRecentsRoot(userId);
recentRoot.title = title;
// Nothing else about the root should ever change.
@@ -509,11 +531,12 @@
/**
* Create task to update roots cache.
*
- * @param forceRefreshAll when true, all previously cached values for
- * all packages should be ignored.
+ * @param forceRefreshAll when true, all previously cached values for
+ * all packages should be ignored.
* @param forceRefreshUserPackage when non-null, all previously cached
- * values for this specific user package should be ignored.
- * @param callback when non-null, it will be invoked after the task is executed.
+ * values for this specific user package should be ignored.
+ * @param callback when non-null, it will be invoked after the task is
+ * executed.
*/
MultiProviderUpdateTask(
boolean forceRefreshAll,
@@ -536,7 +559,8 @@
final long start = SystemClock.elapsedRealtime();
- for (UserId userId : mUserIdManager.getUserIds()) {
+ List<UserId> userIds = getUserIds();
+ for (UserId userId : userIds) {
final RootInfo recents = createOrGetRecentsRoot(userId);
synchronized (mLock) {
mLocalRoots.put(new UserAuthority(recents.userId, recents.authority), recents);
@@ -544,7 +568,7 @@
}
List<SingleProviderUpdateTaskInfo> taskInfos = new ArrayList<>();
- for (UserId userId : mUserIdManager.getUserIds()) {
+ for (UserId userId : userIds) {
final PackageManager pm = userId.getPackageManager(mContext);
// Pick up provider with action string
final Intent intent = new Intent(DocumentsContract.PROVIDER_INTERFACE);
@@ -561,7 +585,7 @@
CountDownLatch updateTaskInternalCountDown = new CountDownLatch(taskInfos.size());
ExecutorService executor = MoreExecutors.getExitingExecutorService(
(ThreadPoolExecutor) Executors.newCachedThreadPool());
- for (SingleProviderUpdateTaskInfo taskInfo: taskInfos) {
+ for (SingleProviderUpdateTaskInfo taskInfo : taskInfos) {
executor.submit(() ->
startSingleProviderUpdateTask(
taskInfo.providerInfo,
@@ -701,4 +725,11 @@
packageName = pckgName;
}
}
+
+ private List<UserId> getUserIds() {
+ if (mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
+ return mUserManagerState.getUserIds();
+ }
+ return mUserIdManager.getUserIds();
+ }
}
diff --git a/src/com/android/documentsui/sidebar/RootsFragment.java b/src/com/android/documentsui/sidebar/RootsFragment.java
index 49710e1..f5be6c2 100644
--- a/src/com/android/documentsui/sidebar/RootsFragment.java
+++ b/src/com/android/documentsui/sidebar/RootsFragment.java
@@ -63,6 +63,7 @@
import com.android.documentsui.Injector.Injected;
import com.android.documentsui.ItemDragListener;
import com.android.documentsui.R;
+import com.android.documentsui.UserManagerState;
import com.android.documentsui.UserPackage;
import com.android.documentsui.base.BooleanConsumer;
import com.android.documentsui.base.DocumentInfo;
@@ -130,11 +131,12 @@
/**
* Shows the {@link RootsFragment}.
- * @param fm the FragmentManager for interacting with fragments associated with this
- * fragment's activity
+ *
+ * @param fm the FragmentManager for interacting with fragments associated with this
+ * fragment's activity
* @param includeApps if {@code true}, query the intent from the system and include apps in
* the {@RootsFragment}.
- * @param intent the intent to query for package manager
+ * @param intent the intent to query for package manager
*/
public static RootsFragment show(FragmentManager fm, boolean includeApps, Intent intent) {
final Bundle args = new Bundle();
@@ -184,8 +186,8 @@
});
}
return false;
- }
- });
+ }
+ });
mList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
mList.setSelector(new ColorDrawable(Color.TRANSPARENT));
return view;
@@ -265,11 +267,26 @@
// For action which supports cross profile, update the policy value in state if
// necessary.
ResolveInfo crossProfileResolveInfo = null;
+ UserManagerState userManagerState = null;
if (state.supportsCrossProfile() && handlerAppIntent != null) {
- crossProfileResolveInfo = CrossProfileUtils.getCrossProfileResolveInfo(
- getContext().getPackageManager(), handlerAppIntent);
- updateCrossProfileStateAndMaybeRefresh(
- /* canShareAcrossProfile= */ crossProfileResolveInfo != null);
+ if (state.configStore.isPrivateSpaceInDocsUIEnabled()) {
+ userManagerState = DocumentsApplication.getUserManagerState(getContext());
+ Map<UserId, Boolean> canForwardToProfileIdMap =
+ userManagerState.getCanForwardToProfileIdMap(handlerAppIntent);
+ updateCrossProfileMapStateAndMaybeRefresh(canForwardToProfileIdMap);
+ } else {
+ crossProfileResolveInfo = CrossProfileUtils.getCrossProfileResolveInfo(
+ UserId.CURRENT_USER, getContext().getPackageManager(),
+ handlerAppIntent, getContext(),
+ state.configStore.isPrivateSpaceInDocsUIEnabled());
+ updateCrossProfileStateAndMaybeRefresh(
+ /* canShareAcrossProfile= */ crossProfileResolveInfo != null);
+ }
+ }
+
+ if (state.configStore.isPrivateSpaceInDocsUIEnabled()
+ && userManagerState == null) {
+ userManagerState = DocumentsApplication.getUserManagerState(getContext());
}
List<Item> sortedItems = sortLoadResult(
@@ -280,8 +297,9 @@
shouldIncludeHandlerApp ? handlerAppIntent : null,
DocumentsApplication.getProvidersCache(getContext()),
getBaseActivity().getSelectedUser(),
- DocumentsApplication.getUserIdManager(getContext()).getUserIds(),
- maybeShowBadge);
+ getUserIds(),
+ maybeShowBadge,
+ userManagerState);
// This will be removed when feature flag is removed.
if (crossProfileResolveInfo != null && !Features.CROSS_PROFILE_TABS) {
@@ -316,6 +334,13 @@
onCurrentRootChanged();
}
+ private List<UserId> getUserIds() {
+ if (state.configStore.isPrivateSpaceInDocsUIEnabled()) {
+ return DocumentsApplication.getUserManagerState(getContext()).getUserIds();
+ }
+ return DocumentsApplication.getUserIdManager(getContext()).getUserIds();
+ }
+
@Override
public void onLoaderReset(Loader<Collection<RootInfo>> loader) {
mAdapter = null;
@@ -338,12 +363,24 @@
}
}
+ private void updateCrossProfileMapStateAndMaybeRefresh(
+ Map<UserId, Boolean> canForwardToProfileIdMap) {
+ final State state = getBaseActivity().getDisplayState();
+ if (!state.canForwardToProfileIdMap.equals(canForwardToProfileIdMap)) {
+ state.canForwardToProfileIdMap = canForwardToProfileIdMap;
+ if (!UserId.CURRENT_USER.equals(getBaseActivity().getSelectedUser())) {
+ mActionHandler.loadDocumentsForCurrentStack();
+ }
+ }
+ }
+
/**
* If the package name of other providers or apps capable of handling the original intent
* include the preferred root source, it will have higher order than others.
- * @param excludePackage Exclude activities from this given package
+ *
+ * @param excludePackage Exclude activities from this given package
* @param handlerAppIntent When not null, apps capable of handling the original intent will
- * be included in list of roots (in special section at bottom).
+ * be included in list of roots (in special section at bottom).
*/
@VisibleForTesting
List<Item> sortLoadResult(
@@ -355,7 +392,8 @@
ProvidersAccess providersAccess,
UserId selectedUser,
List<UserId> userIds,
- boolean maybeShowBadge) {
+ boolean maybeShowBadge,
+ UserManagerState userManagerState) {
final List<Item> result = new ArrayList<>();
final RootItemListBuilder librariesBuilder = new RootItemListBuilder(selectedUser, userIds);
@@ -401,30 +439,54 @@
final List<Item> rootList = new ArrayList<>();
final List<Item> rootListOtherUser = new ArrayList<>();
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ for (int i = 0; i < userIds.size(); ++i) {
+ rootListAllUsers.add(new ArrayList<>());
+ }
+
mApplicationItemList = new ArrayList<>();
if (handlerAppIntent != null) {
includeHandlerApps(state, handlerAppIntent, excludePackage, rootList, rootListOtherUser,
- otherProviders, userIds, maybeShowBadge);
+ rootListAllUsers, otherProviders, userIds, maybeShowBadge);
} else {
// Only add providers
- Collections.sort(otherProviders, comp);
+ otherProviders.sort(comp);
for (RootItem item : otherProviders) {
- if (UserId.CURRENT_USER.equals(item.userId)) {
- rootList.add(item);
+ if (state.configStore.isPrivateSpaceInDocsUIEnabled()) {
+ createRootListsPrivateSpaceEnabled(item, userIds, rootListAllUsers);
} else {
- rootListOtherUser.add(item);
+ createRootListsPrivateSpaceDisabled(item, rootList, rootListOtherUser);
}
mApplicationItemList.add(item);
}
}
- List<Item> presentableList = new UserItemsCombiner(
- context.getResources(), context.getSystemService(DevicePolicyManager.class), state)
+ List<Item> presentableList =
+ state.configStore.isPrivateSpaceInDocsUIEnabled()
+ ? getPresentableListPrivateSpaceEnabled(
+ context, state, rootListAllUsers, userIds, userManagerState) :
+ getPresentableListPrivateSpaceDisabled(context, state, rootList,
+ rootListOtherUser);
+ addListToResult(result, presentableList);
+ return result;
+ }
+
+ private List<Item> getPresentableListPrivateSpaceEnabled(Context context, State state,
+ List<List<Item>> rootListAllUsers, List<UserId> userIds,
+ UserManagerState userManagerState) {
+ return new UserItemsCombiner(context.getResources(),
+ context.getSystemService(DevicePolicyManager.class), state)
+ .setRootListForAllUsers(rootListAllUsers)
+ .createPresentableListForAllUsers(userIds, userManagerState.getUserIdToLabelMap());
+ }
+
+ private List<Item> getPresentableListPrivateSpaceDisabled(Context context, State state,
+ List<Item> rootList, List<Item> rootListOtherUser) {
+ return new UserItemsCombiner(context.getResources(),
+ context.getSystemService(DevicePolicyManager.class), state)
.setRootListForCurrentUser(rootList)
.setRootListForOtherUser(rootListOtherUser)
.createPresentableList();
- addListToResult(result, presentableList);
- return result;
}
private void addListToResult(List<Item> result, List<Item> rootList) {
@@ -440,8 +502,8 @@
*/
private void includeHandlerApps(State state,
Intent handlerAppIntent, @Nullable String excludePackage, List<Item> rootList,
- List<Item> rootListOtherUser, List<RootItem> otherProviders, List<UserId> userIds,
- boolean maybeShowBadge) {
+ List<Item> rootListOtherUser, List<List<Item>> rootListAllUsers,
+ List<RootItem> otherProviders, List<UserId> userIds, boolean maybeShowBadge) {
if (VERBOSE) Log.v(TAG, "Adding handler apps for intent: " + handlerAppIntent);
Context context = getContext();
@@ -494,29 +556,49 @@
item = rootItem;
}
- if (UserId.CURRENT_USER.equals(item.userId)) {
- if (VERBOSE) Log.v(TAG, "Adding provider : " + item);
- rootList.add(item);
+ if (state.configStore.isPrivateSpaceInDocsUIEnabled()) {
+ createRootListsPrivateSpaceEnabled(item, userIds, rootListAllUsers);
} else {
- if (VERBOSE) Log.v(TAG, "Adding provider to other users : " + item);
- rootListOtherUser.add(item);
+ createRootListsPrivateSpaceDisabled(item, rootList, rootListOtherUser);
}
}
for (Item item : appItems.values()) {
- if (UserId.CURRENT_USER.equals(item.userId)) {
- rootList.add(item);
+ if (state.configStore.isPrivateSpaceInDocsUIEnabled()) {
+ createRootListsPrivateSpaceEnabled(item, userIds, rootListAllUsers);
} else {
- rootListOtherUser.add(item);
+ createRootListsPrivateSpaceDisabled(item, rootList, rootListOtherUser);
}
}
final String preferredRootPackage = getResources().getString(
R.string.preferred_root_package, "");
final ItemComparator comp = new ItemComparator(preferredRootPackage);
- Collections.sort(rootList, comp);
- Collections.sort(rootListOtherUser, comp);
+ if (state.configStore.isPrivateSpaceInDocsUIEnabled()) {
+ addToApplicationItemListPrivateSpaceEnabled(userIds, rootListAllUsers, comp, state);
+ } else {
+ addToApplicationItemListPrivateSpaceDisabled(rootList, rootListOtherUser, comp, state);
+ }
+
+ }
+
+ private void addToApplicationItemListPrivateSpaceEnabled(List<UserId> userIds,
+ List<List<Item>> rootListAllUsers, ItemComparator comp, State state) {
+ for (int i = 0; i < userIds.size(); ++i) {
+ rootListAllUsers.get(i).sort(comp);
+ if (UserId.CURRENT_USER.equals(userIds.get(i))) {
+ mApplicationItemList.addAll(rootListAllUsers.get(i));
+ } else if (state.supportsCrossProfile && state.canInteractWith(userIds.get(i))) {
+ mApplicationItemList.addAll(rootListAllUsers.get(i));
+ }
+ }
+ }
+
+ private void addToApplicationItemListPrivateSpaceDisabled(List<Item> rootList,
+ List<Item> rootListOtherUser, ItemComparator comp, State state) {
+ rootList.sort(comp);
+ rootListOtherUser.sort(comp);
if (state.supportsCrossProfile() && state.canShareAcrossProfile) {
mApplicationItemList.addAll(rootList);
mApplicationItemList.addAll(rootListOtherUser);
@@ -525,6 +607,25 @@
}
}
+ private void createRootListsPrivateSpaceEnabled(Item item, List<UserId> userIds,
+ List<List<Item>> rootListAllUsers) {
+ for (int i = 0; i < userIds.size(); ++i) {
+ if (userIds.get(i).equals(item.userId)) {
+ rootListAllUsers.get(i).add(item);
+ break;
+ }
+ }
+ }
+
+ private void createRootListsPrivateSpaceDisabled(Item item, List<Item> rootList,
+ List<Item> rootListOtherUser) {
+ if (UserId.CURRENT_USER.equals(item.userId)) {
+ rootList.add(item);
+ } else {
+ rootListOtherUser.add(item);
+ }
+ }
+
@Override
public void onResume() {
super.onResume();
@@ -649,8 +750,8 @@
}
static void ejectClicked(View ejectIcon, RootInfo root, ActionHandler actionHandler) {
- assert(ejectIcon != null);
- assert(!root.ejecting);
+ assert (ejectIcon != null);
+ assert (!root.ejecting);
ejectIcon.setEnabled(false);
root.ejecting = true;
actionHandler.ejectRoot(
diff --git a/src/com/android/documentsui/sidebar/UserItemsCombiner.java b/src/com/android/documentsui/sidebar/UserItemsCombiner.java
index 1a68ca7..564a511 100644
--- a/src/com/android/documentsui/sidebar/UserItemsCombiner.java
+++ b/src/com/android/documentsui/sidebar/UserItemsCombiner.java
@@ -36,6 +36,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* Converts user-specific lists of items into a single merged list appropriate for displaying in the
@@ -49,6 +50,7 @@
private final State mState;
private List<Item> mRootList;
private List<Item> mRootListOtherUser;
+ private List<List<Item>> mRootListAllUsers;
UserItemsCombiner(Resources resources, DevicePolicyManager dpm, State state) {
mCurrentUser = UserId.CURRENT_USER;
@@ -73,6 +75,11 @@
return this;
}
+ UserItemsCombiner setRootListForAllUsers(List<List<Item>> listOfRootLists) {
+ mRootListAllUsers = checkNotNull(listOfRootLists);
+ return this;
+ }
+
/**
* Returns a combined lists from the provided lists. {@link HeaderItem}s indicating profile
* will be added if the list of current user and the other user are not empty.
@@ -109,6 +116,52 @@
return result;
}
+ public List<Item> createPresentableListForAllUsers(List<UserId> userIds,
+ Map<UserId, String> userIdToLabelMap) {
+
+ checkArgument(mRootListAllUsers != null, "RootListForAllUsers is not set");
+
+ final List<Item> result = new ArrayList<>();
+ if (mState.supportsCrossProfile()) {
+ // headerItemList will hold headers for userIds that are accessible, and
+ final List<Item> headerItemList = new ArrayList<>();
+ int accessibleProfilesCount = 0;
+ for (int i = 0; i < userIds.size(); ++i) {
+ // The received user id list contains all users present on the device,
+ // the headerItemList will contain header item or null at the same index as
+ // the user id in the received list
+ if (mState.canInteractWith(userIds.get(i))
+ && !mRootListAllUsers.get(i).isEmpty()) {
+ accessibleProfilesCount += 1;
+ headerItemList.add(new HeaderItem(userIdToLabelMap.get(userIds.get(i))));
+ } else {
+ headerItemList.add(null);
+ }
+ }
+ // Do not add header item if:
+ // 1. only the current profile is accessible
+ // 2. only one profile has non-empty root item list
+ if (accessibleProfilesCount == 1) {
+ for (int i = 0; i < userIds.size(); ++i) {
+ if (headerItemList.get(i) == null) continue;
+ result.addAll(mRootListAllUsers.get(i));
+ break;
+ }
+ } else {
+ for (int i = 0; i < userIds.size(); ++i) {
+ // Since the header item and the corresponding accessible user id share the same
+ // index we add the user id along with its non-null header to the result.
+ if (headerItemList.get(i) == null) continue;
+ result.add(headerItemList.get(i));
+ result.addAll(mRootListAllUsers.get(i));
+ }
+ }
+ } else {
+ result.addAll(mRootListAllUsers.get(userIds.indexOf(mCurrentUser)));
+ }
+ return result;
+ }
+
private String getEnterpriseString(String updatableStringId, int defaultStringId) {
if (SdkLevel.isAtLeastT()) {
return getUpdatableEnterpriseString(updatableStringId, defaultStringId);
diff --git a/src/com/android/documentsui/util/CrossProfileUtils.java b/src/com/android/documentsui/util/CrossProfileUtils.java
index e60ffdd..3b53847 100644
--- a/src/com/android/documentsui/util/CrossProfileUtils.java
+++ b/src/com/android/documentsui/util/CrossProfileUtils.java
@@ -16,16 +16,27 @@
package com.android.documentsui.util;
+import android.annotation.TargetApi;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.content.pm.UserProperties;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
import androidx.annotation.Nullable;
+import com.android.documentsui.base.UserId;
+import com.android.modules.utils.build.SdkLevel;
+
/**
* A utility class for cross-profile usage.
*/
public class CrossProfileUtils {
+
+ private static final String TAG = "CrossProfileUtils";
private static final String PROFILE_TARGET_ACTIVITY =
"com.android.internal.app.IntentForwarderActivity";
@@ -46,11 +57,55 @@
}
/**
- * Returns the {@ResolveInfo} if this intent is a cross-profile intent or {@code null}
+ * Returns the {@link ResolveInfo} if this intent is a cross-profile intent or {@code null}
* otherwise.
*/
@Nullable
- public static ResolveInfo getCrossProfileResolveInfo(PackageManager packageManager,
+ public static ResolveInfo getCrossProfileResolveInfo(UserId currentUser,
+ PackageManager packageManager, Intent intent, Context context,
+ boolean isPrivateSpaceEnabled) {
+ if (isPrivateSpaceEnabled && SdkLevel.isAtLeastV()) {
+ return getCrossProfileResolveInfoPostV(currentUser, packageManager,
+ intent, context);
+ }
+ return getCrossProfileResolveInfoPreV(packageManager, intent);
+ }
+
+ @Nullable
+ @TargetApi(35)
+ private static ResolveInfo getCrossProfileResolveInfoPostV(
+ UserId currentUser, PackageManager packageManager,
+ Intent intent, Context context) {
+ UserManager userManager = context.getSystemService(UserManager.class);
+ UserHandle queringUser = UserHandle.of(currentUser.getIdentifier());
+ if (userManager == null) {
+ Log.e(TAG, "cannot obtain user manager");
+ return null;
+ }
+
+ UserProperties userProperties = userManager.getUserProperties(queringUser);
+ if (userProperties == null) {
+ Log.e(TAG, "cannot obtain user properties");
+ return null;
+ }
+
+ if (userProperties.getCrossProfileContentSharingStrategy()
+ == UserProperties.CROSS_PROFILE_CONTENT_SHARING_DELEGATE_FROM_PARENT) {
+ queringUser = userManager.getProfileParent(queringUser);
+ }
+
+ for (ResolveInfo info : packageManager.queryIntentActivitiesAsUser(intent,
+ PackageManager.MATCH_DEFAULT_ONLY, queringUser)) {
+ if (isCrossProfileIntentForwarderActivity(info)) {
+ return info;
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ private static ResolveInfo getCrossProfileResolveInfoPreV(
+ PackageManager packageManager,
Intent intent) {
for (ResolveInfo info : packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY)) {
diff --git a/tests/Android.bp b/tests/Android.bp
index 65a4bbd..334901d 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -16,35 +16,79 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
-filegroup {
- name: "DocumentsUIPerfTests-files",
+java_defaults {
+ name: "DocumentsUITests-defaults",
+ libs: [
+ "android.test.base",
+ "android.test.mock",
+ "android.test.runner",
+ ],
+
+ static_libs: [
+ "DocumentsUI-lib",
+ "androidx.test.rules",
+ "androidx.test.espresso.core",
+ "androidx.test.ext.truth",
+ "guava",
+ "mockito-target",
+ "androidx.test.uiautomator_uiautomator",
+ ],
+}
+
+android_library {
+ name: "DocumentsUIPerfTests-lib",
srcs: [
"common/com/android/documentsui/**/*.java",
"functional/com/android/documentsui/ActivityTest.java",
],
+ resource_dirs: [],
+ libs: [
+ "android.test.base",
+ "android.test.mock",
+ "android.test.runner",
+ "DocumentsUI-lib",
+ ],
+
+ static_libs: [
+ "androidx.legacy_legacy-support-v4",
+ "androidx.test.rules",
+ "androidx.test.espresso.core",
+ "mockito-target",
+ "ub-janktesthelper",
+ "androidx.test.uiautomator_uiautomator",
+ ],
}
-filegroup {
- name: "DocumentsUITests-srcs",
+android_library {
+ name: "DocumentsUIUnitTests-lib",
+ defaults: ["DocumentsUITests-defaults"],
+
+ manifest: "AndroidManifestUnitTests.xml",
+
+ srcs: [
+ "common/**/*.java",
+ "unit/**/*.java",
+ ],
+
+ resource_dirs: [
+ "res",
+ ],
+
+ min_sdk_version: "29",
+ target_sdk_version: "29",
+}
+
+android_library {
+ name: "DocumentsUITests-lib",
+ defaults: ["DocumentsUITests-defaults"],
+
+ manifest: "AndroidManifest.xml",
+
srcs: [
"common/**/*.java",
"functional/**/*.java",
"unit/**/*.java",
],
-}
-
-filegroup {
- name: "DocumentsUIUnitTests-srcs",
- srcs: [
- "common/**/*.java",
- "unit/**/*.java",
- ],
-}
-
-android_library {
- name: "DocumentsUITests-res-lib",
-
- manifest: "AndroidManifest.xml",
asset_dirs: [
"assets",
@@ -57,45 +101,25 @@
aaptflags: [
// pack some raw file locate in assets folder
"-0 .zip",
- "--auto-add-overlay",
],
- min_sdk_version : "29",
- target_sdk_version : "29",
+ min_sdk_version: "29",
+ target_sdk_version: "29",
+ lint: {
+ baseline_filename: "lint-baseline.xml",
+ },
}
android_test {
name: "DocumentsUITests",
+ defaults: ["DocumentsUITests-defaults"],
manifest: "AndroidManifest.xml",
- srcs: [
- "common/**/*.java",
- "functional/**/*.java",
- "unit/**/*.java",
- ],
-
- resource_dirs: [
- "res",
- ],
-
- aaptflags: [
- "-0 .zip",
- ],
-
- libs: [
- "android.test.base",
- "android.test.mock",
- "android.test.runner",
- ],
+ resource_dirs: [],
static_libs: [
- "androidx.test.rules",
- "androidx.test.espresso.core",
- "androidx.test.ext.truth",
- "guava",
- "mockito-target",
- "androidx.test.uiautomator_uiautomator",
+ "DocumentsUITests-lib",
],
jarjar_rules: "jarjar-rules.txt",
@@ -110,6 +134,6 @@
certificate: "platform",
instrumentation_for: "DocumentsUI",
- min_sdk_version : "29",
- target_sdk_version : "29",
+ min_sdk_version: "29",
+ target_sdk_version: "29",
}
diff --git a/tests/AndroidManifestUnitTests.xml b/tests/AndroidManifestUnitTests.xml
new file mode 100644
index 0000000..13d7a08
--- /dev/null
+++ b/tests/AndroidManifestUnitTests.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.documentsui.tests">
+
+</manifest>
diff --git a/tests/common/com/android/documentsui/TestActivity.java b/tests/common/com/android/documentsui/TestActivity.java
index eb321fa..5aa3faa 100644
--- a/tests/common/com/android/documentsui/TestActivity.java
+++ b/tests/common/com/android/documentsui/TestActivity.java
@@ -260,6 +260,14 @@
}
@Override
+ public final String getSystemServiceName(Class<?> serviceName) {
+ if (serviceName == UserManager.class) {
+ return Context.USER_SERVICE;
+ }
+ throw new IllegalArgumentException("Unknown service name " + serviceName);
+ }
+
+ @Override
public final void finish() {
finishedHandler.accept(null);
}
diff --git a/tests/common/com/android/documentsui/TestConfigStore.java b/tests/common/com/android/documentsui/TestConfigStore.java
new file mode 100644
index 0000000..2e29b0c
--- /dev/null
+++ b/tests/common/com/android/documentsui/TestConfigStore.java
@@ -0,0 +1,41 @@
+/*
+ * 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.documentsui;
+
+import com.android.modules.utils.build.SdkLevel;
+
+public class TestConfigStore implements ConfigStore {
+ private boolean mIsPrivateSpaceEnabled = false;
+
+ /**
+ * Enables private space flag for PhotoPicker in test config
+ */
+ public void enablePrivateSpaceInPhotoPicker() {
+ mIsPrivateSpaceEnabled = true;
+ }
+ /**
+ * Disables private space flag for PhotoPicker in test config
+ */
+ public void disablePrivateSpaceInPhotoPicker() {
+ mIsPrivateSpaceEnabled = false;
+ }
+
+ @Override
+ public boolean isPrivateSpaceInDocsUIEnabled() {
+ return SdkLevel.isAtLeastS() && mIsPrivateSpaceEnabled;
+ }
+}
diff --git a/tests/common/com/android/documentsui/TestUserManagerState.java b/tests/common/com/android/documentsui/TestUserManagerState.java
new file mode 100644
index 0000000..8dbe62a
--- /dev/null
+++ b/tests/common/com/android/documentsui/TestUserManagerState.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.documentsui;
+
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+
+import com.android.documentsui.base.UserId;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class TestUserManagerState implements UserManagerState {
+
+ public List<UserId> userIds = new ArrayList<>();
+ public Map<UserId, String> userIdToLabelMap = new HashMap<>();
+ public Map<UserId, Boolean> canFrowardToProfileIdMap = new HashMap<>();
+ public Map<UserId, Drawable> userIdToBadgeMap = new HashMap<>();
+ public String profileLabel = "Test";
+ public Drawable profileBadge = null;
+
+ @Override
+ public List<UserId> getUserIds() {
+ return userIds;
+ }
+
+ @Override
+ public Map<UserId, String> getUserIdToLabelMap() {
+ return userIdToLabelMap;
+ }
+
+ @Override
+ public Map<UserId, Drawable> getUserIdToBadgeMap() {
+ return userIdToBadgeMap;
+ }
+
+ @Override
+ public Map<UserId, Boolean> getCanForwardToProfileIdMap(Intent intent) {
+ return canFrowardToProfileIdMap;
+ }
+
+ @Override
+ public void onProfileActionStatusChange(String action, UserId userId) {
+ if (Intent.ACTION_PROFILE_UNAVAILABLE.equals(action)) {
+ userIds.remove(userId);
+ userIdToLabelMap.remove(userId);
+ userIdToBadgeMap.remove(userId);
+ canFrowardToProfileIdMap.put(userId, false);
+ return;
+ }
+ if (!userIds.contains(userId)) {
+ userIds.add(userId);
+ }
+ userIdToLabelMap.put(userId, profileLabel);
+ userIdToBadgeMap.put(userId, profileBadge);
+ canFrowardToProfileIdMap.put(userId, true);
+ }
+}
diff --git a/tests/common/com/android/documentsui/bots/SearchBot.java b/tests/common/com/android/documentsui/bots/SearchBot.java
index 51f9394..bde74ca 100644
--- a/tests/common/com/android/documentsui/bots/SearchBot.java
+++ b/tests/common/com/android/documentsui/bots/SearchBot.java
@@ -33,12 +33,13 @@
import android.content.Context;
import android.view.View;
-import androidx.recyclerview.R;
import androidx.test.uiautomator.UiDevice;
import androidx.test.uiautomator.UiObject;
import androidx.test.uiautomator.UiObjectNotFoundException;
import androidx.test.uiautomator.UiSelector;
+import com.android.documentsui.R;
+
import org.hamcrest.Matcher;
/**
@@ -60,7 +61,7 @@
// require this input be not clickable.
@SuppressWarnings("unchecked")
private static final Matcher<View> SEARCH_INPUT = allOf(
- withId(R.id.search_src_text),
+ withId(androidx.appcompat.R.id.search_src_text),
isDisplayed());
public SearchBot(UiDevice device, Context context, int timeout) {
diff --git a/tests/common/com/android/documentsui/dirlist/TestContext.java b/tests/common/com/android/documentsui/dirlist/TestContext.java
index d5122f2..29047a4 100644
--- a/tests/common/com/android/documentsui/dirlist/TestContext.java
+++ b/tests/common/com/android/documentsui/dirlist/TestContext.java
@@ -30,7 +30,7 @@
*/
static Context createStorageTestContext(Context context, String authority) {
final MockContentResolver testResolver = new MockContentResolver();
- TestDocumentsProvider provider = new TestDocumentsProvider(authority);
+ TestDocumentsProvider provider = new TestDocumentsProvider(context, authority);
testResolver.addProvider(authority, provider);
return new ContextWrapper(context) {
diff --git a/tests/common/com/android/documentsui/testing/TestDocumentsProvider.java b/tests/common/com/android/documentsui/testing/TestDocumentsProvider.java
index 3e4dffd..5c5ed85 100644
--- a/tests/common/com/android/documentsui/testing/TestDocumentsProvider.java
+++ b/tests/common/com/android/documentsui/testing/TestDocumentsProvider.java
@@ -17,6 +17,7 @@
package com.android.documentsui.testing;
import android.annotation.NonNull;
+import android.content.Context;
import android.content.pm.ProviderInfo;
import android.database.Cursor;
import android.database.MatrixCursor;
@@ -51,10 +52,10 @@
private Cursor mNextChildDocuments;
private Cursor mNextRecentDocuments;
- public TestDocumentsProvider(String authority) {
+ public TestDocumentsProvider(Context context, String authority) {
ProviderInfo info = new ProviderInfo();
info.authority = authority;
- attachInfoForTesting(null, info);
+ attachInfoForTesting(context, info);
}
@Override
diff --git a/tests/common/com/android/documentsui/testing/TestEnv.java b/tests/common/com/android/documentsui/testing/TestEnv.java
index 3249c8c..8f74647 100644
--- a/tests/common/com/android/documentsui/testing/TestEnv.java
+++ b/tests/common/com/android/documentsui/testing/TestEnv.java
@@ -117,7 +117,8 @@
private void registerProviders() {
for (RootInfo root : providers.getRootsBlocking()) {
if (!mockProviders.containsKey(root.authority)) {
- TestDocumentsProvider provider = new TestDocumentsProvider(root.authority);
+ Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ TestDocumentsProvider provider = new TestDocumentsProvider(context, root.authority);
contentResolver.addProvider(root.authority, provider);
mockProviders.put(root.authority, provider);
}
diff --git a/tests/common/com/android/documentsui/testing/TestIconHelper.java b/tests/common/com/android/documentsui/testing/TestIconHelper.java
index d9bf9ab..754eea1 100644
--- a/tests/common/com/android/documentsui/testing/TestIconHelper.java
+++ b/tests/common/com/android/documentsui/testing/TestIconHelper.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.graphics.drawable.Drawable;
+import com.android.documentsui.ConfigStore;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.dirlist.IconHelper;
@@ -28,8 +29,8 @@
public Drawable nextDocumentIcon;
- private TestIconHelper() {
- super(null, 0, false);
+ private TestIconHelper(ConfigStore configStore) {
+ super(null, 0, false, configStore);
}
@Override
diff --git a/tests/common/com/android/documentsui/testing/TestProvidersAccess.java b/tests/common/com/android/documentsui/testing/TestProvidersAccess.java
index 4fae7a7..5a138ea 100644
--- a/tests/common/com/android/documentsui/testing/TestProvidersAccess.java
+++ b/tests/common/com/android/documentsui/testing/TestProvidersAccess.java
@@ -111,7 +111,7 @@
INSPECTOR.rootId = InspectorProvider.ROOT_ID;
INSPECTOR.title = "Inspector";
INSPECTOR.flags = Root.FLAG_LOCAL_ONLY
- | Root.FLAG_SUPPORTS_CREATE;
+ | Root.FLAG_SUPPORTS_CREATE;
IMAGE = new RootInfo();
IMAGE.userId = userId;
@@ -229,6 +229,67 @@
}
}
+ public static class AnotherUser {
+ public static final UserHandle USER_HANDLE = UserHandle.of(
+ TestProvidersAccess.USER_ID.getIdentifier() + 2);
+ public static final UserId USER_ID = UserId.of(AnotherUser.USER_HANDLE);
+
+ public static final RootInfo DOWNLOADS;
+ public static final RootInfo HOME;
+ public static final RootInfo IMAGE;
+ public static final RootInfo PICKLES;
+ public static final RootInfo MTP_ROOT;
+
+ static {
+ UserId userId = AnotherUser.USER_ID;
+
+ DOWNLOADS = new RootInfo();
+ DOWNLOADS.userId = userId;
+ DOWNLOADS.authority = Providers.AUTHORITY_DOWNLOADS;
+ DOWNLOADS.rootId = Providers.ROOT_ID_DOWNLOADS;
+ DOWNLOADS.title = "Downloads";
+ DOWNLOADS.derivedType = RootInfo.TYPE_DOWNLOADS;
+ DOWNLOADS.flags = Root.FLAG_LOCAL_ONLY
+ | Root.FLAG_SUPPORTS_CREATE
+ | Root.FLAG_SUPPORTS_RECENTS;
+
+ HOME = new RootInfo();
+ HOME.userId = userId;
+ HOME.authority = Providers.AUTHORITY_STORAGE;
+ HOME.rootId = Providers.ROOT_ID_HOME;
+ HOME.title = "Home";
+ HOME.derivedType = RootInfo.TYPE_LOCAL;
+ HOME.flags = Root.FLAG_LOCAL_ONLY
+ | Root.FLAG_SUPPORTS_CREATE
+ | Root.FLAG_SUPPORTS_IS_CHILD
+ | Root.FLAG_SUPPORTS_RECENTS;
+
+ IMAGE = new RootInfo();
+ IMAGE.userId = userId;
+ IMAGE.authority = Providers.AUTHORITY_MEDIA;
+ IMAGE.rootId = Providers.ROOT_ID_IMAGES;
+ IMAGE.title = "Images";
+ IMAGE.derivedType = RootInfo.TYPE_IMAGES;
+
+ PICKLES = new RootInfo();
+ PICKLES.userId = userId;
+ PICKLES.authority = "yummies";
+ PICKLES.rootId = "pickles";
+ PICKLES.title = "Pickles";
+ PICKLES.summary = "Yummy pickles";
+
+ MTP_ROOT = new RootInfo();
+ MTP_ROOT.userId = userId;
+ MTP_ROOT.authority = Providers.AUTHORITY_MTP;
+ MTP_ROOT.rootId = Providers.ROOT_ID_DOCUMENTS;
+ MTP_ROOT.title = "MTP";
+ MTP_ROOT.derivedType = RootInfo.TYPE_MTP;
+ MTP_ROOT.flags = Root.FLAG_SUPPORTS_CREATE
+ | Root.FLAG_LOCAL_ONLY
+ | Root.FLAG_SUPPORTS_IS_CHILD;
+ }
+ }
+
public final Map<String, Collection<RootInfo>> roots = new HashMap<>();
private @Nullable RootInfo nextRoot;
diff --git a/tests/functional/com/android/documentsui/ActionCreateDocumentUiTest.java b/tests/functional/com/android/documentsui/ActionCreateDocumentUiTest.java
index 6939e3d..fd17f72 100644
--- a/tests/functional/com/android/documentsui/ActionCreateDocumentUiTest.java
+++ b/tests/functional/com/android/documentsui/ActionCreateDocumentUiTest.java
@@ -80,8 +80,8 @@
final String fileName = UUID.randomUUID() + ".txt";
bots.main.setDialogText(fileName);
- bots.main.clickSaveButton();
device.waitForIdle();
+ bots.main.clickSaveButton();
final Instrumentation.ActivityResult activityResult = mRule.getActivityResult();
assertThat(activityResult.getResultCode()).isEqualTo(RESULT_OK);
@@ -93,8 +93,8 @@
assertThat(uri.getPath()).contains(fileName);
assertThat(resultData.getFlags()).isEqualTo(FLAG_GRANT_READ_URI_PERMISSION
- | FLAG_GRANT_WRITE_URI_PERMISSION
- | FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
+ | FLAG_GRANT_WRITE_URI_PERMISSION
+ | FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
final boolean deletedSuccessfully =
DocumentsContract.deleteDocument(context.getContentResolver(), uri);
diff --git a/tests/functional/com/android/documentsui/DialogUiTest.java b/tests/functional/com/android/documentsui/DialogUiTest.java
index eec7ef1..d1bd2a2 100644
--- a/tests/functional/com/android/documentsui/DialogUiTest.java
+++ b/tests/functional/com/android/documentsui/DialogUiTest.java
@@ -50,6 +50,7 @@
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -192,6 +193,7 @@
}
@Test
+ @Ignore
public void testCreateDirectoryFragmentShows_textInputEditText_shouldNotTruncateOnLandscape()
throws Throwable {
switchOrientation(mActivityTestRule.getActivity());
diff --git a/tests/functional/com/android/documentsui/FileCopyUiTest.java b/tests/functional/com/android/documentsui/FileCopyUiTest.java
index 1f35868..0284c30 100644
--- a/tests/functional/com/android/documentsui/FileCopyUiTest.java
+++ b/tests/functional/com/android/documentsui/FileCopyUiTest.java
@@ -425,7 +425,7 @@
// Copy Internal Storage -> Internal Storage //
@HugeLongTest
- public void testCopyDocuments_InternalStorage() throws Exception {
+ public void ignored_testCopyDocuments_InternalStorage() throws Exception {
createDocuments(StubProvider.ROOT_0_ID, rootDir0, mDocsHelper);
copyFiles(StubProvider.ROOT_0_ID, StubProvider.ROOT_1_ID);
@@ -472,7 +472,7 @@
}
@HugeLongTest
- public void testCopyDocuments_documentsDisabled() throws Exception {
+ public void ignored_testCopyDocuments_documentsDisabled() throws Exception {
mDocsHelper.createDocument(rootDir0, "text/plain", fileName1);
bots.roots.openRoot(StubProvider.ROOT_0_ID);
bots.directory.selectDocument(fileName1, 1);
diff --git a/tests/functional/com/android/documentsui/FilesActivityDefaultsUiTest.java b/tests/functional/com/android/documentsui/FilesActivityDefaultsUiTest.java
index b8ef8d6..a33cca3 100644
--- a/tests/functional/com/android/documentsui/FilesActivityDefaultsUiTest.java
+++ b/tests/functional/com/android/documentsui/FilesActivityDefaultsUiTest.java
@@ -21,7 +21,6 @@
import android.os.RemoteException;
-import androidx.recyclerview.R;
import androidx.test.filters.LargeTest;
import com.android.documentsui.base.RootInfo;
diff --git a/tests/functional/com/android/documentsui/PickActivityTest.java b/tests/functional/com/android/documentsui/PickActivityTest.java
index cd042b1..5d32036 100644
--- a/tests/functional/com/android/documentsui/PickActivityTest.java
+++ b/tests/functional/com/android/documentsui/PickActivityTest.java
@@ -37,12 +37,20 @@
import com.android.documentsui.testing.TestProvidersAccess;
import com.android.documentsui.ui.TestDialogController;
import com.android.documentsui.util.VersionUtils;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
@SmallTest
+@RunWith(Parameterized.class)
public class PickActivityTest {
private static final String RESULT_EXTRA = "test_result_extra";
@@ -51,6 +59,19 @@
private Context mTargetContext;
private Intent mIntentGetContent;
private TestDialogController mTestDialogs;
+ private TestConfigStore mTestConfigStore;
+
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
@Rule
public final ActivityTestRule<PickActivity> mRule =
@@ -67,6 +88,9 @@
mIntentGetContent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, hintUri);
mTestDialogs = new TestDialogController();
+ mTestConfigStore = new TestConfigStore();
+
+ isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled;
}
@Test
@@ -77,7 +101,13 @@
doc.documentId = "documentId";
PickActivity pickActivity = mRule.launchActivity(mIntentGetContent);
- pickActivity.mState.canShareAcrossProfile = true;
+ pickActivity.mState.configStore = mTestConfigStore;
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ pickActivity.mState.canForwardToProfileIdMap.put(TestProvidersAccess.USER_ID, true);
+ } else {
+ pickActivity.mState.canShareAcrossProfile = true;
+ }
pickActivity.onDocumentPicked(doc);
SystemClock.sleep(3000);
@@ -96,7 +126,15 @@
doc.documentId = "documentId";
PickActivity pickActivity = mRule.launchActivity(mIntentGetContent);
- pickActivity.mState.canShareAcrossProfile = true;
+ pickActivity.mState.configStore = mTestConfigStore;
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ pickActivity.mState.canForwardToProfileIdMap.put(TestProvidersAccess.USER_ID, true);
+ pickActivity.mState.canForwardToProfileIdMap.put(
+ TestProvidersAccess.OtherUser.USER_ID, true);
+ } else {
+ pickActivity.mState.canShareAcrossProfile = true;
+ }
pickActivity.onDocumentPicked(doc);
SystemClock.sleep(3000);
@@ -114,7 +152,13 @@
doc.documentId = "documentId";
PickActivity pickActivity = mRule.launchActivity(mIntentGetContent);
- pickActivity.mState.canShareAcrossProfile = false;
+ pickActivity.mState.configStore = mTestConfigStore;
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ pickActivity.mState.canForwardToProfileIdMap.put(TestProvidersAccess.USER_ID, true);
+ } else {
+ pickActivity.mState.canShareAcrossProfile = false;
+ }
pickActivity.getInjector().dialogs = mTestDialogs;
pickActivity.onDocumentPicked(doc);
SystemClock.sleep(3000);
diff --git a/tests/functional/com/android/documentsui/SearchViewUiTest.java b/tests/functional/com/android/documentsui/SearchViewUiTest.java
index 04ea87a..78ce44a 100644
--- a/tests/functional/com/android/documentsui/SearchViewUiTest.java
+++ b/tests/functional/com/android/documentsui/SearchViewUiTest.java
@@ -19,7 +19,6 @@
import static com.android.documentsui.StubProvider.ROOT_0_ID;
import static com.android.documentsui.StubProvider.ROOT_1_ID;
-import androidx.recyclerview.R;
import androidx.test.filters.LargeTest;
import androidx.test.filters.Suppress;
diff --git a/tests/functional/com/android/documentsui/dirlist/DirectoryAddonsAdapterPrivateSpaceTest.java b/tests/functional/com/android/documentsui/dirlist/DirectoryAddonsAdapterPrivateSpaceTest.java
new file mode 100644
index 0000000..cf057de
--- /dev/null
+++ b/tests/functional/com/android/documentsui/dirlist/DirectoryAddonsAdapterPrivateSpaceTest.java
@@ -0,0 +1,237 @@
+/*
+ * 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.documentsui.dirlist;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.UserProperties;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.DocumentsContract;
+import android.test.AndroidTestCase;
+import android.view.ViewGroup;
+
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.test.filters.SdkSuppress;
+
+import com.android.documentsui.ActionHandler;
+import com.android.documentsui.ModelId;
+import com.android.documentsui.TestConfigStore;
+import com.android.documentsui.base.DocumentInfo;
+import com.android.documentsui.base.State;
+import com.android.documentsui.base.UserId;
+import com.android.documentsui.testing.TestActionHandler;
+import com.android.documentsui.testing.TestEnv;
+import com.android.documentsui.testing.TestFileTypeLookup;
+import com.android.documentsui.testing.TestProvidersAccess;
+import com.android.documentsui.testing.UserManagers;
+import com.android.documentsui.util.VersionUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@SdkSuppress(minSdkVersion = 35, codeName = "V")
+public class DirectoryAddonsAdapterPrivateSpaceTest extends AndroidTestCase {
+
+ private static final String AUTHORITY = "test_authority";
+ private static final UserId CURRENT_USER = TestProvidersAccess.USER_ID;
+ private static final UserId SELECTED_USER = TestProvidersAccess.OtherUser.USER_ID;
+
+ private TestEnv mEnv;
+ private DirectoryAddonsAdapter mAdapter;
+ private ActionHandler mActionHandler;
+ private TestConfigStore mTestConfigStore;
+ private UserManager mUserManager;
+
+ /**
+ * set up for the test assuming that private space is enabled.
+ */
+ public void setUp() {
+
+ mEnv = TestEnv.create(AUTHORITY);
+ mActionHandler = new TestActionHandler();
+ mEnv.clear();
+ mTestConfigStore = new TestConfigStore();
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ mUserManager = UserManagers.create();
+
+ UserProperties selectedUserProperties = new UserProperties.Builder().setShowInQuietMode(
+ UserProperties.SHOW_IN_QUIET_MODE_HIDDEN).build();
+ when(mUserManager.getUserProperties(
+ UserHandle.of(SELECTED_USER.getIdentifier()))).thenReturn(selectedUserProperties);
+
+ final Context testContext = TestContext.createStorageTestContext(getContext(), AUTHORITY);
+ DocumentsAdapter.Environment env = new TestEnvironment(testContext, mEnv, mActionHandler);
+ Map<UserId, String> userIdToLabelMap = new HashMap<>();
+ userIdToLabelMap.put(CURRENT_USER, "Personal");
+ userIdToLabelMap.put(SELECTED_USER, "Profile");
+
+ mAdapter = new DirectoryAddonsAdapter(
+ env,
+ new ModelBackedDocumentsAdapter(
+ env,
+ new IconHelper(testContext, State.MODE_GRID, /* maybeShowBadge= */ false,
+ mTestConfigStore),
+ new TestFileTypeLookup(), mTestConfigStore),
+ CURRENT_USER, SELECTED_USER, userIdToLabelMap, mUserManager, mTestConfigStore);
+
+ mEnv.model.addUpdateListener(mAdapter.getModelUpdateListener());
+ }
+
+ // Tests that the item count is correct for a directory containing files and subdirs.
+ public void testItemCount_mixed() {
+ mEnv.reset(); // creates a mix of folders and files for us.
+
+ assertEquals(mEnv.model.getItemCount() + 1, mAdapter.getItemCount());
+ }
+
+ public void testGetPosition() {
+ mEnv.model.createFolder("a"); // id will be "1"...derived from insert position.
+ mEnv.model.createFile("b"); // id will be "2"
+ mEnv.model.update();
+
+ assertEquals(0, mAdapter.getPosition(ModelId.build(mEnv.model.mUserId, AUTHORITY, "1")));
+ // adapter inserts a view between item 0 and 1 to force layout
+ // break between folders and files. This is reflected by an offset position.
+ assertEquals(2, mAdapter.getPosition(ModelId.build(mEnv.model.mUserId, AUTHORITY, "2")));
+ }
+
+ // Tests that the item count is correct for a directory containing only subdirs.
+ public void testItemCount_allDirs() {
+ String[] names = {"Trader Joe's", "Alphabeta", "Lucky", "Vons", "Gelson's"};
+ for (String name : names) {
+ mEnv.model.createFolder(name);
+ }
+ mEnv.model.update();
+ assertEquals(mEnv.model.getItemCount(), mAdapter.getItemCount());
+ }
+
+ // Tests that the item count is correct for a directory containing only files.
+ public void testItemCount_allFiles() {
+ String[] names = {"123.txt", "234.jpg", "abc.pdf"};
+ for (String name : names) {
+ mEnv.model.createFile(name);
+ }
+ mEnv.model.update();
+ assertEquals(mEnv.model.getItemCount(), mAdapter.getItemCount());
+ }
+
+ public void testAddsInfoMessage_WithDirectoryChildren() {
+ String[] names = {"123.txt", "234.jpg", "abc.pdf"};
+ for (String name : names) {
+ mEnv.model.createFile(name);
+ }
+ Bundle bundle = new Bundle();
+ bundle.putString(DocumentsContract.EXTRA_INFO, "some info");
+ mEnv.model.setCursorExtras(bundle);
+ mEnv.model.update();
+ assertEquals(mEnv.model.getItemCount() + 1, mAdapter.getItemCount());
+ assertHolderType(0, DocumentsAdapter.ITEM_TYPE_HEADER_MESSAGE);
+ }
+
+ public void testItemCount_none() {
+ mEnv.model.update();
+ assertEquals(1, mAdapter.getItemCount());
+ assertHolderType(0, DocumentsAdapter.ITEM_TYPE_INFLATED_MESSAGE);
+ }
+
+ public void testAddsInfoMessage_WithNoItem() {
+ Bundle bundle = new Bundle();
+ bundle.putString(DocumentsContract.EXTRA_INFO, "some info");
+ mEnv.model.setCursorExtras(bundle);
+
+ mEnv.model.update();
+ assertEquals(2, mAdapter.getItemCount());
+ assertHolderType(0, DocumentsAdapter.ITEM_TYPE_HEADER_MESSAGE);
+ }
+
+ public void testAddsErrorMessage_WithNoItem() {
+ Bundle bundle = new Bundle();
+ bundle.putString(DocumentsContract.EXTRA_ERROR, "some error");
+ mEnv.model.setCursorExtras(bundle);
+
+ mEnv.model.update();
+ assertEquals(2, mAdapter.getItemCount());
+ assertHolderType(0, DocumentsAdapter.ITEM_TYPE_HEADER_MESSAGE);
+ }
+
+ public void testOpenTreeMessage_shouldBlockChild() {
+ if (!VersionUtils.isAtLeastR()) {
+ return;
+ }
+
+ mEnv.state.action = State.ACTION_OPEN_TREE;
+ mEnv.state.restrictScopeStorage = true;
+ DocumentInfo info = new DocumentInfo();
+ info.flags += DocumentsContract.Document.FLAG_DIR_BLOCKS_OPEN_DOCUMENT_TREE;
+ mEnv.state.stack.push(info);
+
+ mEnv.model.update();
+ assertEquals(2, mAdapter.getItemCount());
+ assertHolderType(0, DocumentsAdapter.ITEM_TYPE_HEADER_MESSAGE);
+ }
+
+ public void testOpenTreeMessage_normalChild() {
+ mEnv.state.action = State.ACTION_OPEN_TREE;
+ DocumentInfo info = new DocumentInfo();
+ mEnv.state.stack.push(info);
+
+ mEnv.model.update();
+ // Should only no items message show
+ assertEquals(1, mAdapter.getItemCount());
+ assertHolderType(0, DocumentsAdapter.ITEM_TYPE_INFLATED_MESSAGE);
+ }
+
+ public void testOpenTreeMessage_restrictStorageAccessFalse_blockTreeChild() {
+ if (!VersionUtils.isAtLeastR()) {
+ return;
+ }
+
+ mEnv.state.action = State.ACTION_OPEN_TREE;
+ DocumentInfo info = new DocumentInfo();
+ info.flags += DocumentsContract.Document.FLAG_DIR_BLOCKS_OPEN_DOCUMENT_TREE;
+ mEnv.state.stack.push(info);
+
+ mEnv.model.update();
+ // Should only no items message show
+ assertEquals(1, mAdapter.getItemCount());
+ assertHolderType(0, DocumentsAdapter.ITEM_TYPE_INFLATED_MESSAGE);
+ }
+
+ private void assertHolderType(int index, int type) {
+ assertTrue(mAdapter.getItemViewType(index) == type);
+ }
+
+ private static class StubAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ @Override
+ public int getItemCount() {
+ return 0;
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return null;
+ }
+ }
+}
diff --git a/tests/functional/com/android/documentsui/dirlist/DirectoryAddonsAdapterTest.java b/tests/functional/com/android/documentsui/dirlist/DirectoryAddonsAdapterTest.java
index bcd1131..49c3165 100644
--- a/tests/functional/com/android/documentsui/dirlist/DirectoryAddonsAdapterTest.java
+++ b/tests/functional/com/android/documentsui/dirlist/DirectoryAddonsAdapterTest.java
@@ -27,11 +27,13 @@
import com.android.documentsui.ActionHandler;
import com.android.documentsui.ModelId;
+import com.android.documentsui.TestConfigStore;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.State;
import com.android.documentsui.testing.TestActionHandler;
import com.android.documentsui.testing.TestEnv;
import com.android.documentsui.testing.TestFileTypeLookup;
+import com.android.documentsui.testing.TestProvidersAccess;
import com.android.documentsui.util.VersionUtils;
@MediumTest
@@ -42,12 +44,14 @@
private TestEnv mEnv;
private DirectoryAddonsAdapter mAdapter;
private ActionHandler mActionHandler;
+ private TestConfigStore mTestConfigStore;
public void setUp() {
mEnv = TestEnv.create(AUTHORITY);
mActionHandler = new TestActionHandler();
mEnv.clear();
+ mTestConfigStore = new TestConfigStore();
final Context testContext = TestContext.createStorageTestContext(getContext(), AUTHORITY);
DocumentsAdapter.Environment env = new TestEnvironment(testContext, mEnv, mActionHandler);
@@ -56,8 +60,10 @@
env,
new ModelBackedDocumentsAdapter(
env,
- new IconHelper(testContext, State.MODE_GRID, /* maybeShowBadge= */ false),
- new TestFileTypeLookup()));
+ new IconHelper(testContext, State.MODE_GRID, /* maybeShowBadge= */ false,
+ null, TestProvidersAccess.OtherUser.USER_ID, null,
+ mTestConfigStore),
+ new TestFileTypeLookup(), mTestConfigStore), mTestConfigStore);
mEnv.model.addUpdateListener(mAdapter.getModelUpdateListener());
}
@@ -202,4 +208,4 @@
return null;
}
}
-}
+}
\ No newline at end of file
diff --git a/tests/functional/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterPrivateSpaceTest.java b/tests/functional/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterPrivateSpaceTest.java
new file mode 100644
index 0000000..34a6d6f
--- /dev/null
+++ b/tests/functional/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterPrivateSpaceTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.documentsui.dirlist;
+
+import android.content.Context;
+import android.test.AndroidTestCase;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
+
+import com.android.documentsui.ActionHandler;
+import com.android.documentsui.Model;
+import com.android.documentsui.TestConfigStore;
+import com.android.documentsui.base.State;
+import com.android.documentsui.testing.TestActionHandler;
+import com.android.documentsui.testing.TestEnv;
+import com.android.documentsui.testing.TestFileTypeLookup;
+
+@MediumTest
+public class ModelBackedDocumentsAdapterPrivateSpaceTest extends AndroidTestCase {
+
+ private static final String AUTHORITY = "test_authority";
+
+ private TestEnv mEnv;
+ private ActionHandler mActionHandler;
+ private TestConfigStore mTestConfigStore;
+ private ModelBackedDocumentsAdapter mAdapter;
+
+ /**
+ * set up for the test assuming that private space is enabled.
+ */
+ @SdkSuppress(minSdkVersion = 35, codeName = "V")
+ public void setUp() {
+
+ final Context testContext = TestContext.createStorageTestContext(getContext(), AUTHORITY);
+ mEnv = TestEnv.create(AUTHORITY);
+ mActionHandler = new TestActionHandler();
+ mTestConfigStore = new TestConfigStore();
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+
+ DocumentsAdapter.Environment env = new TestEnvironment(testContext, mEnv, mActionHandler);
+
+ mAdapter = new ModelBackedDocumentsAdapter(
+ env,
+ new IconHelper(testContext, State.MODE_GRID, /* maybeShowBadge= */ false,
+ mTestConfigStore),
+ new TestFileTypeLookup(), mTestConfigStore);
+ mAdapter.getModelUpdateListener().accept(Model.Update.UPDATE);
+ }
+
+ // Tests that the item count is correct.
+ public void testItemCount() {
+ assertEquals(mEnv.model.getItemCount(), mAdapter.getItemCount());
+ }
+}
diff --git a/tests/functional/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java b/tests/functional/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java
index 72014f6..cf699d3 100644
--- a/tests/functional/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java
+++ b/tests/functional/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java
@@ -23,10 +23,12 @@
import com.android.documentsui.ActionHandler;
import com.android.documentsui.Model;
+import com.android.documentsui.TestConfigStore;
import com.android.documentsui.base.State;
import com.android.documentsui.testing.TestActionHandler;
import com.android.documentsui.testing.TestEnv;
import com.android.documentsui.testing.TestFileTypeLookup;
+import com.android.documentsui.testing.TestProvidersAccess;
@MediumTest
public class ModelBackedDocumentsAdapterTest extends AndroidTestCase {
@@ -35,6 +37,7 @@
private TestEnv mEnv;
private ActionHandler mActionHandler;
+ private TestConfigStore mTestConfigStore;
private ModelBackedDocumentsAdapter mAdapter;
public void setUp() {
@@ -42,13 +45,15 @@
final Context testContext = TestContext.createStorageTestContext(getContext(), AUTHORITY);
mEnv = TestEnv.create(AUTHORITY);
mActionHandler = new TestActionHandler();
+ mTestConfigStore = new TestConfigStore();
DocumentsAdapter.Environment env = new TestEnvironment(testContext, mEnv, mActionHandler);
mAdapter = new ModelBackedDocumentsAdapter(
env,
- new IconHelper(testContext, State.MODE_GRID, /* maybeShowBadge= */ false),
- new TestFileTypeLookup());
+ new IconHelper(testContext, State.MODE_GRID, /* maybeShowBadge= */ false, null,
+ TestProvidersAccess.OtherUser.USER_ID, null, mTestConfigStore),
+ new TestFileTypeLookup(), mTestConfigStore);
mAdapter.getModelUpdateListener().accept(Model.Update.UPDATE);
}
@@ -56,4 +61,4 @@
public void testItemCount() {
assertEquals(mEnv.model.getItemCount(), mAdapter.getItemCount());
}
-}
+}
\ No newline at end of file
diff --git a/tests/lint-baseline.xml b/tests/lint-baseline.xml
new file mode 100644
index 0000000..ed87eb9
--- /dev/null
+++ b/tests/lint-baseline.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.4.0-alpha01" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha01">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayManager#getOverlayInfosForTarget`"
+ errorLine1=" when(mOverlayManager.getOverlayInfosForTarget(getEnabledTargetPackageId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="85"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayManager#getOverlayInfosForTarget`"
+ errorLine1=" when(mOverlayManager.getOverlayInfosForTarget(getDisabledTargetPackageId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="89"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayManager#setEnabled`"
+ errorLine1=" verify(mOverlayManager, times(1)).setEnabled(getOverlayPackageId(), enabled,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="104"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayManager#getOverlayInfosForTarget`"
+ errorLine1=" verify(mOverlayManager, times(1)).getOverlayInfosForTarget(getEnabledTargetPackageId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="116"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayManager#setEnabled`"
+ errorLine1=" verify(mOverlayManager, never()).setEnabled(getOverlayPackageId(), enabled,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="129"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayManager#getOverlayInfosForTarget`"
+ errorLine1=" assertThat(mOverlayManager.getOverlayInfosForTarget(getDisabledTargetPackageId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="137"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayInfo#isEnabled`"
+ errorLine1=" mUserHandle).get(0).isEnabled()).isEqualTo(!enabled);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="138"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayManager#setEnabled`"
+ errorLine1=" verify(mOverlayManager, times(1)).setEnabled(getOverlayPackageId(), enabled,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="146"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayManager#getOverlayInfosForTarget`"
+ errorLine1=" assertThat(mOverlayManager.getOverlayInfosForTarget(getEnabledTargetPackageId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="154"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayInfo#isEnabled`"
+ errorLine1=" mUserHandle).get(0).isEnabled()).isEqualTo(!enabled);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="155"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayManager#setEnabled`"
+ errorLine1=" verify(mOverlayManager, times(1)).setEnabled(getOverlayPackageId(), enabled,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="163"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `android.content.om.OverlayManager#getOverlayInfosForTarget`"
+ errorLine1=" mOverlayManager.getOverlayInfosForTarget(getEnabledTargetPackageId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="192"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 29): `new android.content.om.OverlayInfo`"
+ errorLine1=' return new OverlayInfo(packageName, targetPackageName, null, null, "",'
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="packages/apps/DocumentsUI/tests/functional/com/android/documentsui/ThemeOverlayManagerTest.java"
+ line="211"
+ column="16"/>
+ </issue>
+
+</issues>
\ No newline at end of file
diff --git a/tests/unit/com/android/documentsui/AbstractActionHandlerTest.java b/tests/unit/com/android/documentsui/AbstractActionHandlerTest.java
index 3eb8ab2..104a8d7 100644
--- a/tests/unit/com/android/documentsui/AbstractActionHandlerTest.java
+++ b/tests/unit/com/android/documentsui/AbstractActionHandlerTest.java
@@ -32,7 +32,6 @@
import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.documentsui.base.DocumentStack;
import com.android.documentsui.base.EventListener;
@@ -48,10 +47,16 @@
import com.android.documentsui.testing.TestEventHandler;
import com.android.documentsui.testing.TestProvidersAccess;
import com.android.documentsui.testing.UserManagers;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.android.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
@@ -60,19 +65,39 @@
/**
* A unit test *for* AbstractActionHandler, not an abstract test baseclass.
*/
-@RunWith(AndroidJUnit4.class)
+@RunWith(Parameterized.class)
@MediumTest
public class AbstractActionHandlerTest {
+ private final TestConfigStore mTestConfigStore = new TestConfigStore();
private TestActivity mActivity;
private TestEnv mEnv;
private AbstractActionHandler<TestActivity> mHandler;
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
+
@Before
public void setUp() {
mEnv = TestEnv.create();
mActivity = TestActivity.create(mEnv);
mActivity.userManager = UserManagers.create();
+ mEnv.state.configStore = mTestConfigStore;
+
+ isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled;
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.USER_ID, true);
+ }
mHandler = new AbstractActionHandler<TestActivity>(
mActivity,
mEnv.state,
@@ -281,7 +306,11 @@
@Test
public void testCrossProfileDocuments_success() throws Exception {
mEnv.state.action = State.ACTION_GET_CONTENT;
- mEnv.state.canShareAcrossProfile = true;
+ if (isPrivateSpaceEnabled) {
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.OtherUser.USER_ID, true);
+ } else {
+ mEnv.state.canShareAcrossProfile = true;
+ }
mEnv.state.stack.changeRoot(TestProvidersAccess.OtherUser.HOME);
mEnv.state.stack.push(TestEnv.OtherUser.FOLDER_0);
@@ -308,7 +337,11 @@
@Test
public void testLoadCrossProfileDoc_failsWithQuietModeException() throws Exception {
mEnv.state.action = State.ACTION_GET_CONTENT;
- mEnv.state.canShareAcrossProfile = true;
+ if (isPrivateSpaceEnabled) {
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.OtherUser.USER_ID, true);
+ } else {
+ mEnv.state.canShareAcrossProfile = true;
+ }
mEnv.state.stack.changeRoot(TestProvidersAccess.OtherUser.HOME);
mEnv.state.stack.push(TestEnv.OtherUser.FOLDER_0);
// Turn off the other user.
@@ -389,7 +422,11 @@
.setNextChildDocumentsReturns(TestEnv.OtherUser.FILE_PNG);
// Disallow sharing across profile
- mEnv.state.canShareAcrossProfile = false;
+ if (isPrivateSpaceEnabled) {
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.OtherUser.USER_ID, false);
+ } else {
+ mEnv.state.canShareAcrossProfile = false;
+ }
TestEventHandler<Model.Update> listener = new TestEventHandler<>();
mEnv.model.addUpdateListener(listener::accept);
@@ -404,7 +441,11 @@
.isInstanceOf(CrossProfileNoPermissionException.class);
// Allow sharing across profile.
- mEnv.state.canShareAcrossProfile = true;
+ if (isPrivateSpaceEnabled) {
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.OtherUser.USER_ID, true);
+ } else {
+ mEnv.state.canShareAcrossProfile = true;
+ }
CountDownLatch latch2 = new CountDownLatch(1);
mEnv.model.addUpdateListener(update -> latch2.countDown());
diff --git a/tests/unit/com/android/documentsui/DocumentsAccessTest.java b/tests/unit/com/android/documentsui/DocumentsAccessTest.java
index 8a08d43..f52c21b 100644
--- a/tests/unit/com/android/documentsui/DocumentsAccessTest.java
+++ b/tests/unit/com/android/documentsui/DocumentsAccessTest.java
@@ -18,27 +18,47 @@
import static junit.framework.Assert.fail;
+import static org.mockito.Mockito.mock;
+
+import android.content.ContentProviderClient;
import android.content.pm.PackageManager;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.documentsui.testing.TestEnv;
import com.android.documentsui.testing.TestProvidersAccess;
+import com.android.modules.utils.build.SdkLevel;
import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
-@RunWith(AndroidJUnit4.class)
+@RunWith(Parameterized.class)
@MediumTest
public class DocumentsAccessTest {
+ private final TestConfigStore mTestConfigStore = new TestConfigStore();
private TestActivity mActivity;
private DocumentsAccess mDocumentsAccess;
private TestEnv mEnv;
+ private ContentProviderClient mMockContentProviderClient = mock(ContentProviderClient.class);
+
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
@Before
public void setUp() throws PackageManager.NameNotFoundException {
@@ -46,6 +66,11 @@
mEnv.reset();
mActivity = TestActivity.create(mEnv);
mDocumentsAccess = DocumentsAccess.create(mActivity, mEnv.state);
+ mEnv.state.configStore = mTestConfigStore;
+ isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled;
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ }
}
@Test
diff --git a/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java b/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java
index c52dbd3..3cbed80 100644
--- a/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java
+++ b/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java
@@ -27,7 +27,6 @@
import android.provider.DocumentsContract.Document;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.State;
@@ -38,13 +37,19 @@
import com.android.documentsui.testing.TestFileTypeLookup;
import com.android.documentsui.testing.TestImmediateExecutor;
import com.android.documentsui.testing.TestProvidersAccess;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.common.collect.Lists;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
-@RunWith(AndroidJUnit4.class)
+@RunWith(Parameterized.class)
@MediumTest
public class GlobalSearchLoaderTest {
@@ -55,13 +60,34 @@
private TestEnv mEnv;
private TestActivity mActivity;
private GlobalSearchLoader mLoader;
+ private TestConfigStore mTestConfigStore;
private Bundle mQueryArgs = new Bundle();
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
+
@Before
public void setUp() {
mEnv = TestEnv.create();
mActivity = TestActivity.create(mEnv);
mActivity.activityManager = ActivityManagers.create(false);
+ mTestConfigStore = new TestConfigStore();
+ mEnv.state.configStore = mTestConfigStore;
+
+ isPrivateSpaceEnabled &= SdkLevel.isAtLeastS();
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.USER_ID, true);
+ }
mEnv.state.action = State.ACTION_BROWSE;
mEnv.state.acceptMimes = new String[]{"*/*"};
@@ -93,6 +119,7 @@
@Test
public void testNotLocalOnlyRoot_beIgnored() {
+ if (isPrivateSpaceEnabled) return;
TestProvidersAccess.PICKLES.flags |= DocumentsContract.Root.FLAG_SUPPORTS_SEARCH;
assertTrue(mLoader.shouldIgnoreRoot(TestProvidersAccess.PICKLES));
TestProvidersAccess.PICKLES.flags &= ~DocumentsContract.Root.FLAG_SUPPORTS_SEARCH;
@@ -301,7 +328,11 @@
@Test
public void testSearchResult_includeBothUsersRoots() {
- mEnv.state.canShareAcrossProfile = true;
+ if (isPrivateSpaceEnabled) {
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.OtherUser.USER_ID, true);
+ } else {
+ mEnv.state.canShareAcrossProfile = true;
+ }
mEnv.state.supportsCrossProfile = true;
final DocumentInfo pdfDoc = mEnv.model.createFile(SEARCH_STRING + ".pdf");
diff --git a/tests/unit/com/android/documentsui/ProfileTabsTest.java b/tests/unit/com/android/documentsui/ProfileTabsTest.java
index 373f4e5..8eac484 100644
--- a/tests/unit/com/android/documentsui/ProfileTabsTest.java
+++ b/tests/unit/com/android/documentsui/ProfileTabsTest.java
@@ -18,6 +18,8 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assume.assumeTrue;
+
import android.content.Context;
import android.net.Uri;
import android.os.UserHandle;
@@ -32,20 +34,27 @@
import com.android.documentsui.base.UserId;
import com.android.documentsui.testing.TestEnv;
import com.android.documentsui.testing.TestProvidersAccess;
+import com.android.modules.utils.build.SdkLevel;
-import com.google.android.collect.Lists;
import com.google.android.material.tabs.TabLayout;
+import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
-import java.util.Collections;
import java.util.List;
+import java.util.Map;
+@RunWith(Parameterized.class)
public class ProfileTabsTest {
- private final UserId systemUser = UserId.of(UserHandle.SYSTEM);
- private final UserId managedUser = UserId.of(100);
+ private final UserId mSystemUser = UserId.of(UserHandle.SYSTEM);
+ private final UserId mManagedUser = UserId.of(100);
+ private final UserId mPrivateUser = UserId.of(101);
private ProfileTabs mProfileTabs;
@@ -55,8 +64,22 @@
private TestEnvironment mTestEnv;
private State mState;
private TestUserIdManager mTestUserIdManager;
+ private TestUserManagerState mTestUserManagerState;
private TestCommonAddons mTestCommonAddons;
private boolean mIsListenerInvoked;
+ private TestConfigStore mTestConfigStore;
+
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
@Before
public void setUp() {
@@ -76,14 +99,21 @@
mTestEnv = new TestEnvironment();
mTestEnv.isSearchExpanded = false;
- mTestUserIdManager = new TestUserIdManager();
+ isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled;
+ if (isPrivateSpaceEnabled) {
+ mTestUserManagerState = new TestUserManagerState();
+ } else {
+ mTestUserIdManager = new TestUserIdManager();
+ }
+
mTestCommonAddons = new TestCommonAddons();
mTestCommonAddons.mCurrentRoot = TestProvidersAccess.DOWNLOADS;
+ mTestConfigStore = new TestConfigStore();
}
@Test
public void testUpdateView_singleUser_shouldHide() {
- initializeWithUsers(systemUser);
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser);
assertThat(mTabLayoutContainer.getVisibility()).isEqualTo(View.GONE);
assertThat(mTabLayout.getTabCount()).isEqualTo(0);
@@ -91,23 +121,40 @@
@Test
public void testUpdateView_twoUsers_shouldShow() {
- initializeWithUsers(systemUser, managedUser);
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser, mManagedUser);
assertThat(mTabLayoutContainer.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(mTabLayout.getTabCount()).isEqualTo(2);
TabLayout.Tab tab1 = mTabLayout.getTabAt(0);
- assertThat(tab1.getTag()).isEqualTo(systemUser);
+ assertThat(tab1.getTag()).isEqualTo(mSystemUser);
assertThat(tab1.getText()).isEqualTo(mContext.getString(R.string.personal_tab));
TabLayout.Tab tab2 = mTabLayout.getTabAt(1);
- assertThat(tab2.getTag()).isEqualTo(managedUser);
+ assertThat(tab2.getTag()).isEqualTo(mManagedUser);
assertThat(tab2.getText()).isEqualTo(mContext.getString(R.string.work_tab));
}
@Test
+ public void testUpdateView_multiUsers_shouldShow() {
+ assumeTrue(SdkLevel.isAtLeastV() && isPrivateSpaceEnabled);
+ initializeWithUsers(true, mSystemUser, mManagedUser, mPrivateUser);
+
+ assertThat(mTabLayoutContainer.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mTabLayout.getTabCount()).isEqualTo(3);
+
+ final Map<UserId, String> userIdToLabelMap = mTestUserManagerState.getUserIdToLabelMap();
+ for (int i = 0; i < 3; ++i) {
+ TabLayout.Tab tab = mTabLayout.getTabAt(i);
+ assertThat(tab).isNotNull();
+ UserId userId = (UserId) tab.getTag();
+ assertThat(tab.getText()).isEqualTo(userIdToLabelMap.get(userId));
+ }
+ }
+
+ @Test
public void testUpdateView_twoUsers_doesNotSupportCrossProfile_shouldHide() {
- initializeWithUsers(systemUser, managedUser);
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser, mManagedUser);
mState.supportsCrossProfile = false;
mProfileTabs.updateView();
@@ -117,7 +164,7 @@
@Test
public void testUpdateView_twoUsers_subFolder_shouldHide() {
- initializeWithUsers(systemUser, managedUser);
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser, mManagedUser);
// Push 1 more folder. Now the stack has size of 2.
mState.stack.push(TestEnv.FOLDER_1);
@@ -129,7 +176,7 @@
@Test
public void testUpdateView_twoUsers_recents_subFolder_shouldHide() {
- initializeWithUsers(systemUser, managedUser);
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser, mManagedUser);
mState.stack.changeRoot(TestProvidersAccess.RECENTS);
// This(stack of size 2 in Recents) may not happen in real world.
@@ -142,7 +189,7 @@
@Test
public void testUpdateView_twoUsers_thirdParty_shouldHide() {
- initializeWithUsers(systemUser, managedUser);
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser, mManagedUser);
mState.stack.changeRoot(TestProvidersAccess.PICKLES);
mState.stack.push((TestEnv.FOLDER_0));
@@ -155,7 +202,7 @@
@Test
public void testUpdateView_twoUsers_isSearching_shouldHide() {
mTestEnv.isSearchExpanded = true;
- initializeWithUsers(systemUser, managedUser);
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser, mManagedUser);
assertThat(mTabLayoutContainer.getVisibility()).isEqualTo(View.GONE);
assertThat(mTabLayout.getTabCount()).isEqualTo(2);
@@ -163,78 +210,149 @@
@Test
public void testUpdateView_getSelectedUser_afterUsersChanged() {
- initializeWithUsers(systemUser, managedUser);
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser, mManagedUser);
mProfileTabs.updateView();
mTabLayout.selectTab(mTabLayout.getTabAt(1));
assertThat(mTabLayoutContainer.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mProfileTabs.getSelectedUser()).isEqualTo(managedUser);
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mManagedUser);
- mTestUserIdManager.userIds = Collections.singletonList(systemUser);
+ if (isPrivateSpaceEnabled) {
+ mTestUserManagerState.userIds = Lists.newArrayList(mSystemUser);
+ } else {
+ mTestUserIdManager.userIds = Lists.newArrayList(mSystemUser);
+ }
mProfileTabs.updateView();
assertThat(mTabLayoutContainer.getVisibility()).isEqualTo(View.GONE);
- assertThat(mProfileTabs.getSelectedUser()).isEqualTo(systemUser);
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mSystemUser);
}
@Test
public void testUpdateView_afterCurrentRootChanged_shouldChangeSelectedUser() {
- initializeWithUsers(systemUser, managedUser);
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser, mManagedUser);
mProfileTabs.updateView();
- assertThat(mProfileTabs.getSelectedUser()).isEqualTo(systemUser);
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mSystemUser);
RootInfo newRoot = RootInfo.copyRootInfo(mTestCommonAddons.mCurrentRoot);
- newRoot.userId = managedUser;
+ newRoot.userId = mManagedUser;
mTestCommonAddons.mCurrentRoot = newRoot;
mProfileTabs.updateView();
- assertThat(mProfileTabs.getSelectedUser()).isEqualTo(managedUser);
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mManagedUser);
// updating view should not trigger listener callback.
assertThat(mIsListenerInvoked).isFalse();
}
@Test
- public void testgetSelectedUser_twoUsers() {
- initializeWithUsers(systemUser, managedUser);
+ public void testUpdateView_afterCurrentRootChangedMultiUser_shouldChangeSelectedUser() {
+ assumeTrue(SdkLevel.isAtLeastV() && isPrivateSpaceEnabled);
+ initializeWithUsers(true, mSystemUser, mManagedUser, mPrivateUser);
+ mProfileTabs.updateView();
+
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mSystemUser);
+
+ for (UserId userId : Lists.newArrayList(mManagedUser, mPrivateUser)) {
+ RootInfo newRoot = RootInfo.copyRootInfo(mTestCommonAddons.mCurrentRoot);
+ newRoot.userId = userId;
+ mTestCommonAddons.mCurrentRoot = newRoot;
+ mProfileTabs.updateView();
+
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(userId);
+ // updating view should not trigger listener callback.
+ assertThat(mIsListenerInvoked).isFalse();
+ }
+ }
+
+ @Test
+ public void testUpdateView_afterSelectedUserBecomesUnavailable_shouldSwitchToCurrentUser() {
+ // here current user refers to UserId.CURRENT_USER, which in this case will be mSystemUser
+ assumeTrue(SdkLevel.isAtLeastV() && isPrivateSpaceEnabled);
+ initializeWithUsers(true, mSystemUser, mManagedUser, mPrivateUser);
+
+ mTabLayout.selectTab(mTabLayout.getTabAt(2));
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mPrivateUser);
+
+ mTestUserManagerState.userIds.remove(mPrivateUser);
+ mTestUserManagerState.userIdToLabelMap.remove(mPrivateUser);
+ mProfileTabs.updateView();
+
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mSystemUser);
+ }
+
+ @Test
+ public void testGetSelectedUser_twoUsers() {
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser, mManagedUser);
mTabLayout.selectTab(mTabLayout.getTabAt(0));
- assertThat(mProfileTabs.getSelectedUser()).isEqualTo(systemUser);
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mSystemUser);
mTabLayout.selectTab(mTabLayout.getTabAt(1));
- assertThat(mProfileTabs.getSelectedUser()).isEqualTo(managedUser);
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mManagedUser);
assertThat(mIsListenerInvoked).isTrue();
}
@Test
+ public void testGetSelectedUser_multiUsers() {
+ assumeTrue(SdkLevel.isAtLeastV() && isPrivateSpaceEnabled);
+ initializeWithUsers(true, mSystemUser, mManagedUser, mPrivateUser);
+
+ List<UserId> expectedProfiles = Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser);
+
+ for (int i = 0; i < 3; ++i) {
+ mTabLayout.selectTab(mTabLayout.getTabAt(i));
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(expectedProfiles.get(i));
+ if (i == 0) continue;
+ assertThat(mIsListenerInvoked).isTrue();
+ }
+ }
+
+ @Test
public void testReselectedUser_doesNotInvokeListener() {
- initializeWithUsers(systemUser, managedUser);
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser, mManagedUser);
assertThat(mTabLayout.getSelectedTabPosition()).isAtLeast(0);
- assertThat(mProfileTabs.getSelectedUser()).isEqualTo(systemUser);
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mSystemUser);
mTabLayout.selectTab(mTabLayout.getTabAt(0));
- assertThat(mProfileTabs.getSelectedUser()).isEqualTo(systemUser);
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mSystemUser);
assertThat(mIsListenerInvoked).isFalse();
}
@Test
- public void testgetSelectedUser_singleUsers() {
- initializeWithUsers(systemUser);
+ public void testGetSelectedUser_singleUsers() {
+ initializeWithUsers(isPrivateSpaceEnabled, mSystemUser);
- assertThat(mProfileTabs.getSelectedUser()).isEqualTo(systemUser);
+ assertThat(mProfileTabs.getSelectedUser()).isEqualTo(mSystemUser);
}
- private void initializeWithUsers(UserId... userIds) {
- mTestUserIdManager.userIds = Lists.newArrayList(userIds);
- for (UserId userId : userIds) {
- if (userId.isSystem()) {
- mTestUserIdManager.systemUser = userId;
- } else {
- mTestUserIdManager.managedUser = userId;
+ private void initializeWithUsers(boolean isPrivateSpaceEnabled, UserId... userIds) {
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ mTestUserManagerState.userIds = Lists.newArrayList(userIds);
+ for (UserId userId : userIds) {
+ if (userId.isSystem()) {
+ mTestUserManagerState.userIdToLabelMap.put(userId, "Personal");
+ } else if (userId.getIdentifier() == 100) {
+ mTestUserManagerState.userIdToLabelMap.put(userId, "Work");
+ } else {
+ mTestUserManagerState.userIdToLabelMap.put(userId, "Private");
+ }
}
+ mProfileTabs = new ProfileTabs(mTabLayoutContainer, mState, mTestUserManagerState,
+ mTestEnv, mTestCommonAddons, mTestConfigStore);
+ } else {
+ mTestConfigStore.disablePrivateSpaceInPhotoPicker();
+ mTestUserIdManager.userIds = Lists.newArrayList(userIds);
+ for (UserId userId : userIds) {
+ if (userId.isSystem()) {
+ mTestUserIdManager.systemUser = userId;
+ } else {
+ mTestUserIdManager.managedUser = userId;
+ }
+ }
+ mProfileTabs = new ProfileTabs(mTabLayoutContainer, mState, mTestUserIdManager,
+ mTestEnv, mTestCommonAddons, mTestConfigStore);
}
-
- mProfileTabs = new ProfileTabs(mTabLayoutContainer, mState, mTestUserIdManager, mTestEnv,
- mTestCommonAddons);
mProfileTabs.updateView();
mProfileTabs.setListener(userId -> mIsListenerInvoked = true);
}
diff --git a/tests/unit/com/android/documentsui/RecentsLoaderTests.java b/tests/unit/com/android/documentsui/RecentsLoaderTests.java
index 915a3bd..bf8c97e 100644
--- a/tests/unit/com/android/documentsui/RecentsLoaderTests.java
+++ b/tests/unit/com/android/documentsui/RecentsLoaderTests.java
@@ -29,7 +29,6 @@
import android.provider.DocumentsContract.Document;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.State;
@@ -41,21 +40,40 @@
import com.android.documentsui.testing.TestImmediateExecutor;
import com.android.documentsui.testing.TestProvidersAccess;
import com.android.documentsui.testing.UserManagers;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
-@RunWith(AndroidJUnit4.class)
+@RunWith(Parameterized.class)
@MediumTest
public class RecentsLoaderTests {
private TestEnv mEnv;
private TestActivity mActivity;
private RecentsLoader mLoader;
+ private TestConfigStore mTestConfigStore;
+
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parameterized test to run all the tests in this class twice, once with private space enabled
+ * and once with private space disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
@Before
public void setUp() {
@@ -63,14 +81,23 @@
mActivity = TestActivity.create(mEnv);
mActivity.activityManager = ActivityManagers.create(false);
mActivity.userManager = UserManagers.create();
+ mTestConfigStore = new TestConfigStore();
+ mEnv.state.configStore = mTestConfigStore;
mEnv.state.action = State.ACTION_BROWSE;
- mEnv.state.acceptMimes = new String[] { "*/*" };
- mEnv.state.canShareAcrossProfile = true;
+ mEnv.state.acceptMimes = new String[]{"*/*"};
+ isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled;
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ mEnv.state.canForwardToProfileIdMap.put(UserId.DEFAULT_USER, true);
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.OtherUser.USER_ID, true);
+ } else {
+ mEnv.state.canShareAcrossProfile = true;
+ }
mLoader = new RecentsLoader(mActivity, mEnv.providers, mEnv.state,
TestImmediateExecutor.createLookup(), new TestFileTypeLookup(),
- UserId.DEFAULT_USER);
+ TestProvidersAccess.USER_ID);
}
@Test
@@ -113,7 +140,7 @@
mEnv.mockProviders.get(TestProvidersAccess.HOME.authority)
.setNextRecentDocumentsReturns(doc1, doc2);
- assertEquals(false, mLoader.mState.showHiddenFiles);
+ assertFalse(mLoader.mState.showHiddenFiles);
DirectoryResult result = mLoader.loadInBackground();
assertEquals(0, result.getCursor().getCount());
@@ -172,7 +199,11 @@
@Test
public void testLoaderOnUserWithoutPermission() {
- mEnv.state.canShareAcrossProfile = false;
+ if (isPrivateSpaceEnabled) {
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.OtherUser.USER_ID, false);
+ } else {
+ mEnv.state.canShareAcrossProfile = false;
+ }
mLoader = new RecentsLoader(mActivity, mEnv.providers, mEnv.state,
TestImmediateExecutor.createLookup(), new TestFileTypeLookup(),
TestProvidersAccess.OtherUser.USER_ID);
diff --git a/tests/unit/com/android/documentsui/UserManagerStateTest.java b/tests/unit/com/android/documentsui/UserManagerStateTest.java
new file mode 100644
index 0000000..25c7607
--- /dev/null
+++ b/tests/unit/com/android/documentsui/UserManagerStateTest.java
@@ -0,0 +1,681 @@
+/*
+ * Copyright (C) 2020 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.documentsui;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.UserProperties;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import com.android.documentsui.base.UserId;
+import com.android.documentsui.testing.UserManagers;
+import com.android.documentsui.util.VersionUtils;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.common.collect.Lists;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@SmallTest
+@SdkSuppress(minSdkVersion = 31, codeName = "S")
+public class UserManagerStateTest {
+
+ private final UserHandle mSystemUser = UserHandle.SYSTEM;
+ private final UserHandle mManagedUser = UserHandle.of(100);
+ private final UserHandle mPrivateUser = UserHandle.of(101);
+ private final UserHandle mOtherUser = UserHandle.of(102);
+ private final UserHandle mNormalUser = UserHandle.of(103);
+
+ private final ResolveInfo mMockInfo1 = mock(ResolveInfo.class);
+ private final ResolveInfo mMockInfo2 = mock(ResolveInfo.class);
+ private final ResolveInfo mMockInfo3 = mock(ResolveInfo.class);
+
+ private final Context mMockContext = mock(Context.class);
+ private final Intent mMockIntent = mock(Intent.class);
+ private final UserManager mMockUserManager = UserManagers.create();
+ private final PackageManager mMockPackageManager = mock(PackageManager.class);
+ private UserManagerState mUserManagerState;
+
+ @Before
+ public void setup() throws Exception {
+ when(mMockContext.getApplicationContext()).thenReturn(mMockContext);
+
+ when(mMockUserManager.isManagedProfile(mManagedUser.getIdentifier())).thenReturn(true);
+ when(mMockUserManager.isManagedProfile(mSystemUser.getIdentifier())).thenReturn(false);
+ when(mMockUserManager.isManagedProfile(mPrivateUser.getIdentifier())).thenReturn(false);
+ when(mMockUserManager.isManagedProfile(mOtherUser.getIdentifier())).thenReturn(false);
+
+ if (SdkLevel.isAtLeastV()) {
+ UserProperties systemUserProperties = new UserProperties.Builder()
+ .setShowInSharingSurfaces(UserProperties.SHOW_IN_SHARING_SURFACES_SEPARATE)
+ .setCrossProfileContentSharingStrategy(
+ UserProperties.CROSS_PROFILE_CONTENT_SHARING_NO_DELEGATION)
+ .build();
+ UserProperties managedUserProperties = new UserProperties.Builder()
+ .setShowInSharingSurfaces(UserProperties.SHOW_IN_SHARING_SURFACES_SEPARATE)
+ .setCrossProfileContentSharingStrategy(
+ UserProperties.CROSS_PROFILE_CONTENT_SHARING_NO_DELEGATION)
+ .setShowInQuietMode(UserProperties.SHOW_IN_QUIET_MODE_PAUSED)
+ .build();
+ UserProperties privateUserProperties = new UserProperties.Builder()
+ .setShowInSharingSurfaces(UserProperties.SHOW_IN_SHARING_SURFACES_SEPARATE)
+ .setCrossProfileContentSharingStrategy(
+ UserProperties.CROSS_PROFILE_CONTENT_SHARING_DELEGATE_FROM_PARENT)
+ .setShowInQuietMode(UserProperties.SHOW_IN_QUIET_MODE_HIDDEN)
+ .build();
+ UserProperties otherUserProperties = new UserProperties.Builder()
+ .setShowInSharingSurfaces(UserProperties.SHOW_IN_SHARING_SURFACES_WITH_PARENT)
+ .setCrossProfileContentSharingStrategy(
+ UserProperties.CROSS_PROFILE_CONTENT_SHARING_DELEGATE_FROM_PARENT)
+ .build();
+ UserProperties normalUserProperties = new UserProperties.Builder()
+ .setShowInSharingSurfaces(UserProperties.SHOW_IN_SHARING_SURFACES_NO)
+ .setCrossProfileContentSharingStrategy(
+ UserProperties.CROSS_PROFILE_CONTENT_SHARING_DELEGATE_FROM_PARENT)
+ .build();
+ when(mMockUserManager.getUserProperties(mSystemUser)).thenReturn(systemUserProperties);
+ when(mMockUserManager.getUserProperties(mManagedUser)).thenReturn(
+ managedUserProperties);
+ when(mMockUserManager.getUserProperties(mPrivateUser)).thenReturn(
+ privateUserProperties);
+ when(mMockUserManager.getUserProperties(mOtherUser)).thenReturn(otherUserProperties);
+ when(mMockUserManager.getUserProperties(mNormalUser)).thenReturn(normalUserProperties);
+ }
+
+ when(mMockUserManager.getProfileParent(mSystemUser)).thenReturn(mSystemUser);
+ when(mMockUserManager.getProfileParent(mManagedUser)).thenReturn(mSystemUser);
+ when(mMockUserManager.getProfileParent(mPrivateUser)).thenReturn(mSystemUser);
+ when(mMockUserManager.getProfileParent(mOtherUser)).thenReturn(mSystemUser);
+ when(mMockUserManager.getProfileParent(mNormalUser)).thenReturn(null);
+
+ if (SdkLevel.isAtLeastR()) {
+ when(mMockInfo1.isCrossProfileIntentForwarderActivity()).thenReturn(true);
+ when(mMockInfo2.isCrossProfileIntentForwarderActivity()).thenReturn(false);
+ when(mMockInfo3.isCrossProfileIntentForwarderActivity()).thenReturn(false);
+ }
+
+ when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mMockContext.getSystemServiceName(UserManager.class)).thenReturn("mMockUserManager");
+ when(mMockContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+ }
+
+ @Test
+ public void testGetUserIds_onlySystemUser_returnsSystemUser() {
+ UserId currentUser = UserId.of(mSystemUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds()).containsExactly(UserId.of(mSystemUser));
+ }
+
+ @Test
+ public void testGetUserIds_allProfilesCurrentUserSystem_allShowInSharingSurfacesSeparate() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mSystemUser);
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser, mOtherUser,
+ mNormalUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser), UserId.of(mManagedUser),
+ UserId.of(mPrivateUser));
+ }
+
+ @Test
+ public void testGetUserIds_allProfilesCurrentUserManaged_allShowInSharingSurfacesSeparate() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mManagedUser);
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser, mOtherUser,
+ mNormalUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser), UserId.of(mManagedUser),
+ UserId.of(mPrivateUser));
+ }
+
+ @Test
+ public void testGetUserIds_allProfilesCurrentUserPrivate_allShowInSharingSurfacesSeparate() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mPrivateUser);
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser, mOtherUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser), UserId.of(mManagedUser),
+ UserId.of(mPrivateUser));
+ }
+
+ @Test
+ public void testGetUserIds_systemAndManagedUserCurrentUserSystem_returnsBoth() {
+ UserId currentUser = UserId.of(mSystemUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser), UserId.of(mManagedUser));
+ }
+
+ @Test
+ public void testGetUserIds_systemAndManagedUserCurrentUserManaged_returnsBoth() {
+ UserId currentUser = UserId.of(mManagedUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser), UserId.of(mManagedUser));
+ }
+
+ @Test
+ public void testGetUserIds_systemAndPrivateUserCurrentUserSystem_returnsBoth() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mSystemUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mPrivateUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser), UserId.of(mPrivateUser));
+ }
+
+ @Test
+ public void testGetUserIds_systemAndPrivateUserCurrentUserPrivate_returnsBoth() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mPrivateUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mPrivateUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser), UserId.of(mPrivateUser));
+ }
+
+ @Test
+ public void testGetUserIds_systemAndOtherUserCurrentUserOtherPreV_returnsCurrentUser() {
+ if (SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mOtherUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mOtherUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(currentUser);
+ }
+
+ @Test
+ public void testGetUserIds_systemAndOtherUserCurrentUserOtherPostV_returnsSystemUser() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mOtherUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mOtherUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser));
+ }
+
+ @Test
+ public void testGetUserIds_normalAndOtherUserCurrentUserNormal_returnsCurrentUser() {
+ // since both users do not have show in sharing surfaces separate, returns current user
+ UserId currentUser = UserId.of(mNormalUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mOtherUser, mNormalUser));
+
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mNormalUser));
+ }
+
+ @Test
+ public void testGetUserIds_systemAndManagedUserCurrentUserSystem_returnsBothInOrder() {
+ // Returns the both if there are system and managed users.
+ if (SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mSystemUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser), UserId.of(mManagedUser)).inOrder();
+ }
+
+ @Test
+ public void testGetUserIds_systemAndManagedUserCurrentUserManaged_returnsBothInOrder() {
+ // Returns the both if there are system and managed users.
+ if (SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mManagedUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser), UserId.of(mManagedUser)).inOrder();
+ }
+
+ @Test
+ public void testGetUserIds_managedAndSystemUserCurrentUserSystem_returnsBothInOrder() {
+ // Returns the both if there are system and managed users, regardless of input list order.
+ if (SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mSystemUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mManagedUser, mSystemUser));
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds())
+ .containsExactly(UserId.of(mSystemUser), UserId.of(mManagedUser)).inOrder();
+ }
+
+ @Test
+ public void testGetUserIds_otherAndManagedUserCurrentUserOtherPreV_returnsCurrentUser() {
+ // When there is no system user, returns the current user.
+ // This is a case theoretically can happen but we don't expect. So we return the current
+ // user only.
+ if (SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mOtherUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mOtherUser, mManagedUser));
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds()).containsExactly(currentUser);
+ }
+
+ @Test
+ public void testGetUserIds_otherAndManagedUserCurrentUserOtherPostV_returnsManagedUser() {
+ // Only the users with show in sharing surfaces separate are eligible to be returned
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mOtherUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mOtherUser, mManagedUser));
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds()).containsExactly(UserId.of(mManagedUser));
+ }
+
+ @Test
+ public void testGetUserIds_otherAndManagedUserCurrentUserManaged_returnsCurrentUser() {
+ // When there is no system user, returns the current user.
+ // This is a case theoretically can happen, but we don't expect. So we return the current
+ // user only.
+ UserId currentUser = UserId.of(mManagedUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mOtherUser, mManagedUser));
+ assertWithMessage("getUserIds returns unexpected list of user ids")
+ .that(mUserManagerState.getUserIds()).containsExactly(currentUser);
+ }
+
+ @Test
+ public void testGetUserIds_unsupportedDeviceCurrent_returnsCurrentUser() {
+ // This test only tests for Android R or later. This test case always passes before R.
+ if (VersionUtils.isAtLeastR()) {
+ // When permission is denied, only returns the current user.
+ when(mMockContext.checkSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS))
+ .thenReturn(PackageManager.PERMISSION_DENIED);
+ UserId currentUser = UserId.of(mSystemUser);
+ when(mMockUserManager.getUserProfiles()).thenReturn(
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser, mOtherUser));
+ mUserManagerState = UserManagerState.create(mMockContext);
+ assertWithMessage("Unsupported device should have returned only the current user")
+ .that(mUserManagerState.getUserIds()).containsExactly(currentUser);
+ }
+ }
+
+ @Test
+ public void testGetUserIds_returnCachedList() {
+ // Returns all three if there are system, managed and private users.
+ UserId currentUser = UserId.of(mSystemUser);
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser, mOtherUser));
+ assertWithMessage("getUserIds does not return cached instance")
+ .that(mUserManagerState.getUserIds())
+ .isSameInstanceAs(mUserManagerState.getUserIds());
+ }
+
+ @Test
+ public void testGetCanForwardToProfileIdMap_systemUserCanForwardToAll() {
+ UserId currentUser = UserId.of(mSystemUser);
+ final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfo1, mMockInfo2);
+ if (SdkLevel.isAtLeastV()) {
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
+ when(mMockPackageManager.queryIntentActivitiesAsUser(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY, mSystemUser)).thenReturn(
+ mMockResolveInfoList);
+ } else {
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser));
+ when(mMockPackageManager.queryIntentActivities(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY)).thenReturn(mMockResolveInfoList);
+ }
+
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
+ expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), true);
+ if (SdkLevel.isAtLeastV()) {
+ expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
+ }
+
+ assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
+ .isEqualTo(expectedCanForwardToProfileIdMap);
+ }
+
+ @Test
+ public void testGetCanForwardToProfileIdMap_systemUserCanForwardToManaged() {
+ UserId currentUser = UserId.of(mSystemUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
+ final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfo1, mMockInfo2);
+ if (SdkLevel.isAtLeastV()) {
+ when(mMockPackageManager.queryIntentActivitiesAsUser(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY, mSystemUser)).thenReturn(
+ mMockResolveInfoList);
+ } else {
+ when(mMockPackageManager.queryIntentActivities(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY)).thenReturn(mMockResolveInfoList);
+ }
+
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
+ expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), true);
+
+ assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
+ .isEqualTo(expectedCanForwardToProfileIdMap);
+ }
+
+ @Test
+ public void testGetCanForwardToProfileIdMap_systemUserCanAlwaysForwardToPrivate() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mSystemUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mPrivateUser));
+
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
+ expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
+
+ assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
+ .isEqualTo(expectedCanForwardToProfileIdMap);
+ }
+
+ @Test
+ public void testGetCanForwardToProfileIdMap_systemUserCanNotForwardToManagedUser() {
+ UserId currentUser = UserId.of(mSystemUser);
+ final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfo2, mMockInfo3);
+ if (SdkLevel.isAtLeastV()) {
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
+ when(mMockPackageManager.queryIntentActivitiesAsUser(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY, mSystemUser)).thenReturn(
+ mMockResolveInfoList);
+ } else {
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser));
+ when(mMockPackageManager.queryIntentActivities(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY)).thenReturn(mMockResolveInfoList);
+ }
+
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
+ expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), false);
+ if (SdkLevel.isAtLeastV()) {
+ expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
+ }
+
+ assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
+ .isEqualTo(expectedCanForwardToProfileIdMap);
+ }
+
+ @Test
+ public void testGetCanForwardToProfileIdMap_managedCanForwardToAll() {
+ UserId currentUser = UserId.of(mManagedUser);
+ final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfo1, mMockInfo2);
+ if (SdkLevel.isAtLeastV()) {
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
+ when(mMockPackageManager.queryIntentActivitiesAsUser(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY, mManagedUser)).thenReturn(
+ mMockResolveInfoList);
+ } else {
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser));
+ when(mMockPackageManager.queryIntentActivities(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY)).thenReturn(mMockResolveInfoList);
+ }
+
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
+ expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), true);
+ if (SdkLevel.isAtLeastV()) {
+ expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
+ }
+
+ assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
+ .isEqualTo(expectedCanForwardToProfileIdMap);
+ }
+
+ @Test
+ public void testGetCanForwardToProfileIdMap_managedCanNotForwardToAll() {
+ UserId currentUser = UserId.of(mManagedUser);
+ final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfo2, mMockInfo3);
+
+ if (SdkLevel.isAtLeastV()) {
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
+ when(mMockPackageManager.queryIntentActivitiesAsUser(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY, mSystemUser)).thenReturn(
+ mMockResolveInfoList);
+ } else {
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser));
+ when(mMockPackageManager.queryIntentActivities(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY)).thenReturn(mMockResolveInfoList);
+ }
+
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
+ expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), false);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), true);
+ if (SdkLevel.isAtLeastV()) {
+ expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), false);
+ }
+
+ assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
+ .isEqualTo(expectedCanForwardToProfileIdMap);
+ }
+
+ @Test
+ public void testGetCanForwardToProfileIdMap_privateCanForwardToAll() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mPrivateUser);
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
+ final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfo1, mMockInfo2);
+ when(mMockPackageManager.queryIntentActivitiesAsUser(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY, mSystemUser)).thenReturn(mMockResolveInfoList);
+
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
+ expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), true);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
+
+ assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
+ .isEqualTo(expectedCanForwardToProfileIdMap);
+ }
+
+ @Test
+ public void testGetCanForwardToProfileIdMap_privateCanNotForwardToManagedUser() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mPrivateUser);
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
+ final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfo2, mMockInfo3);
+ when(mMockPackageManager.queryIntentActivitiesAsUser(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY, mSystemUser)).thenReturn(mMockResolveInfoList);
+
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
+ expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), false);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
+
+ assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
+ .isEqualTo(expectedCanForwardToProfileIdMap);
+ }
+
+ @Test
+ public void testGetCanForwardToProfileIdMap_privateCanAlwaysForwardToSystemUser() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mPrivateUser);
+ initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mPrivateUser));
+
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
+ expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
+ expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
+
+ assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
+ .isEqualTo(expectedCanForwardToProfileIdMap);
+ }
+
+ @Test
+ public void testOnProfileStatusChange_anyIntentActionOnManagedProfile() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mSystemUser);
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
+
+ // UserManagerState#mUserId and UserManagerState#mCanForwardToProfileIdMap will empty
+ // by default if the getters of these member variables have not been called
+ List<UserId> userIdsBeforeIntent = new ArrayList<>(mUserManagerState.getUserIds());
+ Map<UserId, Boolean> canForwardToProfileIdMapBeforeIntent = new HashMap<>(
+ mUserManagerState.getCanForwardToProfileIdMap(mMockIntent));
+
+ String action = "any_intent";
+ mUserManagerState.onProfileActionStatusChange(action, UserId.of(mManagedUser));
+
+ assertWithMessage("Unexpected changes to user id list on receiving intent: " + action)
+ .that(mUserManagerState.getUserIds()).isEqualTo(userIdsBeforeIntent);
+ assertWithMessage(
+ "Unexpected changes to canForwardToProfileIdMap on receiving intent: " + action)
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent)).isEqualTo(
+ canForwardToProfileIdMapBeforeIntent);
+ }
+
+ @Test
+ public void testOnProfileStatusChange_actionProfileUnavailableOnPrivateProfile() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mSystemUser);
+ UserId managedUser = UserId.of(mManagedUser);
+ UserId privateUser = UserId.of(mPrivateUser);
+ final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfo1, mMockInfo2);
+ when(mMockPackageManager.queryIntentActivitiesAsUser(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY, mSystemUser)).thenReturn(
+ mMockResolveInfoList);
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
+
+ // UserManagerState#mUserId and UserManagerState#mCanForwardToProfileIdMap will empty
+ // by default if the getters of these member variables have not been called
+ List<UserId> userIdsBeforeIntent = new ArrayList<>(mUserManagerState.getUserIds());
+ Map<UserId, Boolean> canForwardToProfileIdMapBeforeIntent = new HashMap<>(
+ mUserManagerState.getCanForwardToProfileIdMap(mMockIntent));
+
+ List<UserId> expectedUserIdsAfterIntent = Lists.newArrayList(currentUser, managedUser);
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMapAfterIntent = new HashMap<>();
+ expectedCanForwardToProfileIdMapAfterIntent.put(currentUser, true);
+ expectedCanForwardToProfileIdMapAfterIntent.put(managedUser, true);
+
+ String action = Intent.ACTION_PROFILE_UNAVAILABLE;
+ mUserManagerState.onProfileActionStatusChange(action, privateUser);
+
+ assertWithMessage(
+ "UserIds list should not be same before and after receiving intent: " + action)
+ .that(mUserManagerState.getUserIds()).isNotEqualTo(userIdsBeforeIntent);
+ assertWithMessage("Unexpected changes to user id list on receiving intent: " + action)
+ .that(mUserManagerState.getUserIds()).isEqualTo(expectedUserIdsAfterIntent);
+ assertWithMessage(
+ "CanForwardToLabelMap should not be same before and after receiving intent: "
+ + action)
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent)).isNotEqualTo(
+ canForwardToProfileIdMapBeforeIntent);
+ assertWithMessage(
+ "Unexpected changes to canForwardToProfileIdMap on receiving intent: " + action)
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent)).isEqualTo(
+ expectedCanForwardToProfileIdMapAfterIntent);
+ }
+
+ @Test
+ public void testOnProfileStatusChange_actionProfileAvailableOnPrivateProfile() {
+ if (!SdkLevel.isAtLeastV()) return;
+ UserId currentUser = UserId.of(mSystemUser);
+ UserId managedUser = UserId.of(mManagedUser);
+ UserId privateUser = UserId.of(mPrivateUser);
+ final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfo1, mMockInfo2);
+ when(mMockPackageManager.queryIntentActivitiesAsUser(mMockIntent,
+ PackageManager.MATCH_DEFAULT_ONLY, mSystemUser)).thenReturn(
+ mMockResolveInfoList);
+ initializeUserManagerState(currentUser,
+ Lists.newArrayList(mSystemUser, mManagedUser));
+
+ // UserManagerState#mUserId and UserManagerState#mCanForwardToProfileIdMap will empty
+ // by default if the getters of these member variables have not been called
+ List<UserId> userIdsBeforeIntent = new ArrayList<>(mUserManagerState.getUserIds());
+ Map<UserId, Boolean> canForwardToProfileIdMapBeforeIntent = new HashMap<>(
+ mUserManagerState.getCanForwardToProfileIdMap(mMockIntent));
+
+ List<UserId> expectedUserIdsAfterIntent = Lists.newArrayList(currentUser, managedUser,
+ privateUser);
+ Map<UserId, Boolean> expectedCanForwardToProfileIdMapAfterIntent = new HashMap<>();
+ expectedCanForwardToProfileIdMapAfterIntent.put(currentUser, true);
+ expectedCanForwardToProfileIdMapAfterIntent.put(managedUser, true);
+ expectedCanForwardToProfileIdMapAfterIntent.put(privateUser, true);
+
+ String action = Intent.ACTION_PROFILE_AVAILABLE;
+ mUserManagerState.onProfileActionStatusChange(action, privateUser);
+
+ assertWithMessage(
+ "UserIds list should not be same before and after receiving intent: " + action)
+ .that(mUserManagerState.getUserIds()).isNotEqualTo(userIdsBeforeIntent);
+ assertWithMessage("Unexpected changes to user id list on receiving intent: " + action)
+ .that(mUserManagerState.getUserIds()).isEqualTo(expectedUserIdsAfterIntent);
+ assertWithMessage(
+ "CanForwardToLabelMap should not be same before and after receiving intent: "
+ + action)
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent)).isNotEqualTo(
+ canForwardToProfileIdMapBeforeIntent);
+ assertWithMessage(
+ "Unexpected changes to canForwardToProfileIdMap on receiving intent: " + action)
+ .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent)).isEqualTo(
+ expectedCanForwardToProfileIdMapAfterIntent);
+ }
+
+ private void initializeUserManagerState(UserId current, List<UserHandle> usersOnDevice) {
+ when(mMockUserManager.getUserProfiles()).thenReturn(usersOnDevice);
+ TestConfigStore testConfigStore = new TestConfigStore();
+ testConfigStore.enablePrivateSpaceInPhotoPicker();
+ mUserManagerState = new UserManagerState.RuntimeUserManagerState(mMockContext, current,
+ true, testConfigStore);
+ }
+}
diff --git a/tests/unit/com/android/documentsui/dirlist/AccessibilityTest.java b/tests/unit/com/android/documentsui/dirlist/AccessibilityTest.java
index cfcbf0f..09b1933 100644
--- a/tests/unit/com/android/documentsui/dirlist/AccessibilityTest.java
+++ b/tests/unit/com/android/documentsui/dirlist/AccessibilityTest.java
@@ -25,6 +25,7 @@
import androidx.recyclerview.widget.RecyclerView;
import androidx.test.filters.SmallTest;
+import com.android.documentsui.TestConfigStore;
import com.android.documentsui.testing.TestRecyclerView;
import com.android.documentsui.testing.Views;
@@ -61,12 +62,36 @@
assertTrue(info.isSelected());
}
- public void testNullItemDetails_NoActionClick() throws Exception {
+ public void testNullItemDetails_NoActionClick_PrivateSpaceEnabled() throws Exception {
View item = Views.createTestView(true);
AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain();
List<RecyclerView.ViewHolder> holders = new ArrayList<>();
- holders.add(new MessageHolder(mView.getContext(), new Space(mView.getContext())) {
+ TestConfigStore testConfigStore = new TestConfigStore();
+ testConfigStore.enablePrivateSpaceInPhotoPicker();
+ holders.add(new MessageHolder(mView.getContext(), new Space(mView.getContext()),
+ testConfigStore) {
+ @Override
+ public void bind(Cursor cursor, String modelId) {
+
+ }
+ });
+
+ mView.setHolders(holders);
+
+ mAccessibilityDelegate.getItemDelegate().onInitializeAccessibilityNodeInfo(item, info);
+ assertFalse(info.isClickable());
+ }
+
+ public void testNullItemDetails_NoActionClick_PrivateSpaceDisabled() throws Exception {
+ View item = Views.createTestView(true);
+ AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain();
+
+ List<RecyclerView.ViewHolder> holders = new ArrayList<>();
+ TestConfigStore testConfigStore = new TestConfigStore();
+ testConfigStore.disablePrivateSpaceInPhotoPicker();
+ holders.add(new MessageHolder(mView.getContext(), new Space(mView.getContext()),
+ testConfigStore) {
@Override
public void bind(Cursor cursor, String modelId) {
diff --git a/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java b/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java
index 6482440..a69a913 100644
--- a/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java
+++ b/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java
@@ -35,7 +35,9 @@
import com.android.documentsui.ActionHandler;
import com.android.documentsui.BaseActivity;
import com.android.documentsui.R;
+import com.android.documentsui.TestConfigStore;
import com.android.documentsui.TestUserIdManager;
+import com.android.documentsui.TestUserManagerState;
import com.android.documentsui.base.State;
import com.android.documentsui.base.UserId;
import com.android.documentsui.sidebar.AppItem;
@@ -45,15 +47,21 @@
import com.android.documentsui.testing.TestProvidersAccess;
import com.android.documentsui.testing.TestResolveInfo;
import com.android.documentsui.util.VersionUtils;
+import com.android.modules.utils.build.SdkLevel;
import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
import java.util.ArrayList;
import java.util.List;
+@RunWith(Parameterized.class)
public class AppsRowManagerTest {
private AppsRowManager mAppsRowManager;
@@ -62,17 +70,32 @@
private boolean mMaybeShowBadge;
private BaseActivity mActivity;
private TestUserIdManager mTestUserIdManager;
+ private TestUserManagerState mTestUserManagerState;
private State mState;
private View mAppsRow;
private LinearLayout mAppsGroup;
+ private final TestConfigStore mTestConfigStore = new TestConfigStore();
+
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return com.google.android.collect.Lists.newArrayList(true, false);
+ }
@Before
public void setUp() {
mActionHandler = new TestActionHandler();
mTestUserIdManager = new TestUserIdManager();
+ mTestUserManagerState = new TestUserManagerState();
- mAppsRowManager = new AppsRowManager(mActionHandler, mMaybeShowBadge, mTestUserIdManager);
+ mAppsRowManager = getAppsRowManager();
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
LayoutInflater layoutInflater = LayoutInflater.from(context);
@@ -81,18 +104,39 @@
mAppsRow = layoutInflater.inflate(R.layout.apps_row, null);
mAppsGroup = mAppsRow.findViewById(R.id.apps_row);
+ mState.configStore = mTestConfigStore;
+
when(mActivity.getLayoutInflater()).thenReturn(layoutInflater);
when(mActivity.getDisplayState()).thenReturn(mState);
when(mActivity.findViewById(R.id.apps_row)).thenReturn(mAppsRow);
when(mActivity.findViewById(R.id.apps_group)).thenReturn(mAppsGroup);
when(mActivity.getSelectedUser()).thenReturn(TestProvidersAccess.USER_ID);
+ isPrivateSpaceEnabled &= SdkLevel.isAtLeastS();
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ }
+ }
+
+ private AppsRowManager getAppsRowManager() {
+ if (isPrivateSpaceEnabled && SdkLevel.isAtLeastS()) {
+ mTestUserManagerState = new TestUserManagerState();
+ mTestUserManagerState.userIds =
+ Lists.newArrayList(UserId.DEFAULT_USER, TestProvidersAccess.OtherUser.USER_ID,
+ TestProvidersAccess.AnotherUser.USER_ID);
+ return new AppsRowManager(mActionHandler, mMaybeShowBadge, mTestUserManagerState,
+ mTestConfigStore);
+ }
+ mTestUserIdManager = new TestUserIdManager();
mTestUserIdManager.userIds =
Lists.newArrayList(UserId.DEFAULT_USER, TestProvidersAccess.OtherUser.USER_ID);
+ return new AppsRowManager(mActionHandler, mMaybeShowBadge, mTestUserIdManager,
+ mTestConfigStore);
}
@Test
public void testUpdateList_byRootItem() {
+ mActivity.setConfigStore(mTestConfigStore);
final List<Item> rootList = new ArrayList<>();
rootList.add(new RootItem(TestProvidersAccess.INSPECTOR, mActionHandler, mMaybeShowBadge));
rootList.add(new RootItem(TestProvidersAccess.PICKLES, mActionHandler, mMaybeShowBadge));
@@ -105,15 +149,16 @@
assertEquals(chipDataList.size(), rootList.size());
assertEquals(TestProvidersAccess.INSPECTOR.title, chipDataList.get(0).getTitle());
- assertEquals(null, chipDataList.get(0).getSummary());
+ assertNull(chipDataList.get(0).getSummary());
assertEquals(TestProvidersAccess.PICKLES.title, chipDataList.get(1).getTitle());
- assertEquals(null, chipDataList.get(1).getSummary());
+ assertNull(chipDataList.get(1).getSummary());
assertEquals(TestProvidersAccess.PICKLES.summary, chipDataList.get(2).getSummary());
assertEquals(TestProvidersAccess.PICKLES.summary, chipDataList.get(3).getSummary());
}
@Test
public void testUpdateList_byHybridItem() {
+ mActivity.setConfigStore(mTestConfigStore);
final String testPackageName = "com.test1";
final ResolveInfo info = TestResolveInfo.create();
info.activityInfo.packageName = testPackageName;
@@ -136,6 +181,7 @@
@Test
public void testUpdateView_matchedState_showRow() {
+ mActivity.setConfigStore(mTestConfigStore);
mState.action = State.ACTION_BROWSE;
mState.stack.changeRoot(TestProvidersAccess.RECENTS);
final List<Item> rootList = new ArrayList<>();
@@ -150,6 +196,7 @@
@Test
public void testUpdateView_showSelectedUserItems() {
+ mActivity.setConfigStore(mTestConfigStore);
mState.action = State.ACTION_GET_CONTENT;
mState.stack.changeRoot(TestProvidersAccess.RECENTS);
final List<Item> rootList = new ArrayList<>();
@@ -173,6 +220,7 @@
if (!VersionUtils.isAtLeastR()) {
return;
}
+ mActivity.setConfigStore(mTestConfigStore);
mState.action = State.ACTION_GET_CONTENT;
when(mActivity.getSelectedUser()).thenReturn(TestProvidersAccess.OtherUser.USER_ID);
mState.stack.changeRoot(TestProvidersAccess.RECENTS);
@@ -194,6 +242,7 @@
@Test
public void testUpdateView_notInRecent_hideRow() {
+ mActivity.setConfigStore(mTestConfigStore);
mState.action = State.ACTION_BROWSE;
final List<Item> rootList = new ArrayList<>();
rootList.add(new RootItem(TestProvidersAccess.INSPECTOR, mActionHandler, mMaybeShowBadge));
@@ -208,6 +257,7 @@
@Test
public void testUpdateView_notHandledAction_hideRow() {
+ mActivity.setConfigStore(mTestConfigStore);
mState.action = State.ACTION_OPEN_TREE;
mState.stack.changeRoot(TestProvidersAccess.RECENTS);
@@ -222,6 +272,7 @@
@Test
public void testUpdateView_noItems_hideRow() {
+ mActivity.setConfigStore(mTestConfigStore);
mState.action = State.ACTION_BROWSE;
mState.stack.changeRoot(TestProvidersAccess.RECENTS);
@@ -235,6 +286,7 @@
@Test
public void testUpdateView_crossProfileSearch_hideRow() {
+ mActivity.setConfigStore(mTestConfigStore);
mState.supportsCrossProfile = true;
when(mActivity.isSearchExpanded()).thenReturn(true);
@@ -256,6 +308,7 @@
@Test
public void testUpdateView_notCrossProfileSearch_showRow() {
+ mActivity.setConfigStore(mTestConfigStore);
mState.supportsCrossProfile = true;
when(mActivity.isSearchExpanded()).thenReturn(false);
@@ -277,6 +330,7 @@
@Test
public void testUpdateView_noItemsOnSelectedUser_hideRow() {
+ mActivity.setConfigStore(mTestConfigStore);
mState.supportsCrossProfile = true;
mState.stack.changeRoot(TestProvidersAccess.RECENTS);
when(mActivity.getSelectedUser()).thenReturn(TestProvidersAccess.OtherUser.USER_ID);
diff --git a/tests/unit/com/android/documentsui/dirlist/DocumentHolderTest.java b/tests/unit/com/android/documentsui/dirlist/DocumentHolderTest.java
index 2574f73..bd76f57 100644
--- a/tests/unit/com/android/documentsui/dirlist/DocumentHolderTest.java
+++ b/tests/unit/com/android/documentsui/dirlist/DocumentHolderTest.java
@@ -27,24 +27,26 @@
import android.view.MotionEvent.PointerCoords;
import android.view.MotionEvent.PointerProperties;
-import androidx.test.filters.SmallTest;
import androidx.test.filters.Suppress;
import com.android.documentsui.R;
+import com.android.documentsui.TestConfigStore;
-@SmallTest
public class DocumentHolderTest extends AndroidTestCase {
DocumentHolder mHolder;
TestListener mListener;
+ TestConfigStore mTestConfigStore = new TestConfigStore();
@Override
public void setUp() throws Exception {
Context context = getContext();
LayoutInflater inflater = LayoutInflater.from(context);
- mHolder = new DocumentHolder(getContext(), inflater.inflate(R.layout.item_doc_list, null)) {
+ mHolder = new DocumentHolder(getContext(), inflater.inflate(R.layout.item_doc_list, null),
+ mTestConfigStore) {
@Override
- public void bind(Cursor cursor, String modelId) {}
+ public void bind(Cursor cursor, String modelId) {
+ }
};
mListener = new TestListener();
@@ -67,12 +69,12 @@
public MotionEvent createEvent(int tooltype) {
long time = SystemClock.uptimeMillis();
- PointerProperties properties[] = new PointerProperties[] {
+ PointerProperties[] properties = new PointerProperties[]{
new PointerProperties()
};
properties[0].toolType = tooltype;
- PointerCoords coords[] = new PointerCoords[] {
+ PointerCoords[] coords = new PointerCoords[]{
new PointerCoords()
};
@@ -96,7 +98,7 @@
0, // edgeflags
0, // source
0 // flags
- );
+ );
}
private class TestListener extends KeyboardEventListener<DocumentItemDetails> {
diff --git a/tests/unit/com/android/documentsui/dirlist/IconHelperTest.java b/tests/unit/com/android/documentsui/dirlist/IconHelperTest.java
index d2419e8..2df2ae2 100644
--- a/tests/unit/com/android/documentsui/dirlist/IconHelperTest.java
+++ b/tests/unit/com/android/documentsui/dirlist/IconHelperTest.java
@@ -24,51 +24,119 @@
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.documentsui.TestConfigStore;
+import com.android.documentsui.TestUserManagerState;
import com.android.documentsui.ThumbnailCache;
import com.android.documentsui.base.State;
import com.android.documentsui.base.UserId;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
@SmallTest
+@RunWith(Parameterized.class)
public final class IconHelperTest {
-
+ private final UserId mSystemUser = UserId.of(UserHandle.SYSTEM);
+ private final UserId mManagedUser = UserId.of(100);
+ private final UserId mPrivateUser = UserId.of(101);
private Context mContext;
private IconHelper mIconHelper;
private ThumbnailCache mThumbnailCache = new ThumbnailCache(1000);
+ private final TestUserManagerState mTestUserManagerState = new TestUserManagerState();
+ private final TestConfigStore mTestConfigStore = new TestConfigStore();
- private UserId systemUser = UserId.of(UserHandle.SYSTEM);
- private UserId managedUser = UserId.of(100);
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
@Before
public void setUp() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
- mIconHelper = new IconHelper(mContext, State.MODE_LIST, /* maybeShowBadge= */ true,
- mThumbnailCache, managedUser);
+
+ isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled;
+ mIconHelper = isPrivateSpaceEnabled
+ ? new IconHelper(mContext, State.MODE_LIST, /* maybeShowBadge= */ true,
+ mThumbnailCache, null, mTestUserManagerState, mTestConfigStore)
+ : new IconHelper(mContext, State.MODE_LIST, /* maybeShowBadge= */ true,
+ mThumbnailCache, mManagedUser, null, mTestConfigStore);
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ mTestUserManagerState.userIds = SdkLevel.isAtLeastV()
+ ? Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser)
+ : Lists.newArrayList(mSystemUser, mManagedUser);
+ }
}
@Test
public void testShouldShowBadge_returnFalse_onSystemUser() {
- assertThat(mIconHelper.shouldShowBadge(systemUser.getIdentifier())).isFalse();
+ assertThat(mIconHelper.shouldShowBadge(mSystemUser.getIdentifier())).isFalse();
}
@Test
public void testShouldShowBadge_returnTrue_onManagedUser() {
- assertThat(mIconHelper.shouldShowBadge(managedUser.getIdentifier())).isTrue();
+ assertThat(mIconHelper.shouldShowBadge(mManagedUser.getIdentifier())).isTrue();
+ }
+
+ @Test
+ public void testShouldShowBadge_returnTrue_onPrivateUser() {
+ if (!SdkLevel.isAtLeastV() || !isPrivateSpaceEnabled) return;
+ assertThat(mIconHelper.shouldShowBadge(mPrivateUser.getIdentifier())).isTrue();
}
@Test
public void testShouldShowBadge_returnFalse_onManagedUser_doNotShowBadge() {
+ if (isPrivateSpaceEnabled) return;
mIconHelper = new IconHelper(mContext, State.MODE_LIST, /* maybeShowBadge= */ false,
- mThumbnailCache, managedUser);
- assertThat(mIconHelper.shouldShowBadge(managedUser.getIdentifier())).isFalse();
+ mThumbnailCache, mManagedUser, null, mTestConfigStore);
+ assertThat(mIconHelper.shouldShowBadge(mManagedUser.getIdentifier())).isFalse();
}
@Test
- public void testShouldShowBadge_returnFalse_onManagedUser_withoutManagedUser() {
+ public void testShouldShowBadge_returnFalseOnPrivateUser_doNotShowBadge() {
+ if (!isPrivateSpaceEnabled) return;
+ mIconHelper = new IconHelper(mContext, State.MODE_LIST, /* maybeShowBadge= */ false,
+ mThumbnailCache, null, mTestUserManagerState, mTestConfigStore);
+ assertThat(mIconHelper.shouldShowBadge(mPrivateUser.getIdentifier())).isFalse();
+ }
+
+ @Test
+ public void testShouldShowBadge_returnFalseOnManagedUser_withoutManagedUser() {
+ if (isPrivateSpaceEnabled) return;
mIconHelper = new IconHelper(mContext, State.MODE_LIST, /* maybeShowBadge= */ true,
- mThumbnailCache, /* managedUser= */ null);
- assertThat(mIconHelper.shouldShowBadge(managedUser.getIdentifier())).isFalse();
+ mThumbnailCache, /* mManagedUser= */ null, null, mTestConfigStore);
+ assertThat(mIconHelper.shouldShowBadge(mManagedUser.getIdentifier())).isFalse();
+ }
+
+ @Test
+ public void testShouldShowBadge_returnFalseOnManagedUser_withoutMultipleUsers() {
+ if (!isPrivateSpaceEnabled) return;
+ mTestUserManagerState.userIds = Lists.newArrayList(mManagedUser);
+ mIconHelper = new IconHelper(mContext, State.MODE_LIST, /* maybeShowBadge= */ true,
+ mThumbnailCache, /* mManagedUser= */ null, mTestUserManagerState, mTestConfigStore);
+ assertThat(mIconHelper.shouldShowBadge(mManagedUser.getIdentifier())).isFalse();
+ }
+
+ @Test
+ public void testShouldShowBadge_returnFalseOnPrivateUser_withoutMultipleUsers() {
+ if (!SdkLevel.isAtLeastV() || !isPrivateSpaceEnabled) return;
+ mTestUserManagerState.userIds = Lists.newArrayList(mPrivateUser);
+ mIconHelper = new IconHelper(mContext, State.MODE_LIST, /* maybeShowBadge= */ true,
+ mThumbnailCache, /* mManagedUser= */ null, mTestUserManagerState, mTestConfigStore);
+ assertThat(mIconHelper.shouldShowBadge(mPrivateUser.getIdentifier())).isFalse();
}
}
diff --git a/tests/unit/com/android/documentsui/dirlist/InflateMessageDocumentHolderTest.java b/tests/unit/com/android/documentsui/dirlist/InflateMessageDocumentHolderTest.java
index 436e4fb..507e9bf 100644
--- a/tests/unit/com/android/documentsui/dirlist/InflateMessageDocumentHolderTest.java
+++ b/tests/unit/com/android/documentsui/dirlist/InflateMessageDocumentHolderTest.java
@@ -18,7 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
import android.content.Context;
+import android.content.pm.UserProperties;
+import android.os.UserManager;
import android.view.View;
import android.widget.Button;
@@ -28,15 +32,29 @@
import com.android.documentsui.CrossProfileQuietModeException;
import com.android.documentsui.Model;
import com.android.documentsui.R;
+import com.android.documentsui.TestConfigStore;
import com.android.documentsui.base.State;
+import com.android.documentsui.base.UserId;
import com.android.documentsui.testing.TestActionHandler;
import com.android.documentsui.testing.TestEnv;
import com.android.documentsui.testing.TestProvidersAccess;
+import com.android.documentsui.testing.UserManagers;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+import java.util.HashMap;
+import java.util.Map;
@SmallTest
+@RunWith(Parameterized.class)
public final class InflateMessageDocumentHolderTest {
private Context mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
@@ -45,23 +63,70 @@
private Message mInflateMessage;
private TestActionHandler mTestActionHandler = new TestActionHandler();
private InflateMessageDocumentHolder mHolder;
+ private TestConfigStore mTestConfigStore = new TestConfigStore();
+
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
@Before
public void setUp() {
DocumentsAdapter.Environment env =
new TestEnvironment(mContext, TestEnv.create(), mTestActionHandler);
env.getDisplayState().action = State.ACTION_GET_CONTENT;
- env.getDisplayState().canShareAcrossProfile = true;
env.getDisplayState().supportsCrossProfile = true;
- mInflateMessage = new Message.InflateMessage(env, mDefaultCallback);
+
mContext.setTheme(R.style.DocumentsTheme);
mContext.getTheme().applyStyle(R.style.DocumentsDefaultTheme, /* force= */false);
- mHolder = new InflateMessageDocumentHolder(mContext, /* parent= */null);
+ isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled;
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ Map<UserId, String> userIdToLabelMap = new HashMap<>();
+ userIdToLabelMap.put(TestProvidersAccess.USER_ID, "Personal");
+ userIdToLabelMap.put(TestProvidersAccess.OtherUser.USER_ID, "Work");
+ env.getDisplayState().canForwardToProfileIdMap.put(TestProvidersAccess.USER_ID, true);
+ env.getDisplayState().canForwardToProfileIdMap.put(
+ TestProvidersAccess.OtherUser.USER_ID, true);
+ UserManager userManager = UserManagers.create();
+ if (SdkLevel.isAtLeastV()) {
+ userIdToLabelMap.put(TestProvidersAccess.AnotherUser.USER_ID, "Private");
+ env.getDisplayState().canForwardToProfileIdMap.put(
+ TestProvidersAccess.AnotherUser.USER_ID, true);
+ UserProperties otherUserProperties = new UserProperties.Builder()
+ .setShowInQuietMode(UserProperties.SHOW_IN_QUIET_MODE_PAUSED)
+ .build();
+ UserProperties anotherUserProperties = new UserProperties.Builder()
+ .setShowInQuietMode(UserProperties.SHOW_IN_QUIET_MODE_PAUSED)
+ .build();
+ when(userManager.getUserProperties(TestProvidersAccess.OtherUser.USER_HANDLE))
+ .thenReturn(otherUserProperties);
+ when(userManager.getUserProperties(TestProvidersAccess.AnotherUser.USER_HANDLE))
+ .thenReturn(anotherUserProperties);
+ }
+
+ mInflateMessage = new Message.InflateMessage(env, mDefaultCallback,
+ TestProvidersAccess.USER_ID,
+ TestProvidersAccess.OtherUser.USER_ID, userIdToLabelMap, userManager,
+ mTestConfigStore);
+ } else {
+ mInflateMessage = new Message.InflateMessage(env, mDefaultCallback, mTestConfigStore);
+ env.getDisplayState().canShareAcrossProfile = true;
+ }
+ mHolder = new InflateMessageDocumentHolder(mContext, /* parent= */null, mTestConfigStore);
}
@Test
public void testClickingButtonShouldShowProgressBar() {
+ if (SdkLevel.isAtLeastV()) return;
Model.Update error = new Model.Update(
new CrossProfileQuietModeException(TestProvidersAccess.OtherUser.USER_ID),
/* remoteActionsEnabled= */ true);
diff --git a/tests/unit/com/android/documentsui/dirlist/MessageTest.java b/tests/unit/com/android/documentsui/dirlist/MessageTest.java
index 0816684..efc25f5 100644
--- a/tests/unit/com/android/documentsui/dirlist/MessageTest.java
+++ b/tests/unit/com/android/documentsui/dirlist/MessageTest.java
@@ -16,6 +16,8 @@
package com.android.documentsui.dirlist;
+import static com.android.documentsui.DevicePolicyResources.Drawables.Style.OUTLINE;
+import static com.android.documentsui.DevicePolicyResources.Drawables.WORK_PROFILE_OFF_ICON;
import static com.android.documentsui.DevicePolicyResources.Strings.CANT_SELECT_WORK_FILES_MESSAGE;
import static com.android.documentsui.DevicePolicyResources.Strings.CANT_SELECT_WORK_FILES_TITLE;
import static com.android.documentsui.DevicePolicyResources.Strings.WORK_PROFILE_OFF_ENABLE_BUTTON;
@@ -31,6 +33,9 @@
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyResourcesManager;
import android.content.Context;
+import android.content.pm.UserProperties;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
import android.os.UserManager;
import androidx.core.util.Preconditions;
@@ -41,17 +46,29 @@
import com.android.documentsui.CrossProfileQuietModeException;
import com.android.documentsui.Model;
import com.android.documentsui.R;
+import com.android.documentsui.TestConfigStore;
import com.android.documentsui.base.State;
import com.android.documentsui.base.UserId;
import com.android.documentsui.testing.TestActionHandler;
import com.android.documentsui.testing.TestEnv;
+import com.android.documentsui.testing.TestProvidersAccess;
import com.android.documentsui.testing.UserManagers;
import com.android.modules.utils.build.SdkLevel;
+import com.google.common.collect.Lists;
+
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+import java.util.HashMap;
+import java.util.Map;
@SmallTest
+@RunWith(Parameterized.class)
public final class MessageTest {
private UserId mUserId = UserId.of(100);
@@ -62,6 +79,19 @@
private UserManager mUserManager;
private DevicePolicyManager mDevicePolicyManager;
private TestActionHandler mTestActionHandler;
+ private final TestConfigStore mTestConfigStore = new TestConfigStore();
+
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
@Before
public void setUp() {
@@ -69,7 +99,8 @@
mUserManager = UserManagers.create();
mTestActionHandler = new TestActionHandler();
mDevicePolicyManager = mock(DevicePolicyManager.class);
- when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+ when(mContext.getSystemServiceName(UserManager.class)).thenReturn("mUserManager");
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
when(mContext.getSystemServiceName(DevicePolicyManager.class))
.thenReturn(Context.DEVICE_POLICY_SERVICE);
when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE))
@@ -79,7 +110,28 @@
DocumentsAdapter.Environment env =
new TestEnvironment(mContext, TestEnv.create(), mTestActionHandler);
env.getDisplayState().action = State.ACTION_GET_CONTENT;
- mInflateMessage = new Message.InflateMessage(env, mDefaultCallback);
+
+ isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled;
+ if (SdkLevel.isAtLeastV()) {
+ UserProperties userProperties = new UserProperties.Builder()
+ .setShowInQuietMode(UserProperties.SHOW_IN_QUIET_MODE_PAUSED)
+ .build();
+ UserHandle userHandle = UserHandle.of(mUserId.getIdentifier());
+ when(mUserManager.getUserProperties(userHandle)).thenReturn(userProperties);
+ }
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ String personalLabel = mContext.getString(R.string.personal_tab);
+ String workLabel = mContext.getString(R.string.work_tab);
+ Map<UserId, String> userIdToLabelMap = new HashMap<>();
+ userIdToLabelMap.put(TestProvidersAccess.USER_ID, personalLabel);
+ userIdToLabelMap.put(mUserId, workLabel);
+ mInflateMessage = new Message.InflateMessage(env, mDefaultCallback,
+ TestProvidersAccess.USER_ID, mUserId, userIdToLabelMap, mUserManager,
+ mTestConfigStore);
+ } else {
+ mInflateMessage = new Message.InflateMessage(env, mDefaultCallback, mTestConfigStore);
+ }
}
@Test
@@ -115,6 +167,7 @@
@Test
public void testInflateMessage_updateToCrossProfileQuietMode() {
+ if (SdkLevel.isAtLeastV()) return;
Model.Update error = new Model.Update(
new CrossProfileQuietModeException(mUserId),
/* isRemoteActionsEnabled= */ true);
@@ -143,4 +196,47 @@
assertThat(mTestActionHandler.mRequestDisablingQuietModeHappened).isTrue();
}
+
+ @Test
+ public void testInflateMessage_updateToCrossProfileQuietMode_PostV() {
+ if (!SdkLevel.isAtLeastV()) return;
+ Model.Update error = new Model.Update(
+ new CrossProfileQuietModeException(mUserId),
+ /* isRemoteActionsEnabled= */ true);
+
+ DevicePolicyResourcesManager devicePolicyResourcesManager = mock(
+ DevicePolicyResourcesManager.class);
+ when(mDevicePolicyManager.getResources()).thenReturn(devicePolicyResourcesManager);
+
+ if (isPrivateSpaceEnabled) {
+ Drawable icon = mContext.getDrawable(R.drawable.work_off);
+ when(devicePolicyResourcesManager.getDrawable(eq(WORK_PROFILE_OFF_ICON), eq(OUTLINE),
+ any()))
+ .thenReturn(icon);
+ } else {
+ String title = mContext.getString(R.string.quiet_mode_error_title);
+ String text = mContext.getString(R.string.quiet_mode_button);
+ when(devicePolicyResourcesManager.getString(eq(WORK_PROFILE_OFF_ERROR_TITLE), any()))
+ .thenReturn(title);
+ when(devicePolicyResourcesManager.getString(eq(WORK_PROFILE_OFF_ENABLE_BUTTON), any()))
+ .thenReturn(text);
+ }
+ mInflateMessage.update(error);
+
+ assertThat(mInflateMessage.getLayout())
+ .isEqualTo(InflateMessageDocumentHolder.LAYOUT_CROSS_PROFILE_ERROR);
+
+ if (!isPrivateSpaceEnabled) {
+ assert mInflateMessage.getTitleString() != null;
+ assertThat(mInflateMessage.getTitleString())
+ .isEqualTo(mContext.getString(R.string.quiet_mode_error_title));
+ assert mInflateMessage.getButtonString() != null;
+ assertThat(mInflateMessage.getButtonString().toString()).isEqualTo(
+ mContext.getString(R.string.quiet_mode_button));
+ }
+ assertThat(mInflateMessage.mCallback).isNotNull();
+ mInflateMessage.mCallback.run();
+
+ assertThat(mTestActionHandler.mRequestDisablingQuietModeHappened).isTrue();
+ }
}
diff --git a/tests/unit/com/android/documentsui/files/ActionHandlerTest.java b/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
index 62fea24..049d064 100644
--- a/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
+++ b/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
@@ -47,12 +47,12 @@
import androidx.core.util.Preconditions;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.documentsui.AbstractActionHandler;
import com.android.documentsui.ModelId;
import com.android.documentsui.R;
import com.android.documentsui.TestActionModeAddons;
+import com.android.documentsui.TestConfigStore;
import com.android.documentsui.archives.ArchivesProvider;
import com.android.documentsui.base.DebugFlags;
import com.android.documentsui.base.DocumentInfo;
@@ -72,16 +72,22 @@
import com.android.documentsui.testing.UserManagers;
import com.android.documentsui.ui.TestDialogController;
import com.android.documentsui.util.VersionUtils;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-@RunWith(AndroidJUnit4.class)
+@RunWith(Parameterized.class)
@MediumTest
public class ActionHandlerTest {
@@ -93,8 +99,21 @@
private TestDocumentClipper mClipper;
private TestDragAndDropManager mDragAndDropManager;
private TestFeatures mFeatures;
+ private TestConfigStore mTestConfigStore;
private boolean refreshAnswer = false;
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
+
@Before
public void setUp() {
mFeatures = new TestFeatures();
@@ -105,6 +124,14 @@
mDialogs = new TestDialogController();
mClipper = new TestDocumentClipper();
mDragAndDropManager = new TestDragAndDropManager();
+ mTestConfigStore = new TestConfigStore();
+ mEnv.state.configStore = mTestConfigStore;
+
+ isPrivateSpaceEnabled &= SdkLevel.isAtLeastS();
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.USER_ID, true);
+ }
mEnv.providers.configurePm(mActivity.packageMgr);
((TestActivityConfig) mEnv.injector.config).nextDocumentEnabled = true;
diff --git a/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java b/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java
index 61094ba..166e48e 100644
--- a/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java
+++ b/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java
@@ -36,13 +36,11 @@
import androidx.fragment.app.FragmentActivity;
import androidx.test.filters.MediumTest;
import androidx.test.filters.SdkSuppress;
-import androidx.test.runner.AndroidJUnit4;
import com.android.documentsui.DocumentsAccess;
import com.android.documentsui.Injector;
import com.android.documentsui.R;
-import com.android.documentsui.TestUserIdManager;
-import com.android.documentsui.UserIdManager;
+import com.android.documentsui.TestConfigStore;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.DocumentStack;
import com.android.documentsui.base.Lookup;
@@ -59,28 +57,47 @@
import com.android.documentsui.testing.TestProvidersAccess;
import com.android.documentsui.testing.TestResolveInfo;
import com.android.documentsui.util.VersionUtils;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.common.collect.Lists;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.concurrent.Executor;
-@RunWith(AndroidJUnit4.class)
+@RunWith(Parameterized.class)
@MediumTest
public class ActionHandlerTest {
private static final String EXTRA_INTENT = "EXTRA_INTENT";
private static final String EXTRA_USER = "EXTRA_USER";
+ private final TestConfigStore mTestConfigStore = new TestConfigStore();
+
private TestEnv mEnv;
private TestActivity mActivity;
private TestableActionHandler<TestActivity> mHandler;
private TestLastAccessedStorage mLastAccessed;
private PickCountRecordStorage mPickCountRecord;
- private TestUserIdManager mTestUserIdManager;
+
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
@Before
public void setUp() {
@@ -89,8 +106,14 @@
mEnv.providers.configurePm(mActivity.packageMgr);
mEnv.injector.pickResult = new PickResult();
mLastAccessed = new TestLastAccessedStorage();
- mTestUserIdManager = new TestUserIdManager();
mPickCountRecord = mock(PickCountRecordStorage.class);
+ mEnv.state.configStore = mTestConfigStore;
+
+ isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled;
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.USER_ID, true);
+ }
mHandler = new TestableActionHandler<>(
mActivity,
@@ -101,17 +124,17 @@
mEnv::lookupExecutor,
mEnv.injector,
mLastAccessed,
- mPickCountRecord,
- mTestUserIdManager
+ mPickCountRecord
);
+
mEnv.selectionMgr.select("1");
AsyncTask.setDefaultExecutor(mEnv.mExecutor);
}
private static class TestableActionHandler<T extends FragmentActivity & Addons>
- extends ActionHandler {
+ extends ActionHandler {
private UpdatePickResultTask mTask;
@@ -124,10 +147,8 @@
Lookup<String, Executor> executors,
Injector injector,
LastAccessedStorage lastAccessed,
- PickCountRecordStorage pickCountRecordStorage,
- UserIdManager userIdManager) {
- super(activity, state, providers, docs, searchMgr, executors, injector, lastAccessed,
- userIdManager);
+ PickCountRecordStorage pickCountRecordStorage) {
+ super(activity, state, providers, docs, searchMgr, executors, injector, lastAccessed);
mTask = new UpdatePickResultTask(
mActivity, mInjector.pickResult, pickCountRecordStorage);
}
@@ -284,7 +305,7 @@
mEnv.beforeAsserts();
verify(mPickCountRecord).increasePickCountRecord(
- mActivity.getApplicationContext(), TestEnv.FILE_JPG.derivedUri);
+ mActivity.getApplicationContext(), TestEnv.FILE_JPG.derivedUri);
mActivity.finishedHandler.assertCalled();
}
@@ -355,7 +376,8 @@
final String mimeType = "audio/aac";
final String displayName = "foobar.m4a";
- mHandler.saveDocument(mimeType, displayName, (boolean inProgress) -> {});
+ mHandler.saveDocument(mimeType, displayName, (boolean inProgress) -> {
+ });
mEnv.beforeAsserts();
@@ -431,7 +453,7 @@
mEnv.state.action = State.ACTION_GET_CONTENT;
mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
mEnv.state.stack.push(TestEnv.FOLDER_1);
- mEnv.state.acceptMimes = new String[] { "image/*" };
+ mEnv.state.acceptMimes = new String[]{"image/*"};
mActivity.finishedHandler.assertNotCalled();
@@ -483,7 +505,7 @@
mEnv.state.action = State.ACTION_OPEN;
mEnv.state.stack.changeRoot(TestProvidersAccess.HOME);
mEnv.state.stack.push(TestEnv.FOLDER_1);
- mEnv.state.acceptMimes = new String[] { "image/*" };
+ mEnv.state.acceptMimes = new String[]{"image/*"};
mActivity.finishedHandler.assertNotCalled();
@@ -539,13 +561,17 @@
@Test
public void testOpenAppRoot_otherUser() throws Exception {
ResolveInfo info = TestResolveInfo.create();
- mEnv.state.canShareAcrossProfile = true;
+ if (isPrivateSpaceEnabled) {
+ mEnv.state.canForwardToProfileIdMap.put(TestProvidersAccess.OtherUser.USER_ID, true);
+ } else {
+ mEnv.state.canShareAcrossProfile = true;
+ }
mHandler.openRoot(info, TestProvidersAccess.OtherUser.USER_ID);
assertThat(mActivity.startActivityAsUser.getLastValue().first.getComponent()).isEqualTo(
new ComponentName(info.activityInfo.applicationInfo.packageName,
- info.activityInfo.name));
+ info.activityInfo.name));
assertThat(mActivity.startActivityAsUser.getLastValue().second)
- .isEqualTo(TestProvidersAccess.OtherUser.USER_HANDLE);
+ .isEqualTo(TestProvidersAccess.OtherUser.USER_HANDLE);
int flags = mActivity.startActivityAsUser.getLastValue().first.getFlags();
assertEquals(0, flags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
@@ -569,7 +595,7 @@
mHandler.openRoot(info, TestProvidersAccess.USER_ID);
assertThat(mActivity.startActivity.getLastValue().getComponent()).isEqualTo(
new ComponentName(info.activityInfo.applicationInfo.packageName,
- info.activityInfo.name));
+ info.activityInfo.name));
int flags = mActivity.startActivity.getLastValue().getFlags();
assertEquals(0, flags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
@@ -589,7 +615,7 @@
mHandler.openRoot(TestResolveInfo.create(), TestProvidersAccess.USER_ID);
assertEquals(queryContent,
mActivity.startActivity.getLastValue().getStringExtra(
- Intent.EXTRA_CONTENT_QUERY));
+ Intent.EXTRA_CONTENT_QUERY));
}
@Test
@@ -712,4 +738,4 @@
}
}
}
-}
+}
\ No newline at end of file
diff --git a/tests/unit/com/android/documentsui/sidebar/RootsFragmentTest.java b/tests/unit/com/android/documentsui/sidebar/RootsFragmentTest.java
index ea88cfb..39e8ea2 100644
--- a/tests/unit/com/android/documentsui/sidebar/RootsFragmentTest.java
+++ b/tests/unit/com/android/documentsui/sidebar/RootsFragmentTest.java
@@ -28,32 +28,42 @@
import androidx.test.filters.MediumTest;
import androidx.test.platform.app.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
+import com.android.documentsui.TestConfigStore;
+import com.android.documentsui.TestUserManagerState;
import com.android.documentsui.base.RootInfo;
-import com.android.documentsui.base.State;
import com.android.documentsui.base.UserId;
+import com.android.documentsui.testing.TestEnv;
import com.android.documentsui.testing.TestProvidersAccess;
import com.android.documentsui.testing.TestResolveInfo;
+import com.android.modules.utils.build.SdkLevel;
+
+import com.google.android.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
- * An unit test for RootsFragment.
+ * A unit test for RootsFragment.
*/
-@RunWith(AndroidJUnit4.class)
+@RunWith(Parameterized.class)
@MediumTest
public class RootsFragmentTest {
private Context mContext;
private DevicePolicyManager mDevicePolicyManager;
private RootsFragment mRootsFragment;
+ private TestEnv mEnv;
+ private final TestConfigStore mTestConfigStore = new TestConfigStore();
+ private final TestUserManagerState mTestUserManagerState = new TestUserManagerState();
private static final String[] EXPECTED_SORTED_RESULT = {
TestProvidersAccess.RECENTS.title,
@@ -69,15 +79,37 @@
TestProvidersAccess.INSPECTOR.title,
TestProvidersAccess.PICKLES.title};
+ @Parameter(0)
+ public boolean isPrivateSpaceEnabled;
+
+ /**
+ * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with
+ * private space flag enabled and once with it disabled.
+ */
+ @Parameters(name = "privateSpaceEnabled={0}")
+ public static Iterable<?> data() {
+ return Lists.newArrayList(true, false);
+ }
+
@Before
public void setUp() {
+ mEnv = TestEnv.create();
+ mEnv.state.configStore = mTestConfigStore;
+
mContext = mock(Context.class);
mDevicePolicyManager = mock(DevicePolicyManager.class);
when(mContext.getResources()).thenReturn(
InstrumentationRegistry.getInstrumentation().getTargetContext().getResources());
when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE))
.thenReturn(mDevicePolicyManager);
+ when(mContext.getApplicationContext()).thenReturn(
+ InstrumentationRegistry.getInstrumentation().getTargetContext());
+ isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled;
+ if (isPrivateSpaceEnabled) {
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ mTestUserManagerState.canFrowardToProfileIdMap.put(UserId.DEFAULT_USER, true);
+ }
mRootsFragment = new RootsFragment();
}
@@ -85,12 +117,12 @@
public void testSortLoadResult_WithCorrectOrder() {
List<Item> items = mRootsFragment.sortLoadResult(
mContext,
- new State(),
+ mEnv.state,
createFakeRootInfoList(),
null /* excludePackage */, null /* handlerAppIntent */, new TestProvidersAccess(),
UserId.DEFAULT_USER,
Collections.singletonList(UserId.DEFAULT_USER),
- /* maybeShowBadge */ false);
+ /* maybeShowBadge */ false, mTestUserManagerState);
assertTrue(assertSortedResult(items));
}
diff --git a/tests/unit/com/android/documentsui/sidebar/UserItemsCombinerTest.java b/tests/unit/com/android/documentsui/sidebar/UserItemsCombinerTest.java
index 2a80867..f8f4fd0 100644
--- a/tests/unit/com/android/documentsui/sidebar/UserItemsCombinerTest.java
+++ b/tests/unit/com/android/documentsui/sidebar/UserItemsCombinerTest.java
@@ -27,9 +27,11 @@
import androidx.test.runner.AndroidJUnit4;
import com.android.documentsui.R;
+import com.android.documentsui.TestConfigStore;
import com.android.documentsui.base.State;
import com.android.documentsui.base.UserId;
import com.android.documentsui.testing.TestProvidersAccess;
+import com.android.modules.utils.build.SdkLevel;
import com.google.common.collect.Lists;
import com.google.common.truth.Correspondence;
@@ -38,8 +40,11 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
/**
@@ -50,6 +55,7 @@
public class UserItemsCombinerTest {
private static final UserId PERSONAL_USER = TestProvidersAccess.USER_ID;
private static final UserId WORK_USER = TestProvidersAccess.OtherUser.USER_ID;
+ private static final UserId PRIVATE_USER = TestProvidersAccess.AnotherUser.USER_ID;
private static final List<Item> PERSONAL_ITEMS = Lists.newArrayList(
personalItem("personal 1"),
@@ -61,10 +67,14 @@
workItem("work 1")
);
+ private static final List<Item> PRIVATE_ITEMS = Lists.newArrayList(
+ privateItem("private1")
+ );
+
private static final Correspondence<Item, Item> ITEM_CORRESPONDENCE =
Correspondence.from((Item actual, Item expected) -> {
- return Objects.equals(actual.title, expected.title)
- && Objects.equals(actual.userId, expected.userId);
+ return Objects.equals(actual.title, expected.title)
+ && Objects.equals(actual.userId, expected.userId);
}, "has same title and userId as in");
private final State mState = new State();
@@ -73,12 +83,29 @@
private final DevicePolicyManager mDpm =
InstrumentationRegistry.getInstrumentation().getTargetContext().getSystemService(
DevicePolicyManager.class);
+ private final List<UserId> mUserIds = new ArrayList<>();
+ private final Map<UserId, String> mUserIdToLabelMap = new HashMap<>();
+ private final TestConfigStore mTestConfigStore = new TestConfigStore();
private UserItemsCombiner mCombiner;
@Before
public void setUp() {
mState.canShareAcrossProfile = true;
mState.supportsCrossProfile = true;
+ mUserIds.add(PERSONAL_USER);
+ mUserIds.add(WORK_USER);
+ mUserIdToLabelMap.put(PERSONAL_USER, "Personal");
+ mUserIdToLabelMap.put(WORK_USER, "Work");
+ mState.canForwardToProfileIdMap.put(PERSONAL_USER, true);
+ mState.canForwardToProfileIdMap.put(WORK_USER, true);
+ mState.configStore = mTestConfigStore;
+
+ if (SdkLevel.isAtLeastV()) {
+ mUserIds.add(PRIVATE_USER);
+ mUserIdToLabelMap.put(PRIVATE_USER, "Private");
+ mState.canForwardToProfileIdMap.put(PRIVATE_USER, true);
+ mTestConfigStore.enablePrivateSpaceInPhotoPicker();
+ }
}
@Test
@@ -90,6 +117,20 @@
}
@Test
+ public void testCreatePresentableListForAllUsers_empty() {
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(Collections.emptyList());
+ rootListAllUsers.add(Collections.emptyList());
+ if (SdkLevel.isAtLeastV()) {
+ rootListAllUsers.add(Collections.emptyList());
+ }
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .setRootListForAllUsers(rootListAllUsers);
+ assertThat(
+ mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap)).isEmpty();
+ }
+
+ @Test
public void testCreatePresentableList_currentIsPersonal_personalItemsOnly() {
mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
.setRootListForCurrentUser(PERSONAL_ITEMS)
@@ -113,6 +154,55 @@
}
@Test
+ public void testCreatePresentableListForAllUsers_currentIsPersonal_personalItemsOnly() {
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(Lists.newArrayList(PERSONAL_ITEMS));
+ rootListAllUsers.add(Collections.emptyList());
+ if (SdkLevel.isAtLeastV()) {
+ rootListAllUsers.add(Collections.emptyList());
+ }
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .setRootListForAllUsers(rootListAllUsers);
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(PERSONAL_ITEMS)
+ .inOrder();
+ }
+
+ @Test
+ public void testCreatePresentableListForAllUsers_currentIsWork_personalItemsOnly() {
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(Lists.newArrayList(PERSONAL_ITEMS));
+ rootListAllUsers.add(Collections.emptyList());
+ if (SdkLevel.isAtLeastV()) {
+ rootListAllUsers.add(Collections.emptyList());
+ }
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .overrideCurrentUserForTest(WORK_USER)
+ .setRootListForAllUsers(rootListAllUsers);
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(PERSONAL_ITEMS)
+ .inOrder();
+ }
+
+ @Test
+ public void testCreatePresentableListForAllUsers_currentIsPrivate_personalItemsOnly() {
+ if (!SdkLevel.isAtLeastV()) return;
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(Lists.newArrayList(PERSONAL_ITEMS));
+ rootListAllUsers.add(Collections.emptyList());
+ rootListAllUsers.add(Collections.emptyList());
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .overrideCurrentUserForTest(PRIVATE_USER)
+ .setRootListForAllUsers(rootListAllUsers);
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(PERSONAL_ITEMS)
+ .inOrder();
+ }
+
+ @Test
public void testCreatePresentableList_currentIsPersonal_workItemsOnly() {
mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
.setRootListForCurrentUser(Collections.emptyList())
@@ -136,6 +226,56 @@
}
@Test
+ public void testCreatePresentableListForAllUsers_currentIsPersonal_workItemsOnly() {
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(Collections.emptyList());
+ rootListAllUsers.add(Lists.newArrayList(WORK_ITEMS));
+ if (SdkLevel.isAtLeastV()) {
+ rootListAllUsers.add(Collections.emptyList());
+ }
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .overrideCurrentUserForTest(PERSONAL_USER)
+ .setRootListForAllUsers(rootListAllUsers);
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(WORK_ITEMS)
+ .inOrder();
+ }
+
+ @Test
+ public void testCreatePresentableListForAllUsers_currentIsWork_workItemsOnly() {
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(Collections.emptyList());
+ rootListAllUsers.add(Lists.newArrayList(WORK_ITEMS));
+ if (SdkLevel.isAtLeastV()) {
+ rootListAllUsers.add(Collections.emptyList());
+ }
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .overrideCurrentUserForTest(WORK_USER)
+ .setRootListForAllUsers(rootListAllUsers);
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(WORK_ITEMS)
+ .inOrder();
+ }
+
+ @Test
+ public void testCreatePresentableListForAllUsers_currentIsPrivate_workItemsOnly() {
+ if (!SdkLevel.isAtLeastV()) return;
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(Collections.emptyList());
+ rootListAllUsers.add(Lists.newArrayList(WORK_ITEMS));
+ rootListAllUsers.add(Collections.emptyList());
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .overrideCurrentUserForTest(PRIVATE_USER)
+ .setRootListForAllUsers(rootListAllUsers);
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(WORK_ITEMS)
+ .inOrder();
+ }
+
+ @Test
public void testCreatePresentableList_currentIsPersonal_personalAndWorkItems() {
mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
.setRootListForCurrentUser(PERSONAL_ITEMS)
@@ -173,6 +313,89 @@
}
@Test
+ public void testCreatePresentableListForAllUsers_currentIsPersonal_allUsersItems() {
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(PERSONAL_ITEMS);
+ rootListAllUsers.add(Lists.newArrayList(WORK_ITEMS));
+ if (SdkLevel.isAtLeastV()) {
+ rootListAllUsers.add(PRIVATE_ITEMS);
+ }
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .setRootListForAllUsers(rootListAllUsers);
+
+ List<Item> expected = Lists.newArrayList();
+ expected.add(new HeaderItem("Personal"));
+ expected.addAll(PERSONAL_ITEMS);
+ expected.add(new HeaderItem("Work"));
+ expected.addAll(WORK_ITEMS);
+ if (SdkLevel.isAtLeastV()) {
+ expected.add(new HeaderItem("Private"));
+ expected.addAll(PRIVATE_ITEMS);
+ }
+
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(expected)
+ .inOrder();
+ }
+
+ @Test
+ public void testCreatePresentableListForAllUsers_currentIsWork_allUsersItems() {
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(PERSONAL_ITEMS);
+ rootListAllUsers.add(Lists.newArrayList(WORK_ITEMS));
+ if (SdkLevel.isAtLeastV()) {
+ rootListAllUsers.add(PRIVATE_ITEMS);
+ }
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .overrideCurrentUserForTest(WORK_USER)
+ .setRootListForAllUsers(rootListAllUsers);
+
+ List<Item> expected = Lists.newArrayList();
+ expected.add(new HeaderItem("Personal"));
+ expected.addAll(PERSONAL_ITEMS);
+ expected.add(new HeaderItem("Work"));
+ expected.addAll(WORK_ITEMS);
+ if (SdkLevel.isAtLeastV()) {
+ expected.add(new HeaderItem("Private"));
+ expected.addAll(PRIVATE_ITEMS);
+ }
+
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(expected)
+ .inOrder();
+ }
+
+ @Test
+ public void testCreatePresentableListForAllUsers_currentIsPrivate_allUsersItems() {
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(PERSONAL_ITEMS);
+ rootListAllUsers.add(Lists.newArrayList(WORK_ITEMS));
+ if (SdkLevel.isAtLeastV()) {
+ rootListAllUsers.add(PRIVATE_ITEMS);
+ }
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .overrideCurrentUserForTest(PRIVATE_USER)
+ .setRootListForAllUsers(rootListAllUsers);
+
+ List<Item> expected = Lists.newArrayList();
+ expected.add(new HeaderItem("Personal"));
+ expected.addAll(PERSONAL_ITEMS);
+ expected.add(new HeaderItem("Work"));
+ expected.addAll(WORK_ITEMS);
+ if (SdkLevel.isAtLeastV()) {
+ expected.add(new HeaderItem("Private"));
+ expected.addAll(PRIVATE_ITEMS);
+ }
+
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(expected)
+ .inOrder();
+ }
+
+ @Test
public void testCreatePresentableList_currentIsPersonal_personalAndWorkItems_cannotShare() {
mState.canShareAcrossProfile = false;
mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
@@ -196,6 +419,56 @@
assertThat(mCombiner.createPresentableList()).isEmpty();
}
+ @Test
+ public void testCreatePresentableListForAllUsers_currentIsPersonal_cannotShareToWork() {
+ if (!SdkLevel.isAtLeastV()) return;
+ mState.canForwardToProfileIdMap.put(WORK_USER, false);
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(PERSONAL_ITEMS);
+ rootListAllUsers.add(Lists.newArrayList(WORK_ITEMS));
+ if (SdkLevel.isAtLeastV()) {
+ rootListAllUsers.add(PRIVATE_ITEMS);
+ }
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .setRootListForAllUsers(rootListAllUsers);
+
+ List<Item> expected = Lists.newArrayList();
+ expected.add(new HeaderItem("Personal"));
+ expected.addAll(PERSONAL_ITEMS);
+ if (SdkLevel.isAtLeastV()) {
+ expected.add(new HeaderItem("Private"));
+ expected.addAll(PRIVATE_ITEMS);
+ }
+
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(expected)
+ .inOrder();
+ }
+
+ @Test
+ public void testCreatePresentableListForAllUsers_currentIsWork_AllItems_cannotSharePersonal() {
+ if (!SdkLevel.isAtLeastV()) return;
+ mState.canForwardToProfileIdMap.put(PERSONAL_USER, false);
+ // In the current implementation of cross profile content sharing strategy work profile will
+ // be able to share to all the child profiles of the parent/personal profile only if it is
+ // able to share with parent/personal profile
+ mState.canForwardToProfileIdMap.put(PRIVATE_USER, false);
+ final List<List<Item>> rootListAllUsers = new ArrayList<>();
+ rootListAllUsers.add(PERSONAL_ITEMS);
+ rootListAllUsers.add(Lists.newArrayList(WORK_ITEMS));
+ if (SdkLevel.isAtLeastV()) {
+ rootListAllUsers.add(PRIVATE_ITEMS);
+ }
+ mCombiner = new UserItemsCombiner(mResources, mDpm, mState)
+ .setRootListForAllUsers(rootListAllUsers);
+
+ assertThat(mCombiner.createPresentableListForAllUsers(mUserIds, mUserIdToLabelMap))
+ .comparingElementsUsing(ITEM_CORRESPONDENCE)
+ .containsExactlyElementsIn(WORK_ITEMS)
+ .inOrder();
+ }
+
private static TestItem personalItem(String title) {
return new TestItem(title, PERSONAL_USER);
}
@@ -204,6 +477,10 @@
return new TestItem(title, WORK_USER);
}
+ private static TestItem privateItem(String title) {
+ return new TestItem(title, PRIVATE_USER);
+ }
+
private static class TestItem extends Item {
TestItem(String title, UserId userId) {