Snap for 11273583 from 0a1aa17a285194a80438609af84d3be131a67864 to mainline-resolv-release

Change-Id: Ic9f73d54768b47419637784bd63ac184d2214e1c
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8884bd9..6bf7182 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -24,7 +24,7 @@
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
     <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.USE_RESERVED_DISK" />
+    <uses-permission android:name="android.permission.USE_RESERVED_DISK" android:maxSdkVersion="34" />
     <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
     <uses-permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS" />
     <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
diff --git a/apex/framework/api/current.txt b/apex/framework/api/current.txt
index cddfcfa..d760d14 100644
--- a/apex/framework/api/current.txt
+++ b/apex/framework/api/current.txt
@@ -151,6 +151,7 @@
     field public static final String EXTRA_MEDIA_TITLE = "android.intent.extra.title";
     field public static final String EXTRA_OUTPUT = "output";
     field @FlaggedApi("com.android.providers.media.flags.pick_ordered_images") public static final String EXTRA_PICK_IMAGES_IN_ORDER = "android.provider.extra.PICK_IMAGES_IN_ORDER";
+    field @FlaggedApi("com.android.providers.media.flags.picker_default_tab") public static final String EXTRA_PICK_IMAGES_LAUNCH_TAB = "android.provider.extra.PICK_IMAGES_LAUNCH_TAB";
     field public static final String EXTRA_PICK_IMAGES_MAX = "android.provider.extra.PICK_IMAGES_MAX";
     field public static final String EXTRA_SCREEN_ORIENTATION = "android.intent.extra.screenOrientation";
     field public static final String EXTRA_SHOW_ACTION_ICONS = "android.intent.extra.showActionIcons";
@@ -172,6 +173,8 @@
     field public static final String MEDIA_SCANNER_VOLUME = "volume";
     field public static final String META_DATA_REVIEW_GALLERY_PREWARM_SERVICE = "android.media.review_gallery_prewarm_service";
     field public static final String META_DATA_STILL_IMAGE_CAMERA_PREWARM_SERVICE = "android.media.still_image_camera_preview_service";
+    field @FlaggedApi("com.android.providers.media.flags.picker_default_tab") public static final int PICK_IMAGES_TAB_ALBUMS = 0; // 0x0
+    field @FlaggedApi("com.android.providers.media.flags.picker_default_tab") public static final int PICK_IMAGES_TAB_IMAGES = 1; // 0x1
     field public static final String QUERY_ARG_INCLUDE_RECENTLY_UNMOUNTED_VOLUMES = "android:query-arg-recently-unmounted-volumes";
     field public static final String QUERY_ARG_MATCH_FAVORITE = "android:query-arg-match-favorite";
     field public static final String QUERY_ARG_MATCH_PENDING = "android:query-arg-match-pending";
diff --git a/apex/framework/java/android/provider/MediaStore.java b/apex/framework/java/android/provider/MediaStore.java
index b1172af..d232fd3 100644
--- a/apex/framework/java/android/provider/MediaStore.java
+++ b/apex/framework/java/android/provider/MediaStore.java
@@ -872,6 +872,41 @@
     }
 
     /**
+     * The name of an optional intent-extra used to allow apps to specify the tab the picker should
+     * open with. The extra can only be specified in {@link MediaStore#ACTION_PICK_IMAGES}.
+     * <p>
+     * The value of this intent-extra must be one of: {@link MediaStore#PICK_IMAGES_TAB_ALBUMS}
+     * for the albums tab and {@link MediaStore#PICK_IMAGES_TAB_IMAGES} for the photos tab.
+     * The system will decide which tab to open by default and in most cases,
+     * it is {@link MediaStore#PICK_IMAGES_TAB_IMAGES} i.e. the photos tab.
+     */
+    @FlaggedApi("com.android.providers.media.flags.picker_default_tab")
+    public static final String EXTRA_PICK_IMAGES_LAUNCH_TAB =
+            "android.provider.extra.PICK_IMAGES_LAUNCH_TAB";
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(prefix = { "PICK_IMAGES_TAB_" }, value = {
+            PICK_IMAGES_TAB_ALBUMS,
+            PICK_IMAGES_TAB_IMAGES
+    })
+    public @interface PickImagesTab { }
+
+    /**
+     * One of the permitted values for {@link MediaStore#EXTRA_PICK_IMAGES_LAUNCH_TAB} to open the
+     * picker with albums tab.
+     */
+    @FlaggedApi("com.android.providers.media.flags.picker_default_tab")
+    public static final int PICK_IMAGES_TAB_ALBUMS = 0;
+
+    /**
+     * One of the permitted values for {@link MediaStore#EXTRA_PICK_IMAGES_LAUNCH_TAB} to open the
+     * picker with photos tab.
+     */
+    @FlaggedApi("com.android.providers.media.flags.picker_default_tab")
+    public static final int PICK_IMAGES_TAB_IMAGES = 1;
+
+    /**
      * Specify that the caller wants to receive the original media format without transcoding.
      *
      * <b>Caution: using this flag can cause app
diff --git a/jni/node.cpp b/jni/node.cpp
index 31e4970..25f732d 100644
--- a/jni/node.cpp
+++ b/jni/node.cpp
@@ -115,6 +115,14 @@
     std::lock_guard<std::recursive_mutex> guard(*tree->lock_);
 
     if (tree) {
+        // Guarantee this node not be released while deleting its children.
+        // pf_forget could be called for a parent node first not its children
+        // when evicting file system inodes by shrinker, so the parent node
+        // could exist without its own reference but having a children node.
+        // In this case, this node could be deleted during executing
+        // DeleteTree(child), and it causes double free for the node.
+        tree->Acquire();
+
         // Make a copy of the list of children because calling Delete tree
         // will modify the list of children, which will cause issues while
         // iterating over them.
diff --git a/jni/node_test.cpp b/jni/node_test.cpp
index f687cad..6afdd75 100644
--- a/jni/node_test.cpp
+++ b/jni/node_test.cpp
@@ -526,6 +526,22 @@
     test_fn("BaZ", baz1.get(), baz2.get());
 }
 
+TEST_F(NodeTest, DestroyDoesntDoubleFree) {
+    node* root = node::Create(nullptr, "root", "", true, 0, 0, &lock_, 0, &tracker_);
+    node* child = node::Create(root, "child", "", true, 0, 0, &lock_, 0, &tracker_);
+    node* grandchild = node::Create(child, "grandchild", "", true, 0, 0, &lock_, 0, &tracker_);
+
+    // 'child' is referenced by itself and by 'grandchild'
+    ASSERT_EQ(2, GetRefCount(child));
+    // Kernel forgets about child only
+    ASSERT_FALSE(child->Release(1));
+    // Child only referenced by 'grandchild'
+    ASSERT_EQ(1, GetRefCount(child));
+
+    // Now, destroying the filesystem shouldn't result in a double free
+    node::DeleteTree(root);
+}
+
 TEST_F(NodeTest, ForChild) {
     unique_node_ptr parent = CreateNode(nullptr, "/path");
     unique_node_ptr foo1 = CreateNode(parent.get(), "FoO");
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 7a76c15..e3d1c1e 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nie gekies nie"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Berei tans jou geselekteerde media voor"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> van <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> is gereed"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Kanselleer"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Gerugsteunde foto\'s word nou ingesluit"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Jy kan foto\'s van <xliff:g id="APP_NAME">%1$s</xliff:g>-rekening <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> af kies"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g>-rekening is opgedateer"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 2889dd6..32b2d97 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"አልተመረጠም"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"የእርስዎን የተመረጠ ሚዲያ በማዘጋጀት ላይ"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> ከ<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> ዝግጁ"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"ይቅር"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"ምትኬ የተቀመጠላቸው ፎቶዎች አሁን ተካትተዋል"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"ከ<xliff:g id="APP_NAME">%1$s</xliff:g> መለያ <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> ፎቶዎችን መምረጥ ይችላሉ"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> መለያ ተዘምኗል"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 7d55f12..9ff9503 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"غير محدّد"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"جارٍ تحضير الوسائط التي تم اختيارها"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> من إجمالي <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> صورة جاهزة"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"إلغاء"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"تم الآن تضمين الصور التي تم الاحتفاظ بنسخة احتياطية منها"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"يمكنك اختيار صور من حساب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" للمستخدم <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>."</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"تم تعديل الحساب <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 8785eba..f97b5c1 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"বাছনি কৰা হোৱা নাই"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"আপুনি বাছনি কৰা মিডিয়া সাজু কৰি থকা হৈছে"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> টা বস্তুৰ ভিতৰত <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> টা সাজু"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"বাতিল কৰক"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"এতিয়া বেকআপ লোৱা ফট’সমূহ অন্তৰ্ভুক্ত কৰা হৈছে"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"আপুনি <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ একাউণ্টৰ <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> পৰা ফট’সমূহ বাছনি কৰিব পাৰে"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> একাউণ্টটো আপডে’ট কৰা হৈছে"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index af1f72b..88c4c05 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"seçilməyib"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Seçilmiş media hazırlanır"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>/<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> hazırdır"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Ləğv edin"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Yedəklənmiş fotolar indi daxildir"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"<xliff:g id="APP_NAME">%1$s</xliff:g> hesabından (<xliff:g id="USER_ACCOUNT">%2$s</xliff:g>) fotoları seçə bilərsiniz"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> hesabı güncəlləndi"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 56f8648..0c40717 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nije izabrano"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Pripremaju se odabrani medijski fajlovi"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Spremno:<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> od <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Otkaži"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Sada su uvrštene rezervne kopije slika"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Možete da izaberete slike sa naloga <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> za <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Nalog za <xliff:g id="APP_NAME">%1$s</xliff:g> je ažuriran"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 6421809..23af8f2 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"не выбраны"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Ідзе падрыхтоўка выбраных вамі медыяфайлаў"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Гатова: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> з <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Скасаваць"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Цяпер дададзены рэзервовыя копіі фотаздымкаў"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Вы можаце выбраць фотаздымкі з уліковага запісу <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Зменены ўліковы запіс для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index a9c7f24..9ff2d77 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"не е избрано"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Избраната от вас мултимедия се подготвя"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Готови: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> от <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Отказ"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Снимките, за които е създадено резервно копие, вече са добавени"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Можете да избирате снимки от профила <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> в(ъв) <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Профилът в(ъв) <xliff:g id="APP_NAME">%1$s</xliff:g> е актуализиран"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 42c3be2..0d9f12d 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"বেছে নেওয়া হয়নি"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"আপনার বেছে নেওয়া মিডিয়া রেডি করা হচ্ছে"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>টির মধ্যে <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> নম্বর আইটেম রেডি আছে"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"বাতিল করুন"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"ব্যাক-আপ নেওয়া ফটো এখন যোগ করা হয়েছে"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"আপনি <xliff:g id="APP_NAME">%1$s</xliff:g>-এর অ্যাকাউন্ট <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> থেকে ফটো বেছে নিতে পারবেন"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর অ্যাকাউন্ট আপডেট করা হয়েছে"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index f9550a5..557107e 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nije odabrano"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Pripremanje odabranih medijskih fajlova"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Spremno: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> od <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Otkaži"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Sigurnosne kopije fotografija su sada uključene"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Možete odabrati fotografije s računa <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> u aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Račun u aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> je ažuriran"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 7f8822b..704fc78 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"no seleccionat"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"S\'està preparant el contingut multimèdia seleccionat"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> de <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> a punt"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancel·la"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Ara s\'ha inclòs la còpia de seguretat de les fotos"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Pots seleccionar fotos del compte de <xliff:g id="APP_NAME">%1$s</xliff:g> de <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"S\'ha actualitzat el compte de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 33790ca..dd3f2af 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nevybráno"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Příprava vámi vybraných médií"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Připraveno: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> z <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Zrušit"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Teď jsou zde zahrnuty zálohované fotky"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Můžete vybrat fotky z účtu <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Účet <xliff:g id="APP_NAME">%1$s</xliff:g> byl aktualizován"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 0bc8433..fbf5071 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ikke valgt"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Dine valgte medier gøres klar"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> af <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> er klar"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Annuller"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Sikkerhedskopierede billeder er nu inkluderet"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Du kan vælge billeder fra <xliff:g id="APP_NAME">%1$s</xliff:g>-kontoen <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g>-kontoen er opdateret"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 82f878e..658e3f0 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nicht ausgewählt"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Ausgewählte Medien werden vorbereitet"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> von <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> fertig"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Abbrechen"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Gesicherte Fotos jetzt mit berücksichtigt"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Du kannst Fotos aus dem <xliff:g id="APP_NAME">%1$s</xliff:g>-Konto <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> auswählen"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g>-Konto aktualisiert"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 0736242..6957172 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"μη επιλεγμένο"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Προετοιμασία των μέσων που επιλέξατε"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> από <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> έτοιμα"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Ακύρωση"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Συμπεριλαμβάνονται πλέον φωτογραφίες που έχουν αντίγραφα ασφαλείας"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Μπορείτε να επιλέξετε φωτογραφίες από τον λογαριασμό <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Ο λογαριασμός <xliff:g id="APP_NAME">%1$s</xliff:g> ενημερώθηκε"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 996ef60..afa1aa4 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"not selected"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Preparing your selected media"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> of <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> ready"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancel"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Backed up photos now included"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"You can select photos from <xliff:g id="APP_NAME">%1$s</xliff:g> account <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> account updated"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index be91653..4470b43 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"not selected"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Preparing your selected media"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> of <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> ready"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancel"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Backed up photos now included"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"You can select photos from <xliff:g id="APP_NAME">%1$s</xliff:g> account <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> account updated"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 996ef60..afa1aa4 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"not selected"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Preparing your selected media"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> of <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> ready"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancel"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Backed up photos now included"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"You can select photos from <xliff:g id="APP_NAME">%1$s</xliff:g> account <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> account updated"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 996ef60..afa1aa4 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"not selected"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Preparing your selected media"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> of <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> ready"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancel"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Backed up photos now included"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"You can select photos from <xliff:g id="APP_NAME">%1$s</xliff:g> account <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> account updated"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 6dd8620..100a978 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‎‏‏‎‎not selected‎‏‎‎‏‎"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‎‎‎‎‏‏‎‎‎‎‎‏‎‏‏‎‏‏‏‏‎‎‏‎‏‏‏‎Preparing your selected media‎‏‎‎‏‎"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‏‏‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>‎‏‎‎‏‏‏‎ of ‎‏‎‎‏‏‎<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>‎‏‎‎‏‏‏‎ ready‎‏‎‎‏‎"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‎‎‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‎‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‏‎Cancel‎‏‎‎‏‎"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‎Backed up photos now included‎‏‎‎‏‎"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎You can select photos from ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ account ‎‏‎‎‏‏‎<xliff:g id="USER_ACCOUNT">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ account updated‎‏‎‎‏‎"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index f2b7c73..03771b7 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"sin seleccionar"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Preparando el contenido multimedia seleccionado"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> de <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> listos"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancelar"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Ahora se incluyen las fotos con copia de seguridad"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Puedes seleccionar imágenes de <xliff:g id="APP_NAME">%1$s</xliff:g> desde la cuenta de <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Se actualizó la cuenta de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index c23f8ad..532b10b 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"no seleccionado"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Preparando el contenido multimedia seleccionado"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> de <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> listos"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancelar"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Ahora se incluye la copia de seguridad de las fotos"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Puedes seleccionar fotos de la cuenta de <xliff:g id="APP_NAME">%1$s</xliff:g> de <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Cuenta de <xliff:g id="APP_NAME">%1$s</xliff:g> actualizada"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 433ea73..51ff309 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"pole valitud"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Valitud meedia ettevalmistamine"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>-st on valmis"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Tühista"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Varundatud fotod on nüüd kaasatud"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Saate valida konto <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> fotosid rakendusest <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> kontot värskendati"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index aa0f303..be1db85 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"hautatu gabe"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Hautatutako multimedia-edukia prestatzen"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>/<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> prest"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Utzi"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Orain, barnean hartzen dira babeskopiak dituzten argazkiak"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> kontuko argazkiak hauta ditzakezu"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Eguneratu da <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko kontua"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 9a6a0f9..5e515e0 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"انتخاب نشده است"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"درحال آماده‌سازی رسانه انتخاب‌شده"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> مورد از <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> مورد آماده است"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"لغو کردن"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"عکس‌های پشتیبان‌گیری‌شده اکنون اضافه شده‌اند"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"می‌توانید عکس‌های حساب <xliff:g id="APP_NAME">%1$s</xliff:g>‏ (<xliff:g id="USER_ACCOUNT">%2$s</xliff:g>) را انتخاب کنید"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"حساب <xliff:g id="APP_NAME">%1$s</xliff:g> به‌روز شد"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index ea1db49..bfd4d84 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ei valittu"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Valitsemaasi mediaa valmistellaan"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>/<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> valmiina"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Peruuta"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Varmuuskopioidut kuvat löytyvät nyt täältä"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Voit valita sovelluksen <xliff:g id="APP_NAME">%1$s</xliff:g> kuvat tililtä <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Tili päivitetty: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index eadca62..a351916 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"non sélectionné"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Préparation du contenu multimédia sélectionné en cours…"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> sur <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> prêt(s)"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Annuler"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Les photos sauvegardées sont maintenant incluses"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Vous pouvez sélectionner des photos du compte <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Compte de <xliff:g id="APP_NAME">%1$s</xliff:g> mis à jour"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 792e3af..6398796 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -72,7 +72,7 @@
     <string name="picker_profile_work_paused_title" msgid="382212880704235925">"Applis professionnelles en pause"</string>
     <string name="picker_profile_work_paused_msg" msgid="6321552322125246726">"Pour ouvrir des photos professionnelles, activez vos applis professionnelles, puis réessayez"</string>
     <string name="picker_privacy_message" msgid="9132700451027116817">"Cette appli peut uniquement accéder aux photos que vous sélectionnez"</string>
-    <string name="picker_header_permissions" msgid="675872774407768495">"Sélectionnez les photos et videos auxquelles cette appli peut accéder"</string>
+    <string name="picker_header_permissions" msgid="675872774407768495">"Sélectionnez les photos et vidéos auxquelles cette appli peut accéder"</string>
     <string name="picker_album_item_count" msgid="4420723302534177596">"{count,plural, =1{<xliff:g id="COUNT_0">^1</xliff:g> élément}one{<xliff:g id="COUNT_1">^1</xliff:g> élément}many{<xliff:g id="COUNT_1">^1</xliff:g> éléments}other{<xliff:g id="COUNT_1">^1</xliff:g> éléments}}"</string>
     <string name="picker_add_button_multi_select" msgid="4005164092275518399">"Ajouter (<xliff:g id="COUNT">^1</xliff:g>)"</string>
     <string name="picker_add_button_multi_select_permissions" msgid="5138751105800138838">"Autoriser (<xliff:g id="COUNT">^1</xliff:g>)"</string>
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"non sélectionné"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Préparation des fichiers multimédias que vous avez sélectionnés"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Prêt(s) : <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> sur <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Annuler"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Les photos sauvegardées sont désormais incluses"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Vous pouvez sélectionner des photos issues du compte <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> dans l\'appli <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Compte <xliff:g id="APP_NAME">%1$s</xliff:g> mis à jour"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 04d94f8..b0fda91 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"elemento non seleccionado"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Preparando recursos seleccionados"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Elementos listos: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> de <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancelar"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Agora inclúense as fotos con copia de seguranza"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Podes seleccionar fotos da seguinte conta de <xliff:g id="APP_NAME">%1$s</xliff:g>: <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Actualizouse a conta de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 0544ced..b46ad96 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"પસંદ નહીં કરેલી"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"તમે પસંદ કરેલું મીડિયા તૈયાર કરી રહ્યાં છીએ"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>માંથી <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> તૈયાર"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"રદ કરો"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"બૅકઅપ લીધેલા ફોટા હવે શામેલ કરવામાં આવ્યા છે"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"તમે <xliff:g id="APP_NAME">%1$s</xliff:g> એકાઉન્ટના <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> પરથી ફોટા પસંદ કરી શકો છો"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> એકાઉન્ટ અપડેટ કરવામાં આવ્યું"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 3eaa289..a493629 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"नहीं चुना गया"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"आपकी चुनी गई मीडिया तैयार की जा रही है"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> में से <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> तैयार हैं"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"रद्द करें"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"बैक अप ली गई फ़ोटो अब जोड़ दी गई हैं"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"आपके पास, <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> वाले <xliff:g id="APP_NAME">%1$s</xliff:g> खाते से फ़ोटो चुनने का विकल्प है"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> खाता अपडेट किया गया"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 9339e27..c989254 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nije odabrano"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Priprema odabranih medija"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Spremno: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> od <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Odustani"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Sad su uključene sigurnosno kopirane fotografije"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Možete odabrati aplikacije s računa <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Ažuriran je račun za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 7f62bf1..c5d7870 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nincs kiválasztva"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"A kiválasztott média előkészítése…"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>/<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> kész"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Mégse"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Mostantól rendelkezésre állnak a fotók, amelyekről biztonsági másolat készült"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Kiválaszthat fotókat a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásból (<xliff:g id="USER_ACCOUNT">%2$s</xliff:g>-fiók)"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g>-fiók frissítve"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index b67062e..6fee32e 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ընտրված չէ"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Ձեր ընտրած մեդիաֆայլերի նախապատրաստում"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>/<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> պատրաստ է"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Չեղարկել"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Պահուստավորված լուսանկարներն այժմ ավելացված են"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Դուք կարող եք լուսանկարներ ընտրել «<xliff:g id="APP_NAME">%1$s</xliff:g>» հավելվածի <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> հաշվից"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի հաշիվը թարմացվեց"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 3767083..e655fcb 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"tidak dipilih"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Menyiapkan media yang dipilih"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> dari <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> siap"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Batal"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Foto yang dicadangkan kini disertakan"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Anda dapat memilih foto dari akun <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Akun <xliff:g id="APP_NAME">%1$s</xliff:g> diperbarui"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index c492315..02ea74b 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ekki valið"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Undirbýr valið efni"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> af <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> til reiðu"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Hætta við"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Afritaðar myndir eru nú hafðar með"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Þú getur valið myndir af reikningnum <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> í: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g>: reikningur uppfærður"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 73249cb..e86dc97 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"Elemento non selezionato"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Preparazione dei contenuti multimediali selezionati in corso…"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> su <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> pronti"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Annulla"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Ora sono incluse le foto di cui hai eseguito il backup"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Puoi selezionare foto dall\'account <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> nell\'app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Account <xliff:g id="APP_NAME">%1$s</xliff:g> aggiornato"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index abbdb8f..31c3197 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"לא נבחר"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"המדיה שבחרת בתהליך הכנה"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> מתוך <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> מוכנים"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"ביטול"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"התמונות שעברו גיבוי נכללות עכשיו"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"ניתן לבחור תמונות מחשבון <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> באפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"החשבון באפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> עודכן"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 160c68f..30a9d9f 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"未選択"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"選択したメディアの準備をする"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>/<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> 件準備完了"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"キャンセル"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"バックアップした写真が追加されました"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"<xliff:g id="APP_NAME">%1$s</xliff:g> のアカウント <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> の写真を選択できます"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> アカウントが更新されました"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 382d5a1..27398e9 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"არ არის არჩეული"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"მიმდინარეობს თქვენ მიერ არჩეული მედიის მომზადება"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> სულ <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>-დან მზადაა"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"გაუქმება"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"უკვე ფოტოების სარეზერვო ასლების ჩათვლით"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"შეგიძლიათ აირჩიოთ ფოტოები <xliff:g id="APP_NAME">%1$s</xliff:g>-ის ანგარიშიდან <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> ანგარიში განახლებულია"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index e59be1e..28cd54b 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"таңдалмаған"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Таңдалған мультимедиа әзірленіп жатыр"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>/<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> дайын"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Бас тарту"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Сақтық көшірмесі жасалған фотосуреттер қосылды"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Фотосуреттерді <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> аккаунтынан таңдай аласыз."</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> аккаунты жаңартылды"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 7468247..6b10fc5 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"មិនបានជ្រើសរើសទេ"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"កំពុងរៀបចំមេឌៀដែលអ្នកបានជ្រើសរើស"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> នៃ <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> រួចរាល់ហើយ"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"បោះបង់"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"ឥឡូវនេះមានរួមបញ្ចូលរូបថតដែលបានបម្រុងទុក"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"អ្នកអាចជ្រើសរើសរូបថតពីគណនី <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"បានធ្វើបច្ចុប្បន្នភាពគណនី <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index e0a5f07..7e3af0b 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ಆಯ್ಕೆಮಾಡಲಾಗಿಲ್ಲ"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"ನಿಮ್ಮ ಆಯ್ಕೆಮಾಡಿದ ಮೀಡಿಯಾವನ್ನು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> ಸಿದ್ಧವಾಗಿವೆ"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"ರದ್ದುಮಾಡಿ"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"ಬ್ಯಾಕಪ್ ಮಾಡಲಾದ ಫೋಟೋಗಳನ್ನು ಈಗ ಸೇರಿಸಲಾಗಿದೆ"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಖಾತೆಯ <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> ನಲ್ಲಿರುವ ಫೋಟೋಗಳನ್ನು ನೀವು ಆಯ್ಕೆಮಾಡಬಹುದು"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಖಾತೆಯನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗಿದೆ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 84b4241..3b7432a 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"선택되지 않음"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"선택한 미디어를 준비하는 중"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>/<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>개 준비됨"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"취소"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"이제 백업된 사진이 포함됨"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"<xliff:g id="APP_NAME">%1$s</xliff:g> 계정(<xliff:g id="USER_ACCOUNT">%2$s</xliff:g>)에서 사진을 선택할 수 있습니다."</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> 계정 업데이트됨"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 36cb921..4757855 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"тандалган жок"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Тандаган медиа файлдарыңыз даярдалууда"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> ичинен <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> даяр"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Жокко чыгаруу"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Эми камдык көчүрмөсү сакталган сүрөттөр камтылат"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"<xliff:g id="APP_NAME">%1$s</xliff:g> аккаунтундагы (<xliff:g id="USER_ACCOUNT">%2$s</xliff:g>) сүрөттөрдү тандай аласыз"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> аккаунту жаңыртылды"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 1806a7f..2ba9646 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ບໍ່ໄດ້ເລືອກ"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"ກຳລັງກຽມມີເດຍທີ່ທ່ານເລືອກໄວ້"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"ພ້ອມແລ້ວ <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"ຍົກເລີກ"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"ຕອນນີ້ຮວມຮູບພາບທີ່ສຳຮອງຂໍ້ມູນໄວ້ແລ້ວ"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"ທ່ານສາມາດເລືອກຮູບພາບໄດ້ຈາກບັນຊີ <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"ອັບເດດບັນຊີ <xliff:g id="APP_NAME">%1$s</xliff:g> ແລ້ວ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index a16f1f5..29a093f 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nepasirinkta"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Ruošiami pasirinkti medijos failai"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Paruošta: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> iš <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Atšaukti"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Dabar įtraukiamos atsarginės nuotraukų kopijos"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Galite pasirinkti nuotraukas iš „<xliff:g id="APP_NAME">%1$s</xliff:g>“ paskyros <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ paskyra atnaujinta"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 330f6cf..ad857f8 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nav atlasīts"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Notiek jūsu atlasītā multivides satura sagatavošana"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Gatavs: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> no <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Atcelt"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Dublētie fotoattēli ir iekļauti"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Varat atlasīt fotoattēlus no lietotnes “<xliff:g id="APP_NAME">%1$s</xliff:g>” konta <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Lietotnes “<xliff:g id="APP_NAME">%1$s</xliff:g>” konts ir atjaunināts"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 719221f..cb95f54 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"не е избрано"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Вашите избрани аудиовизуелни содржини се подготвуваат"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Подготвени: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> од <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Откажи"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Сега се опфатени фотографии од бекап"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Можете да изберете фотографии од сметката <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> на <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Сметката на <xliff:g id="APP_NAME">%1$s</xliff:g> е ажурирана"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index b0e63c8..5def22b 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"തിരഞ്ഞെടുത്തിട്ടില്ല"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"നിങ്ങൾ തിരഞ്ഞെടുത്ത മീഡിയ തയ്യാറാക്കുന്നു"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>-ൽ <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> എണ്ണം തയ്യാറാണ്"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"റദ്ദാക്കുക"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"ബാക്കപ്പ് ചെയ്ത ഫോട്ടോകൾ ഇപ്പോൾ ഉൾപ്പെടുത്തിയിരിക്കുന്നു"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"നിങ്ങൾക്ക് <xliff:g id="APP_NAME">%1$s</xliff:g> അക്കൗണ്ടിൽ <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> നിന്ന് ഫോട്ടോകൾ തിരഞ്ഞെടുക്കാം"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> അക്കൗണ്ട് അപ്ഡേറ്റ് ചെയ്തു"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 540a629..e1a5246 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"сонгоогүй"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Таны сонгосон медиаг бэлтгэж байна"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>-с <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> бэлэн"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Цуцлах"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Одоо хуулбарласан зургийг багтаасан"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Та <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> бүртгэлээс зураг сонгох боломжтой"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> бүртгэлийг шинэчилсэн"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 0f0fcc4..184f72b 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"निवडला नाही"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"तुमचा निवडलेला मीडिया तयार करत आहे"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> पैकी <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> तयार"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"रद्द करा"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"बॅकअप घेतलेल्या फोटोचा आता समावेश केला आहे"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"तुम्ही <xliff:g id="APP_NAME">%1$s</xliff:g> खात्याच्या <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> वरून फोटो निवडू शकता"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> खाते अपडेट केले"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 5751c1a..9f48850 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"tidak dipilih"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Menyediakan media pilihan anda"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> daripada <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> sudah bersedia"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Batal"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Foto yang disandarkan kini disertakan"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Anda boleh memilih foto daripada akaun <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Akaun <xliff:g id="APP_NAME">%1$s</xliff:g> dikemas kini"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 00d070a..322eb0a 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ရွေးချယ်မထားပါ"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"သင်ရွေးထားသော မီဒီယာကို ပြင်ဆင်နေသည်"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> အနက် <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> အသင့်ဖြစ်ပြီ"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"မလုပ်တော့"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"အရန်သိမ်းထားသော ဓာတ်ပုံများ ယခုထည့်သွင်းထားပြီ"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"<xliff:g id="APP_NAME">%1$s</xliff:g> အကောင့် <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> မှ ဓာတ်ပုံများ ရွေးနိုင်သည်"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> အကောင့် အပ်ဒိတ်လုပ်လိုက်သည်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index c120204..060945b 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ikke valgt"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Klargjør det valgte medieinnholdet"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> av <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> er klare"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Avbryt"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Nå er sikkerhetskopierte bilder inkludert"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Du kan velge bilder fra <xliff:g id="APP_NAME">%1$s</xliff:g>-kontoen <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g>-kontoen er oppdatert"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index d39dfc6..5aab7f0 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"चयन गरिएको छैन"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"तपाईंले चयन गर्नुभएको मिडिया तयार गरिँदै छ"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> मध्ये <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> वटा फोटो तयार छन्"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"रद्द गर्नुहोस्"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"अब ब्याकअप गरिएका फोटोहरू समावेश गरिएका छन्"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"तपाईं <xliff:g id="APP_NAME">%1$s</xliff:g> मा <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> खाता प्रयोग गरी राखिएका फोटोहरू चयन गर्न सक्नुहुन्छ"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> खाता अपडेट गरियो"</string>
diff --git a/res/values-night-v31/styles.xml b/res/values-night-v31/styles.xml
index 58249be..8e58ad7 100644
--- a/res/values-night-v31/styles.xml
+++ b/res/values-night-v31/styles.xml
@@ -41,8 +41,8 @@
         <item name="pickerBannerPrimaryTextColor">?android:attr/textColorSecondary</item>
         <item name="pickerBannerSecondaryTextColor">?android:attr/textColorSecondary</item>
         <item name="pickerBannerButtonTextColor">@android:color/system_accent1_300</item>
-        <item name="categoryDefaultThumbnailColor">@android:color/system_accent1_300</item>
-        <item name="categoryDefaultThumbnailCircleColor">?androidprv:attr/materialColorSurfaceContainer</item>
+        <item name="categoryDefaultThumbnailColor">?attr/colorOnSurfaceVariant</item>
+        <item name="categoryDefaultThumbnailCircleColor">?attr/colorSurfaceVariant</item>
     </style>
 
 </resources>
diff --git a/res/values-night/styles.xml b/res/values-night/styles.xml
index 599ce12..7a16b59 100644
--- a/res/values-night/styles.xml
+++ b/res/values-night/styles.xml
@@ -36,7 +36,7 @@
         <item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
     </style>
 
-    <style name="PickerMaterialTheme" parent="@style/Theme.MaterialComponents.DayNight.NoActionBar">
+    <style name="PickerMaterialTheme" parent="@style/Theme.Material3.DayNight.NoActionBar">
         <item name="materialAlertDialogTheme">@style/ProfileDialogTheme</item>
         <item name="pickerDragBarColor">#686868</item>
         <item name="pickerHighlightColor">?android:attr/colorAccent</item>
@@ -60,8 +60,8 @@
         <item name="pickerBannerPrimaryTextColor">?android:attr/textColorSecondary</item>
         <item name="pickerBannerSecondaryTextColor">?android:attr/textColorSecondary</item>
         <item name="pickerBannerButtonTextColor">?android:attr/colorAccent</item>
-        <item name="categoryDefaultThumbnailColor">?android:attr/colorAccent</item>
-        <item name="categoryDefaultThumbnailCircleColor">?androidprv:attr/materialColorSurfaceContainer</item>
+        <item name="categoryDefaultThumbnailColor">?attr/colorOnSurfaceVariant</item>
+        <item name="categoryDefaultThumbnailCircleColor">?attr/colorSurfaceVariant</item>
     </style>
 
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 62caff6..df69610 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"niet geselecteerd"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Je geselecteerde media voorbereiden"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> van <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> klaar"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Annuleren"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Nu ook met foto\'s waarvan een back-up is gemaakt"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Je kunt foto\'s selecteren uit het <xliff:g id="APP_NAME">%1$s</xliff:g>-account <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Account voor <xliff:g id="APP_NAME">%1$s</xliff:g> geüpdatet"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index b6e37dc..8533864 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ଚୟନ କରାଯାଇନାହିଁ"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"ଆପଣଙ୍କ ଚୟନିତ ମିଡିଆକୁ ପ୍ରସ୍ତୁତ କରାଯାଉଛି"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>ରୁ <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>ଟି ପ୍ରସ୍ତୁତ ଅଛି"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"ବାତିଲ କରନ୍ତୁ"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"ବ୍ୟାକଅପ ନିଆଯାଇଥିବା ଫଟୋଗୁଡ଼ିକୁ ବର୍ତ୍ତମାନ ଅନ୍ତର୍ଭୁକ୍ତ କରାଯାଇଛି"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"ଆପଣ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆକାଉଣ୍ଟ <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>ରୁ ଫଟୋଗୁଡ଼ିକୁ ଚୟନ କରିପାରିବେ"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଆକାଉଣ୍ଟକୁ ଅପଡେଟ କରାଯାଇଛି"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 950ad56..beb933e 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ਚੁਣਿਆ ਨਹੀਂ ਗਿਆ"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"ਤੁਹਾਡਾ ਚੁਣਿਆ ਗਿਆ ਮੀਡੀਆ ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> ਵਿੱਚੋਂ <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> ਤਿਆਰ"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"ਰੱਦ ਕਰੋ"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"ਬੈਕਅੱਪ ਕੀਤੀਆਂ ਫ਼ੋਟੋਆਂ ਨੂੰ ਹੁਣ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"ਤੁਸੀਂ <xliff:g id="APP_NAME">%1$s</xliff:g> ਵਿੱਚੋਂ <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> ਖਾਤੇ ਤੋਂ ਫ਼ੋਟੋਆਂ ਚੁਣ ਸਕਦੇ ਹੋ"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਖਾਤੇ ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index d08e86b..6ac9ce3 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nie wybrano"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Przygotowywanie wybranych multimediów"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Gotowe <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> z <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Anuluj"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Teraz znajdziesz tu kopie zapasowe zdjęć"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Możesz wybrać zdjęcia z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>, z konta <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Konto aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> zostało zaktualizowane"</string>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index feeeb74..326fde2 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"não selecionado"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Preparando a mídia selecionada"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> de <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> itens prontos"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancelar"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"As fotos salvas em backup agora estão incluídas"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Selecione fotos da conta <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> do app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"A conta do app <xliff:g id="APP_NAME">%1$s</xliff:g> foi atualizada"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 8a824c1..dddf82c 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"não selecionado"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"A preparar conteúdo multimédia selecionado"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> de <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> item(ns) pronto(s)"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancelar"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"As fotos com cópia de segurança já estão incluídas"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Pode selecionar fotos da app <xliff:g id="APP_NAME">%1$s</xliff:g> da conta <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Conta da app <xliff:g id="APP_NAME">%1$s</xliff:g> atualizada"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index feeeb74..326fde2 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"não selecionado"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Preparando a mídia selecionada"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> de <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> itens prontos"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Cancelar"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"As fotos salvas em backup agora estão incluídas"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Selecione fotos da conta <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> do app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"A conta do app <xliff:g id="APP_NAME">%1$s</xliff:g> foi atualizada"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 399078e..d5306a8 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"neselectat"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Se pregătește conținutul media selectat"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Finalizate: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> din <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Anulează"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Fotografiile cu backup sunt incluse acum"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Poți selecta fotografii din contul <xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Contul <xliff:g id="APP_NAME">%1$s</xliff:g> a fost actualizat"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index edf4c87..18d77ea 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"не выбрано"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Подготовка выбранных медиафайлов"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Предзагрузка: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> из <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Отмена"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Теперь можно выбирать фотографии в облаке"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Вы можете выбрать фотографии из аккаунта <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g>: аккаунт обновлен"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index c41dad2..e7c1b3c 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"තෝරා නොමැත"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"ඔබ තෝරන ලද මාධ්‍ය සූදානම් කරමින්"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>කින් <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>ක් සූදානම්"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"අවලංගු කරන්න"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"උපස්ථ කළ ඡායාරූප දැන් ඇතුළත් කර ඇත"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"ඔබට <xliff:g id="APP_NAME">%1$s</xliff:g> ගිණුමෙන් <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> ඡායාරූප තෝරා ගත හැක"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> ගිණුම යාවත්කාලීන විය"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index d20ec47..b77206a 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nevybrané"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Pripravujú sa vybrané médiá"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Pripravené: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> z <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Zrušiť"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Zálohované fotky sú teraz zahrnuté"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Môžete vyberať fotky z účtu <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Účet <xliff:g id="APP_NAME">%1$s</xliff:g> bol aktualizovaný"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index a5bcb3c..119ad24 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ni izbrano"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Pripravljanje izbranih predstavnostnih vsebin"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Pripravljenih: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> od <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Prekliči"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Varnostno kopirane fotografije so zdaj vključene"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Izberete lahko fotografije iz računa <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Račun za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g> je posodobljen"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 7681a67..a8e5c18 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"nuk është zgjedhur"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Media e zgjedhur po përgatitet"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> nga <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> gati"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Anulo"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Fotografitë e rezervuara tani janë të përfshira"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Mund të zgjedhësh fotografi nga llogaria e<xliff:g id="USER_ACCOUNT">%2$s</xliff:g> në <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Llogaria e <xliff:g id="APP_NAME">%1$s</xliff:g> u përditësua"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index bc902e7..bda0c5f 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"није изабрано"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Припремају се одабрани медијски фајлови"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Спремно:<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> од <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Откажи"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Сада су уврштене резервне копије слика"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Можете да изаберете слике са налога <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Налог за <xliff:g id="APP_NAME">%1$s</xliff:g> је ажуриран"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index d71c999..4ebe034 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"inte valt"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Din valda media förbereds"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> av <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> är redo"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Avbryt"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Säkerhetskopierade foton tas nu med"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Du kan välja foton från <xliff:g id="APP_NAME">%1$s</xliff:g>-kontot <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g>-kontot har uppdaterats"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index d220100..67f8103 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"haijachaguliwa"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Inaandaa maudhui yako uliyochagua"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> kati ya <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> ziko tayari"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Ghairi"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Picha zilizohifadhiwa nakala zimejumuishwa sasa"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Unaweza kuchagua picha zilizotoka kwenye akaunti ya <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> katika programu ya <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Umesasisha akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index fbb05c2..d53729d 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"தேர்ந்தெடுக்கப்படவில்லை"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"நீங்கள் தேர்ந்தெடுத்த மீடியா தயாராகிறது"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> / <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> தயாராக உள்ளது"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"ரத்துசெய்"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"காப்புப் பிரதி எடுக்கப்பட்ட படங்கள் இப்போது சேர்க்கப்பட்டுள்ளன"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸில் <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> கணக்கிலிருந்தும் படங்களைத் தேர்ந்தெடுக்கலாம்"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> கணக்கு புதுப்பிக்கப்பட்டது"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 5913fa6..3e8469b 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ఎంచుకోబడలేదు"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"మీరు ఎంచుకున్న మీడియాను సిద్ధం చేస్తోంది"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>లో <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> సిద్ధంగా ఉన్నాయి"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"రద్దు చేయండి"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"బ్యాకప్ చేసిన ఫోటోలు ఇప్పుడు చేర్చబడ్డాయి"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"మీరు <xliff:g id="APP_NAME">%1$s</xliff:g> ఖాతా <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> నుండి ఫోటోలను ఎంచుకోవచ్చు"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> ఖాతా అప్‌డేట్ చేయబడింది"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index faa59a6..a2afd2a 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"ไม่ได้เลือกไว้"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"กำลังเตรียมสื่อที่คุณเลือก"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"พร้อมแล้ว <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> จาก <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"ยกเลิก"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"รวมรูปภาพที่สำรองข้อมูลไว้แล้ว"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"คุณเลือกรูปภาพได้จากบัญชี <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> ของ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"อัปเดตบัญชี \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" แล้ว"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 6b0577d..473a335 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"hindi pinili"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Inihahanda ang napili mong media"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Handa na ang <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> sa <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Kanselahin"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Kasama na ngayon ang mga na-back up na larawan"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Puwede kang pumili ng mga larawan mula sa <xliff:g id="APP_NAME">%1$s</xliff:g> account na <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Na-update ang <xliff:g id="APP_NAME">%1$s</xliff:g> account"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 9c34218..037d32f 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"seçili değil"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Seçtiğiniz medyalar hazırlanıyor"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> adetten <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> adedi hazır"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"İptal"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Yedeklenen fotoğraflar artık dahil ediliyor"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasındaki <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> hesabından fotoğraf seçebilirsiniz"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> hesabı güncellendi"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 99039b9..b2b3947 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"не вибрано"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Підготовка вибраних медіафайлів"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"Готово: <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> з <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g>"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Скасувати"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Резервні копії фотографій додано"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Ви можете вибрати фотографії з облікового запису <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> у додатку <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Обліковий запис у додатку <xliff:g id="APP_NAME">%1$s</xliff:g> оновлено"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 6709e8a..dc215af 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"غیر منتخب کردہ"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"آپ کا منتخب کردہ میڈیا تیار کیا جا رہا ہے"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> میں سے <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> تیار ہیں"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"منسوخ کریں"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"بیک اپ لی گئی تصاویر اب شامل ہیں"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"آپ <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> کے <xliff:g id="APP_NAME">%1$s</xliff:g> اکاؤنٹ سے تصاویر منتخب کر سکتے ہیں"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> اکاؤنٹ اپ ڈیٹ کیا گیا"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 719b153..ac34311 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"tanlanmagan"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Tanlangan media tayyorlanmoqda"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>/<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> tayyor"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Bekor qilish"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Zaxiralangan suratlar qoʻshildi"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"<xliff:g id="USER_ACCOUNT">%2$s</xliff:g> hisobidagi <xliff:g id="APP_NAME">%1$s</xliff:g> rasmlarini tanlashingiz mumkin"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g> hisobi yangilandi"</string>
diff --git a/res/values-v31/styles.xml b/res/values-v31/styles.xml
index 85d3352..3992eba 100644
--- a/res/values-v31/styles.xml
+++ b/res/values-v31/styles.xml
@@ -41,8 +41,8 @@
         <item name="pickerBannerPrimaryTextColor">?android:attr/textColorSecondary</item>
         <item name="pickerBannerSecondaryTextColor">?android:attr/textColorPrimary</item>
         <item name="pickerBannerButtonTextColor">@android:color/system_accent1_600</item>
-        <item name="categoryDefaultThumbnailColor">@android:color/system_accent1_300</item>
-        <item name="categoryDefaultThumbnailCircleColor">?androidprv:attr/materialColorSurfaceContainer</item>
+        <item name="categoryDefaultThumbnailColor">?attr/colorOnSurfaceVariant</item>
+        <item name="categoryDefaultThumbnailCircleColor">?attr/colorSurfaceVariant</item>
     </style>
 
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 4cac424..ae0b4e5 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"chưa được chọn"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Đang chuẩn bị nội dung đa phương tiện mà bạn chọn"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g>/<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> mục đã sẵn sàng"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Huỷ"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Ảnh được sao lưu giờ đã có mặt"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Bạn có thể chọn ảnh của <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> trên <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"Đã cập nhật tài khoản <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index a9be74e..a2c02a2 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"未选择"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"正在准备您选择的媒体"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> 个已准备就绪,共 <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> 个"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"取消"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"备份照片现已添加完成"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"您可以选择来自<xliff:g id="APP_NAME">%1$s</xliff:g>账号 <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> 的照片"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"<xliff:g id="APP_NAME">%1$s</xliff:g>账号已更新"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index a8b9e61..fa75494 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"未揀"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"正在準備你選取的媒體"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> 個項目已就緒,共 <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> 個"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"取消"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"現在已納入備份相片"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"你可從「<xliff:g id="APP_NAME">%1$s</xliff:g>」帳戶 <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> 選取相片"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」帳戶更新完成"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 13c77cc..63c3401 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"未選取"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"正在準備所選媒體"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"已備妥 <xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> 個項目,共 <xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> 個項目"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"取消"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"現在已納入備份相片"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"你可以從「<xliff:g id="APP_NAME">%1$s</xliff:g>」帳戶 <xliff:g id="USER_ACCOUNT">%2$s</xliff:g> 選取相片"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」帳戶更新完成"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 0e53f4c..c0a63ae 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -100,6 +100,7 @@
     <string name="not_selected" msgid="2244008151669896758">"akukhethiwe"</string>
     <string name="preloading_dialog_title" msgid="4974348221848532887">"Ilungiselela imidiya yakho oyikhethile"</string>
     <string name="preloading_progress_message" msgid="4741327138031980582">"U-<xliff:g id="NUMBER_PRELOADED">%1$d</xliff:g> wokungu-<xliff:g id="NUMBER_TOTAL">%2$d</xliff:g> ulungile"</string>
+    <string name="preloading_cancel_button" msgid="824053521307342209">"Khansela"</string>
     <string name="picker_banner_cloud_first_time_available_title" msgid="5912973744275711595">"Izithombe ezenziwe isipele sezifakiwe manje"</string>
     <string name="picker_banner_cloud_first_time_available_desc" msgid="5570916598348187607">"Ungakhetha izithombe ezivela ku-akhawunti ye-<xliff:g id="APP_NAME">%1$s</xliff:g> ethi <xliff:g id="USER_ACCOUNT">%2$s</xliff:g>"</string>
     <string name="picker_banner_cloud_account_changed_title" msgid="4825058474378077327">"I-akhawunti ye-<xliff:g id="APP_NAME">%1$s</xliff:g> ibuyekeziwe"</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 2f9fd17..55a1f9d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -105,7 +105,7 @@
         <item name="android:listPreferredItemPaddingEnd">@dimen/picker_settings_list_item_padding_end</item>
     </style>
 
-    <style name="PickerMaterialTheme" parent="@style/Theme.MaterialComponents.DayNight.NoActionBar">
+    <style name="PickerMaterialTheme" parent="@style/Theme.Material3.DayNight.NoActionBar">
         <item name="materialAlertDialogTheme">@style/ProfileDialogTheme</item>
         <item name="pickerDragBarColor">#DADCE0</item>
         <item name="pickerHighlightColor">?android:attr/colorAccent</item>
@@ -129,8 +129,8 @@
         <item name="pickerBannerPrimaryTextColor">?android:attr/textColorSecondary</item>
         <item name="pickerBannerSecondaryTextColor">?android:attr/textColorPrimary</item>
         <item name="pickerBannerButtonTextColor">?android:attr/colorAccent</item>
-        <item name="categoryDefaultThumbnailColor">?android:attr/colorAccent</item>
-        <item name="categoryDefaultThumbnailCircleColor">?androidprv:attr/materialColorSurfaceContainer</item>
+        <item name="categoryDefaultThumbnailColor">?attr/colorOnSurfaceVariant</item>
+        <item name="categoryDefaultThumbnailCircleColor">?attr/colorSurfaceVariant</item>
     </style>
 
     <style name="PickerBannerButtonTheme"
diff --git a/src/com/android/providers/media/AccessChecker.java b/src/com/android/providers/media/AccessChecker.java
index adde626..986b444 100644
--- a/src/com/android/providers/media/AccessChecker.java
+++ b/src/com/android/providers/media/AccessChecker.java
@@ -363,6 +363,16 @@
         return PACKAGE_USER_ID_COLUMN + "=" + callingIdentity.uid / MediaStore.PER_USER_RANGE;
     }
 
+    /**
+     * Returns true if redaction is needed for openFile calls on picker uri by checking calling
+     * package permission
+     *
+     * @param callingIdentity - the current caller
+     */
+    public static boolean isRedactionNeededForPickerUri(LocalCallingIdentity callingIdentity) {
+        return callingIdentity.hasPermission(LocalCallingIdentity.PERMISSION_IS_REDACTION_NEEDED);
+    }
+
     @VisibleForTesting
     static String getWhereForMediaTypeMatch(int mediaType) {
         return bindSelection("media_type=?", mediaType);
diff --git a/src/com/android/providers/media/DatabaseBackupAndRecovery.java b/src/com/android/providers/media/DatabaseBackupAndRecovery.java
index 50ee804..6664697 100644
--- a/src/com/android/providers/media/DatabaseBackupAndRecovery.java
+++ b/src/com/android/providers/media/DatabaseBackupAndRecovery.java
@@ -168,7 +168,7 @@
             case MediaStore.VOLUME_INTERNAL:
                 return mConfigStore.isStableUrisForInternalVolumeEnabled()
                         || SystemProperties.getBoolean("persist.sys.fuse.backup.internal_db_backup",
-                        /* defaultValue */ false);
+                        /* defaultValue */ true);
             case MediaStore.VOLUME_EXTERNAL_PRIMARY:
                 return mConfigStore.isStableUrisForExternalVolumeEnabled()
                         || SystemProperties.getBoolean(
@@ -207,6 +207,7 @@
             return;
         }
 
+        final long startTime = SystemClock.elapsedRealtime();
         try {
             if (!new File(RECOVERY_DIRECTORY_PATH).exists()) {
                 new File(RECOVERY_DIRECTORY_PATH).mkdirs();
@@ -214,19 +215,25 @@
             FuseDaemon fuseDaemon = getFuseDaemonForFileWithWait(new File(
                     DatabaseBackupAndRecovery.EXTERNAL_PRIMARY_ROOT_PATH));
             Log.d(TAG, "Received db backup Fuse Daemon for: " + volumeName);
-            if (isStableUrisEnabled(volumeName)) {
-                if (MediaStore.VOLUME_EXTERNAL_PRIMARY.equalsIgnoreCase(volumeName)) {
-                    // Setup internal and external volumes
-                    fuseDaemon.setupVolumeDbBackup();
-                } else {
-                    // Setup public volume
-                    fuseDaemon.setupPublicVolumeDbBackup(volumeName);
-                }
+            if (MediaStore.VOLUME_EXTERNAL_PRIMARY.equalsIgnoreCase(volumeName) && (
+                    isStableUrisEnabled(MediaStore.VOLUME_INTERNAL) || isStableUrisEnabled(
+                            MediaStore.VOLUME_EXTERNAL_PRIMARY))) {
+                // Setup internal and external volumes
+                fuseDaemon.setupVolumeDbBackup();
                 mSetupCompletePublicVolumes.add(volumeName);
+            } else if (isStableUrisEnabled(volumeName)) {
+                // Setup public volume
+                fuseDaemon.setupPublicVolumeDbBackup(volumeName);
+                mSetupCompletePublicVolumes.add(volumeName);
+            } else {
+                return;
             }
         } catch (IOException e) {
             Log.e(TAG, "Failure in setting up backup and recovery for volume: " + volumeName, e);
             return;
+        } finally {
+            Log.i(TAG, "Backup and recovery setup time taken in milliseconds:" + (
+                    SystemClock.elapsedRealtime() - startTime));
         }
         Log.i(TAG, "Successfully set up backup and recovery for volume: " + volumeName);
     }
@@ -237,7 +244,7 @@
     public void backupDatabases(DatabaseHelper internalDatabaseHelper,
             DatabaseHelper externalDatabaseHelper, CancellationSignal signal) {
         setupVolumeDbBackupAndRecovery(MediaStore.VOLUME_EXTERNAL_PRIMARY,
-          new File(EXTERNAL_PRIMARY_ROOT_PATH));
+                new File(EXTERNAL_PRIMARY_ROOT_PATH));
         Log.i(TAG, "Triggering database backup");
         backupInternalDatabase(internalDatabaseHelper, signal);
         backupExternalDatabase(externalDatabaseHelper, MediaStore.VOLUME_EXTERNAL_PRIMARY, signal);
@@ -279,6 +286,8 @@
         }
 
         if (!mSetupCompletePublicVolumes.contains(MediaStore.VOLUME_EXTERNAL_PRIMARY)) {
+            Log.w(TAG,
+                "Setup is not present for backup of internal and external primary volume.");
             return;
         }
 
diff --git a/src/com/android/providers/media/LocalUriMatcher.java b/src/com/android/providers/media/LocalUriMatcher.java
index 888a619..9beebdb 100644
--- a/src/com/android/providers/media/LocalUriMatcher.java
+++ b/src/com/android/providers/media/LocalUriMatcher.java
@@ -72,11 +72,12 @@
     static final int DOWNLOADS_ID = 801;
 
     static final int PICKER = 900;
-    static final int PICKER_ID = 901;
+    public static final int PICKER_ID = 901;
     static final int PICKER_INTERNAL_MEDIA_ALL = 902;
     static final int PICKER_INTERNAL_MEDIA_LOCAL = 903;
     static final int PICKER_INTERNAL_ALBUMS_ALL = 904;
     static final int PICKER_INTERNAL_ALBUMS_LOCAL = 905;
+    public static final int PICKER_GET_CONTENT_ID = 906;
 
     public static final int MEDIA_GRANTS = 1000;
 
@@ -121,6 +122,11 @@
         // content://media/picker/<user-id>/<authority>/media/<media-id>
         mPublic.addURI(auth, "picker/#/*/media/*", PICKER_ID);
 
+        // content://media/picker_get_content/<user-id>/<media-id>
+        mPublic.addURI(auth, "picker_get_content/#/#", PICKER_GET_CONTENT_ID);
+        // content://media/picker_get_content/<user-id>/<authority>/media/<media-id>
+        mPublic.addURI(auth, "picker_get_content/#/*/media/*", PICKER_GET_CONTENT_ID);
+
         mPublic.addURI(auth, "cli", CLI);
 
         mPublic.addURI(auth, "*/images/media", IMAGES_MEDIA);
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index ce1cfa8..ec2d8c2 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -61,6 +61,7 @@
 import static com.android.providers.media.AccessChecker.getWhereForUserSelectedAccess;
 import static com.android.providers.media.AccessChecker.hasAccessToCollection;
 import static com.android.providers.media.AccessChecker.hasUserSelectedAccess;
+import static com.android.providers.media.AccessChecker.isRedactionNeededForPickerUri;
 import static com.android.providers.media.DatabaseHelper.EXTERNAL_DATABASE_NAME;
 import static com.android.providers.media.DatabaseHelper.INTERNAL_DATABASE_NAME;
 import static com.android.providers.media.LocalCallingIdentity.APPOP_REQUEST_INSTALL_PACKAGES_FOR_SHARED_UID;
@@ -109,6 +110,7 @@
 import static com.android.providers.media.LocalUriMatcher.IMAGES_THUMBNAILS_ID;
 import static com.android.providers.media.LocalUriMatcher.MEDIA_GRANTS;
 import static com.android.providers.media.LocalUriMatcher.MEDIA_SCANNER;
+import static com.android.providers.media.LocalUriMatcher.PICKER_GET_CONTENT_ID;
 import static com.android.providers.media.LocalUriMatcher.PICKER_ID;
 import static com.android.providers.media.LocalUriMatcher.PICKER_INTERNAL_ALBUMS_ALL;
 import static com.android.providers.media.LocalUriMatcher.PICKER_INTERNAL_ALBUMS_LOCAL;
@@ -122,6 +124,8 @@
 import static com.android.providers.media.LocalUriMatcher.VIDEO_THUMBNAILS_ID;
 import static com.android.providers.media.LocalUriMatcher.VOLUMES;
 import static com.android.providers.media.LocalUriMatcher.VOLUMES_ID;
+import static com.android.providers.media.PickerUriResolver.PICKER_GET_CONTENT_SEGMENT;
+import static com.android.providers.media.PickerUriResolver.PICKER_SEGMENT;
 import static com.android.providers.media.PickerUriResolver.getMediaUri;
 import static com.android.providers.media.photopicker.data.ItemsProvider.EXTRA_MIME_TYPE_SELECTION;
 import static com.android.providers.media.scan.MediaScanner.REASON_DEMAND;
@@ -498,6 +502,12 @@
 
     private static final String DEFAULT_FOLDER_CREATED_KEY_PREFIX = "created_default_folders_";
 
+    /**
+     * This value should match android.os.Trace.MAX_SECTION_NAME_LEN , not accessible from this
+     * class
+     */
+    private static final int MAX_SECTION_NAME_LEN = 127;
+
     @GuardedBy("mPendingOpenInfo")
     private final Map<Integer, PendingOpenInfo> mPendingOpenInfo = new ArrayMap<>();
 
@@ -1334,7 +1344,8 @@
                 mConfigStore, pickerSyncLockManager);
         mPickerDataLayer = PickerDataLayer.create(context, mPickerDbFacade, mPickerSyncController,
                 mConfigStore);
-        mPickerUriResolver = new PickerUriResolver(context, mPickerDbFacade, mProjectionHelper);
+        mPickerUriResolver = new PickerUriResolver(context, mPickerDbFacade, mProjectionHelper,
+                mUriMatcher);
 
         if (SdkLevel.isAtLeastS()) {
             mTranscodeHelper = new TranscodeHelperImpl(context, this, mConfigStore);
@@ -1564,8 +1575,8 @@
 
             try {
                 MediaService.onScanVolume(getContext(), volume, REASON_IDLE);
-            } catch (IOException e) {
-                Log.w(TAG, e);
+            } catch (IOException | IllegalArgumentException e) {
+                Log.w(TAG, "Failure in " + volume.getName() + " volume scan", e);
             }
 
             // Ensure that our thumbnails are valid
@@ -2269,7 +2280,8 @@
     @Keep
     public FileLookupResult onFileLookupForFuse(String path, int uid, int tid) {
         uid = getBinderUidForFuse(uid, tid);
-        final int userId = uidToUserId(uid);
+        // Use MediaProviders UserId as the caller might be calling cross profile.
+        final int userId = UserHandle.myUserId();
 
         if (isSyntheticPath(path, userId)) {
             if (isRedactedPath(path, userId)) {
@@ -2356,13 +2368,14 @@
         boolean result = false;
         switch (segmentCount) {
             case 1:
-                // .../picker
-                if (lastSegment.equals("picker")) {
+                // .../picker or .../picker_get_content
+                if (lastSegment.equals(PICKER_SEGMENT) || lastSegment.equals(
+                        PICKER_GET_CONTENT_SEGMENT)) {
                     result = file.exists() || file.mkdir();
                 }
                 break;
             case 2:
-                // .../picker/<user-id>
+                // .../picker/<user-id> or .../picker_get_content/<user-id>
                 try {
                     Integer.parseInt(lastSegment);
                     result = file.exists() || file.mkdir();
@@ -2372,21 +2385,24 @@
                 }
                 break;
             case 3:
-                // .../picker/<user-id>/<authority>
+                // .../picker/<user-id>/<authority> or .../picker_get_content/<user-id>/<authority>
                 result = preparePickerAuthorityPathSegment(file, lastSegment, uid);
                 break;
             case 4:
-                // .../picker/<user-id>/<authority>/media
+                // .../picker/<user-id>/<authority>/media or
+                // .../picker_get_content/<user-id>/<authority>/media
                 if (lastSegment.equals("media")) {
                     result = file.exists() || file.mkdir();
                 }
                 break;
             case 5:
-                // .../picker/<user-id>/<authority>/media/<media-id.extension>
+                // .../picker/<user-id>/<authority>/media/<media-id.extension> or
+                // .../picker_get_content/<user-id>/<authority>/media/<media-id.extension>
+                final String pickerSegmentType = syntheticRelativePathSegments.get(0);
                 final String fileUserId = syntheticRelativePathSegments.get(1);
                 final String authority = syntheticRelativePathSegments.get(2);
-                result = preparePickerMediaIdPathSegment(file, authority, lastSegment, fileUserId,
-                        uid);
+                result = preparePickerMediaIdPathSegment(file, pickerSegmentType, authority,
+                        lastSegment, fileUserId, uid);
                 break;
         }
 
@@ -2404,8 +2420,9 @@
                     new long[0]);
         }
 
-        // ['', 'storage', 'emulated', '0', 'transforms', 'synthetic', 'picker', '<user-id>',
-        // '<host>', 'media', '<fileName>']
+        // ['', 'storage', 'emulated', '0', 'transforms', 'synthetic',
+        // 'picker' or 'picker_get_content', '<user-id>', '<host>', 'media', '<fileName>']
+        final String pickerSegmentType = segments[6];
         final String userId = segments[7];
         final String fileName = segments[10];
         final String host = segments[8];
@@ -2441,7 +2458,19 @@
 
         try (FileInputStream fis = new FileInputStream(pfd.getFileDescriptor())) {
             final String mimeType = MimeUtils.resolveMimeType(new File(path));
-            final long[] redactionRanges = getRedactionRanges(fis, mimeType).redactionRanges;
+            // Picker segment indicates we need to force redact location metadata.
+            // Picker_get_content indicates that we need to check A_M_L permission to decide if the
+            // metadata needs to be redacted
+            LocalCallingIdentity callingIdentityForOriginalUid = getCachedCallingIdentityForFuse(
+                    uid);
+            final boolean isRedactionNeeded = pickerSegmentType.equalsIgnoreCase(PICKER_SEGMENT)
+                    || callingIdentityForOriginalUid == null
+                    || isRedactionNeededForPickerUri(callingIdentityForOriginalUid);
+            Log.v(TAG, "Redaction needed for file open: " + isRedactionNeeded);
+            long[] redactionRanges = new long[0];
+            if (isRedactionNeeded) {
+                redactionRanges = getRedactionRanges(fis, mimeType).redactionRanges;
+            }
             return new FileOpenResult(0 /* status */, uid, /* transformsUid */ 0,
                     /* nativeFd */ pfd.detachFd(), redactionRanges);
         } catch (IOException e) {
@@ -2458,13 +2487,14 @@
         return false;
     }
 
-    private boolean preparePickerMediaIdPathSegment(File file, String authority, String fileName,
-            String userId, int uid) {
+    private boolean preparePickerMediaIdPathSegment(File file, String pickerSegmentType,
+            String authority, String fileName, String userId, int uid) {
         final String mediaId = extractFileName(fileName);
-        final String[] projection = new String[] { MediaStore.PickerMediaColumns.SIZE };
+        final String[] projection = new String[]{MediaStore.PickerMediaColumns.SIZE};
 
-        final Uri uri = Uri.parse("content://media/picker/" + userId + "/" + authority + "/media/"
-                + mediaId);
+        final Uri uri = Uri.parse(
+                "content://media/" + pickerSegmentType + "/" + userId + "/" + authority + "/media/"
+                        + mediaId);
         try (Cursor cursor = mPickerUriResolver.query(uri, projection, /* callingPid */0, uid,
                 mCallingIdentity.get().getPackageName())) {
             if (cursor != null && cursor.moveToFirst()) {
@@ -2591,15 +2621,15 @@
     }
 
     @Override
-    public Uri canonicalize(Uri uri) {
-        final boolean allowHidden = isCallingPackageAllowedHidden();
-        final int match = matchUri(uri, allowHidden);
-
+    public Uri canonicalize(@NonNull Uri uri) {
         // Skip when we have nothing to canonicalize
         if ("1".equals(uri.getQueryParameter(CANONICAL))) {
             return uri;
         }
 
+        final boolean allowHidden = mCallingIdentity.get().hasPermission(PERMISSION_IS_SELF);
+        final int match = matchUri(uri, allowHidden);
+
         try (Cursor c = queryForSingleItem(uri, null, null, null, null)) {
             switch (match) {
                 case AUDIO_MEDIA_ID: {
@@ -2632,14 +2662,13 @@
     }
 
     @Override
-    public Uri uncanonicalize(Uri uri) {
-        final boolean allowHidden = isCallingPackageAllowedHidden();
-        final int match = matchUri(uri, allowHidden);
-
+    public Uri uncanonicalize(@NonNull Uri uri) {
         // Skip when we have nothing to uncanonicalize
         if (!"1".equals(uri.getQueryParameter(CANONICAL))) {
             return uri;
         }
+        final boolean allowHidden = mCallingIdentity.get().hasPermission(PERMISSION_IS_SELF);
+        final int match = matchUri(uri, allowHidden);
 
         // Extract values and then clear to avoid recursive lookups
         final String title = uri.getQueryParameter(AudioColumns.TITLE);
@@ -2703,6 +2732,14 @@
         return uri;
     }
 
+    private static String safeTraceSectionNameWithUri(String operation, Uri uri) {
+        String sectionName = "MP." + operation + " [" + uri + "]";
+        if (sectionName.length() > MAX_SECTION_NAME_LEN) {
+            return sectionName.substring(0, MAX_SECTION_NAME_LEN);
+        }
+        return sectionName;
+    }
+
     /**
      * @return where clause to exclude database rows where
      * <ul>
@@ -3588,20 +3625,21 @@
     }
 
     @Override
-    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
-            String sortOrder) {
+    public Cursor query(@NonNull Uri uri, String[] projection, String selection,
+                        String[] selectionArgs, String sortOrder) {
         return query(uri, projection,
                 DatabaseUtils.createSqlQueryBundle(selection, selectionArgs, sortOrder), null);
     }
 
     @Override
-    public Cursor query(Uri uri, String[] projection, Bundle queryArgs, CancellationSignal signal) {
+    public Cursor query(@NonNull Uri uri, String[] projection, Bundle queryArgs,
+                        CancellationSignal signal) {
         return query(uri, projection, queryArgs, signal, /* forSelf */ false);
     }
 
     private Cursor query(Uri uri, String[] projection, Bundle queryArgs,
             CancellationSignal signal, boolean forSelf) {
-        Trace.beginSection("MP.query [" + uri + ']');
+        Trace.beginSection(safeTraceSectionNameWithUri("query", uri));
         try {
             return queryInternal(uri, projection, queryArgs, signal, forSelf);
         } catch (FallbackException e) {
@@ -4041,6 +4079,7 @@
                 return Downloads.CONTENT_TYPE;
 
             case PICKER_ID:
+            case PICKER_GET_CONTENT_ID:
                 return mPickerUriResolver.getType(url, Binder.getCallingPid(),
                         Binder.getCallingUid());
         }
@@ -5159,7 +5198,7 @@
     @Nullable
     public Uri insert(@NonNull Uri uri, @Nullable ContentValues values,
             @Nullable Bundle extras) {
-        Trace.beginSection("MP.insert [" + uri + ']');
+        Trace.beginSection(safeTraceSectionNameWithUri("insert", uri));
         try {
             try {
                 return insertInternal(uri, values, extras);
@@ -5193,7 +5232,6 @@
         final boolean allowHidden = isCallingPackageAllowedHidden();
         final int match = matchUri(uri, allowHidden);
 
-        final int targetSdkVersion = getCallingPackageTargetSdkVersion();
         final String resolvedVolumeName = resolveVolumeName(uri);
 
         // handle MEDIA_SCANNER before calling getDatabaseForUri()
@@ -6213,7 +6251,7 @@
 
     @Override
     public int delete(@NonNull Uri uri, @Nullable Bundle extras) {
-        Trace.beginSection("MP.delete [" + uri + ']');
+        Trace.beginSection(safeTraceSectionNameWithUri("delete", uri));
         try {
             return deleteInternal(uri, extras);
         } catch (FallbackException e) {
@@ -6272,8 +6310,6 @@
 
         int count = 0;
 
-        final int targetSdkVersion = getCallingPackageTargetSdkVersion();
-
         // handle MEDIA_SCANNER before calling getDatabaseForUri()
         if (match == MEDIA_SCANNER) {
             if (mMediaScannerVolume == null) {
@@ -7687,7 +7723,7 @@
     @Override
     public int update(@NonNull Uri uri, @Nullable ContentValues values,
             @Nullable Bundle extras) {
-        Trace.beginSection("MP.update [" + uri + ']');
+        Trace.beginSection(safeTraceSectionNameWithUri("update", uri));
         try {
             return updateInternal(uri, values, extras);
         } catch (FallbackException e) {
@@ -7737,7 +7773,6 @@
 
         int count;
 
-        final int targetSdkVersion = getCallingPackageTargetSdkVersion();
         final boolean allowHidden = isCallingPackageAllowedHidden();
         final int match = matchUri(uri, allowHidden);
         final DatabaseHelper helper = getDatabaseForUri(uri);
@@ -8641,7 +8676,7 @@
 
     private boolean isPickerUri(Uri uri) {
         final int match = matchUri(uri, /* allowHidden */ isCallingPackageAllowedHidden());
-        return match == PICKER_ID;
+        return match == PICKER_ID || match == PICKER_GET_CONTENT_ID;
     }
 
     @Override
@@ -8668,9 +8703,20 @@
         uri = safeUncanonicalize(uri);
 
         if (isPickerUri(uri)) {
-            final int callingPid = mCallingIdentity.get().pid;
-            final int callingUid = mCallingIdentity.get().uid;
-            return mPickerUriResolver.openFile(uri, mode, signal, callingPid, callingUid);
+            int tid = Process.myTid();
+            synchronized (mPendingOpenInfo) {
+                mPendingOpenInfo.put(tid, new PendingOpenInfo(
+                        Binder.getCallingUid(), /* mediaCapabilitiesUid */ 0, /* shouldRedact */
+                        false, /* transcodeReason */ 0));
+            }
+
+            try {
+                return mPickerUriResolver.openFile(uri, mode, signal, mCallingIdentity.get());
+            } finally {
+                synchronized (mPendingOpenInfo) {
+                    mPendingOpenInfo.remove(tid);
+                }
+            }
         }
 
         final boolean allowHidden = isCallingPackageAllowedHidden();
@@ -8803,10 +8849,21 @@
 
         // This is needed for thumbnail resolution as it doesn't go through openFileCommon
         if (isPickerUri(uri)) {
-            final int callingPid = mCallingIdentity.get().pid;
-            final int callingUid = mCallingIdentity.get().uid;
-            return mPickerUriResolver.openTypedAssetFile(uri, mimeTypeFilter, opts, signal,
-                    callingPid, callingUid);
+            int tid = Process.myTid();
+            synchronized (mPendingOpenInfo) {
+                mPendingOpenInfo.put(tid, new PendingOpenInfo(
+                        Binder.getCallingUid(), /* mediaCapabilitiesUid */ 0, /* shouldRedact */
+                        false, /* transcodeReason */ 0));
+            }
+
+            try {
+                return mPickerUriResolver.openTypedAssetFile(uri, mimeTypeFilter, opts, signal,
+                        mCallingIdentity.get());
+            } finally {
+                synchronized (mPendingOpenInfo) {
+                    mPendingOpenInfo.remove(tid);
+                }
+            }
         }
 
         // TODO: enforce that caller has access to this uri
@@ -9852,7 +9909,8 @@
         boolean isSuccess = false;
 
         final int originalUid = getBinderUidForFuse(uid, tid);
-        final int callingUserId = uidToUserId(uid);
+        // Use MediaProvider's own ID here since the caller may be cross profile.
+        final int userId = UserHandle.myUserId();
         int mediaCapabilitiesUid = 0;
         final PendingOpenInfo pendingOpenInfo;
         synchronized (mPendingOpenInfo) {
@@ -9866,14 +9924,14 @@
         try {
             boolean forceRedaction = false;
             String redactedUriId = null;
-            if (isSyntheticPath(path, callingUserId)) {
+            if (isSyntheticPath(path, userId)) {
                 if (forWrite) {
                     // Synthetic URIs are not allowed to update EXIF headers.
                     return new FileOpenResult(OsConstants.EACCES /* status */, originalUid,
                             mediaCapabilitiesUid, new long[0]);
                 }
 
-                if (isRedactedPath(path, callingUserId)) {
+                if (isRedactedPath(path, userId)) {
                     redactedUriId = extractFileName(path);
 
                     // If path is redacted Uris' path, ioPath must be the real path, ioPath must
@@ -9883,7 +9941,7 @@
                     // Irrespective of the permissions we want to redact in this case.
                     redact = true;
                     forceRedaction = true;
-                } else if (isPickerPath(path, callingUserId)) {
+                } else if (isPickerPath(path, userId)) {
                     return handlePickerFileOpen(path, originalUid);
                 } else {
                     // we don't support any other transformations under .transforms/synthetic dir
diff --git a/src/com/android/providers/media/PickerUriResolver.java b/src/com/android/providers/media/PickerUriResolver.java
index b56b694..3a37c9a 100644
--- a/src/com/android/providers/media/PickerUriResolver.java
+++ b/src/com/android/providers/media/PickerUriResolver.java
@@ -19,6 +19,9 @@
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.os.Process.SYSTEM_UID;
 
+import static com.android.providers.media.AccessChecker.isRedactionNeededForPickerUri;
+import static com.android.providers.media.LocalUriMatcher.PICKER_GET_CONTENT_ID;
+import static com.android.providers.media.LocalUriMatcher.PICKER_ID;
 import static com.android.providers.media.photopicker.util.CursorUtils.getCursorString;
 import static com.android.providers.media.util.FileUtils.toFuseFile;
 
@@ -30,6 +33,7 @@
 import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.net.Uri;
+import android.os.Binder;
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.ParcelFileDescriptor;
@@ -58,7 +62,9 @@
 public class PickerUriResolver {
     private static final String TAG = "PickerUriResolver";
 
-    private static final String PICKER_SEGMENT = "picker";
+    public static final String PICKER_SEGMENT = "picker";
+
+    public static final String PICKER_GET_CONTENT_SEGMENT = "picker_get_content";
     private static final String PICKER_INTERNAL_SEGMENT = "picker_internal";
     /** A uri with prefix "content://media/picker" is considered as a picker uri */
     public static final Uri PICKER_URI = MediaStore.AUTHORITY_URI.buildUpon().
@@ -84,23 +90,28 @@
     private final PickerDbFacade mDbFacade;
     private final Set<String> mAllValidProjectionColumns;
     private final String[] mAllValidProjectionColumnsArray;
+    private final LocalUriMatcher mLocalUriMatcher;
 
-    PickerUriResolver(Context context, PickerDbFacade dbFacade, ProjectionHelper projectionHelper) {
+    PickerUriResolver(Context context, PickerDbFacade dbFacade, ProjectionHelper projectionHelper,
+            LocalUriMatcher localUriMatcher) {
         mContext = context;
         mDbFacade = dbFacade;
         mAllValidProjectionColumns = projectionHelper.getProjectionMap(
                 MediaStore.PickerMediaColumns.class).keySet();
         mAllValidProjectionColumnsArray = mAllValidProjectionColumns.toArray(new String[0]);
+        mLocalUriMatcher = localUriMatcher;
     }
 
     public ParcelFileDescriptor openFile(Uri uri, String mode, CancellationSignal signal,
-            int callingPid, int callingUid) throws FileNotFoundException {
+            LocalCallingIdentity localCallingIdentity)
+            throws FileNotFoundException {
         if (ParcelFileDescriptor.parseMode(mode) != ParcelFileDescriptor.MODE_READ_ONLY) {
             throw new SecurityException("PhotoPicker Uris can only be accessed to read."
                     + " Uri: " + uri);
         }
 
-        checkUriPermission(uri, callingPid, callingUid);
+        checkPermissionForRequireOriginalQueryParam(uri, localCallingIdentity);
+        checkUriPermission(uri, localCallingIdentity.pid, localCallingIdentity.uid);
 
         final ContentResolver resolver;
         try {
@@ -117,9 +128,10 @@
     }
 
     public AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts,
-            CancellationSignal signal, int callingPid, int callingUid)
+            CancellationSignal signal, LocalCallingIdentity localCallingIdentity)
             throws FileNotFoundException {
-        checkUriPermission(uri, callingPid, callingUid);
+        checkPermissionForRequireOriginalQueryParam(uri, localCallingIdentity);
+        checkUriPermission(uri, localCallingIdentity.pid, localCallingIdentity.uid);
 
         final ContentResolver resolver;
         try {
@@ -210,7 +222,8 @@
                 + CloudMediaProviderContract.URI_PATH_SURFACE_CONTROLLER);
     }
 
-    private ParcelFileDescriptor openPickerFile(Uri uri) throws FileNotFoundException {
+    private ParcelFileDescriptor openPickerFile(Uri uri)
+            throws FileNotFoundException {
         final File file = getPickerFileFromUri(uri);
         if (file == null) {
             throw new FileNotFoundException("File not found for uri: " + uri);
@@ -235,19 +248,38 @@
 
     @VisibleForTesting
     Cursor queryPickerUri(Uri uri, String[] projection) {
+        String pickerSegmentType = getPickerSegmentType(uri);
         uri = unwrapProviderUri(uri);
-        return mDbFacade.queryMediaIdForApps(uri.getHost(), uri.getLastPathSegment(),
-                projection);
+        return mDbFacade.queryMediaIdForApps(pickerSegmentType, uri.getHost(),
+                uri.getLastPathSegment(), projection);
     }
 
-    public static Uri wrapProviderUri(Uri uri, int userId) {
+    private String getPickerSegmentType(Uri uri) {
+        switch (mLocalUriMatcher.matchUri(uri, /* allowHidden */ false)) {
+            case PICKER_ID:
+                return PICKER_SEGMENT;
+            case PICKER_GET_CONTENT_ID:
+                return PICKER_GET_CONTENT_SEGMENT;
+        }
+
+        return null;
+    }
+
+    /**
+     * Creates a picker uri incorporating authority, user id and cloud provider.
+     */
+    public static Uri wrapProviderUri(Uri uri, String action, int userId) {
         final List<String> segments = uri.getPathSegments();
         if (segments.size() != 2) {
             throw new IllegalArgumentException("Unexpected provider URI: " + uri);
         }
 
         Uri.Builder builder = initializeUriBuilder(MediaStore.AUTHORITY);
-        builder.appendPath(PICKER_SEGMENT);
+        if (action.equalsIgnoreCase(Intent.ACTION_GET_CONTENT)) {
+            builder.appendPath(PICKER_GET_CONTENT_SEGMENT);
+        } else {
+            builder.appendPath(PICKER_SEGMENT);
+        }
         builder.appendPath(String.valueOf(userId));
         builder.appendPath(uri.getHost());
 
@@ -293,10 +325,36 @@
     }
 
     private void checkUriPermission(Uri uri, int pid, int uid) {
-        if (!isSelf(uid) && mContext.checkUriPermission(uri, pid, uid,
+        // Clear query parameters to check for URI permissions, apps can add requireOriginal
+        // query parameter to URI, URI grants will not be present in that case.
+        Uri uriWithoutQueryParams = uri.buildUpon().clearQuery().build();
+        if (!isSelf(uid) && mContext.checkUriPermission(uriWithoutQueryParams, pid, uid,
                 Intent.FLAG_GRANT_READ_URI_PERMISSION) != PERMISSION_GRANTED) {
             throw new SecurityException("Calling uid ( " + uid + " ) does not have permission to " +
-                    "access picker uri: " + uri);
+                    "access picker uri: " + uriWithoutQueryParams);
+        }
+    }
+
+    private void checkPermissionForRequireOriginalQueryParam(Uri uri,
+            LocalCallingIdentity localCallingIdentity) {
+        String value = uri.getQueryParameter(MediaStore.PARAM_REQUIRE_ORIGINAL);
+        if (value == null || value.isEmpty()) {
+            return;
+        }
+
+        // Check if requireOriginal is set
+        if (Integer.parseInt(value) == 1) {
+            if (mLocalUriMatcher.matchUri(uri, /* allowHidden */ false) == PICKER_ID) {
+                throw new UnsupportedOperationException(
+                        "Require Original is not supported for Picker URI " + uri);
+            }
+
+            if (mLocalUriMatcher.matchUri(uri, /* allowHidden */ false) == PICKER_GET_CONTENT_ID
+                    && isRedactionNeededForPickerUri(localCallingIdentity)) {
+                throw new UnsupportedOperationException("Calling uid ( " + Binder.getCallingUid()
+                        + " ) does not have ACCESS_MEDIA_LOCATION permission for requesting "
+                        + "original file");
+            }
         }
     }
 
diff --git a/src/com/android/providers/media/photopicker/PhotoPickerActivity.java b/src/com/android/providers/media/photopicker/PhotoPickerActivity.java
index 48ee7fb..f5f6916 100644
--- a/src/com/android/providers/media/photopicker/PhotoPickerActivity.java
+++ b/src/com/android/providers/media/photopicker/PhotoPickerActivity.java
@@ -132,6 +132,9 @@
     private int mToolbarHeight = 0;
     private boolean mShouldLogCancelledResult = true;
 
+    private AccessibilityManager mAccessibilityManager;
+    private boolean mIsAccessibilityEnabled;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         // This is required as GET_CONTENT with type "*/*" is also received by PhotoPicker due
@@ -185,6 +188,9 @@
 
         mTabLayout = findViewById(R.id.tab_layout);
 
+        mAccessibilityManager = getSystemService(AccessibilityManager.class);
+        mIsAccessibilityEnabled = mAccessibilityManager.isEnabled();
+
         initBottomSheetBehavior();
 
         // Save the fragment container layout so that we can adjust the padding based on preview or
@@ -201,6 +207,7 @@
         observeRefreshUiNotificationLiveData();
         // Restore state operation should always be kept at the end of this method.
         restoreState(savedInstanceState);
+
         // Call this after state is restored, to use the correct LOGGER_INSTANCE_ID_ARG
         if (savedInstanceState == null) {
             final String intentAction = intent != null ? intent.getAction() : null;
@@ -501,7 +508,7 @@
      */
     @VisibleForTesting
     protected boolean isAccessibilityEnabled() {
-        return getSystemService(AccessibilityManager.class).isEnabled();
+        return mIsAccessibilityEnabled;
     }
 
     private static int getBottomSheetPeekHeight(Context context) {
@@ -547,7 +554,7 @@
         logPickerSelectionConfirmed(mSelection.getSelectedItems().size());
         if (shouldPreloadSelectedItems()) {
             final var uris = PickerResult.getPickerUrisForItems(
-                    mSelection.getSelectedItems());
+                    getIntent().getAction(), mSelection.getSelectedItems());
             mPickerViewModel.logPreloadingStarted(uris.size());
             mPreloaderInstanceHolder.preloader =
                     SelectedMediaPreloader.preload(/* activity */ this, uris);
@@ -576,7 +583,8 @@
         // The permission controller will pass the requesting package's UID here
         final Bundle extras = getIntent().getExtras();
         final int uid = extras.getInt(Intent.EXTRA_UID);
-        final List<Uri> uris = getPickerUrisForItems(mSelection.getSelectedItemsWithoutGrants());
+        final List<Uri> uris = getPickerUrisForItems(getIntent().getAction(),
+                mSelection.getSelectedItemsWithoutGrants());
         if (!uris.isEmpty()) {
             ForegroundThread.getExecutor().execute(() -> {
                 // Handle grants in another thread to not block the UI.
@@ -589,7 +597,7 @@
         // deselected them.
         if (mPickerViewModel.isManagedSelectionEnabled()) {
             final List<Uri> urisForItemsWhoseGrantsNeedsToBeRevoked = getPickerUrisForItems(
-                    mSelection.getPreGrantedItemsToBeRevoked());
+                    getIntent().getAction(), mSelection.getPreGrantedItemsToBeRevoked());
             if (!urisForItemsWhoseGrantsNeedsToBeRevoked.isEmpty()) {
                 ForegroundThread.getExecutor().execute(() -> {
                     // Handle grants in another thread to not block the UI.
@@ -603,9 +611,8 @@
     }
 
     private void setResultForPickImagesOrGetContentAction() {
-        final Intent resultData = getPickerResponseIntent(
-                mSelection.canSelectMultiple(),
-                mSelection.getSelectedItems());
+        final Intent resultData = getPickerResponseIntent(getIntent().getAction(),
+                mSelection.canSelectMultiple(), mSelection.getSelectedItems());
         setResult(RESULT_OK, resultData);
     }
 
diff --git a/src/com/android/providers/media/photopicker/PickerSyncController.java b/src/com/android/providers/media/photopicker/PickerSyncController.java
index e03b332..eb7df4f 100644
--- a/src/com/android/providers/media/photopicker/PickerSyncController.java
+++ b/src/com/android/providers/media/photopicker/PickerSyncController.java
@@ -721,6 +721,10 @@
                 case SYNC_TYPE_MEDIA_FULL:
                     NonUiEventLogger.logPickerFullSyncStart(instanceId, MY_UID, authority);
 
+                    // Send UI refresh notification for any active picker sessions, as the
+                    // UI data might be stale if a full sync needs to be run.
+                    sendPickerUiRefreshNotification();
+
                     final Bundle fullSyncQueryArgs = new Bundle();
                     if (enablePagedSync) {
                         fullSyncQueryArgs.putInt(EXTRA_PAGE_SIZE, params.mPageSize);
diff --git a/src/com/android/providers/media/photopicker/data/PickerDbFacade.java b/src/com/android/providers/media/photopicker/data/PickerDbFacade.java
index 3fcdad9..50789b8 100644
--- a/src/com/android/providers/media/photopicker/data/PickerDbFacade.java
+++ b/src/com/android/providers/media/photopicker/data/PickerDbFacade.java
@@ -48,6 +48,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
+import com.android.providers.media.PickerUriResolver;
 import com.android.providers.media.photopicker.PickerSyncController;
 import com.android.providers.media.photopicker.data.model.Item;
 import com.android.providers.media.photopicker.sync.CloseableReentrantLock;
@@ -104,10 +105,7 @@
     private static final int FAIL = -1;
 
     private static final String TABLE_MEDIA = "media";
-    // Intentionally use /sdcard path so that the receiving app resolves it to it's per-user
-    // external storage path, e.g. /storage/emulated/<userid>. That way FUSE cross-user access is
-    // not required for picker paths sent across users
-    private static final String PICKER_PATH = "/sdcard/" + getPickerRelativePath();
+
     private static final String TABLE_ALBUM_MEDIA = "album_media";
 
     @VisibleForTesting
@@ -962,7 +960,7 @@
      * Returns a {@link Cursor} containing picker db media rows with columns as {@code projection},
      * a subset of {@link PickerMediaColumns}.
      */
-    public Cursor queryMediaIdForApps(String authority, String mediaId,
+    public Cursor queryMediaIdForApps(String pickerSegmentType, String authority, String mediaId,
             @NonNull String[] projection) {
         final String[] selectionArgs = new String[] { mediaId };
         final SQLiteQueryBuilder qb = createVisibleMediaQueryBuilder();
@@ -973,13 +971,13 @@
         }
 
         if (authority.equals(mLocalProvider)) {
-            return queryMediaIdForAppsLocked(qb, projection, selectionArgs);
+            return queryMediaIdForAppsLocked(qb, projection, selectionArgs, pickerSegmentType);
         }
 
         try (CloseableReentrantLock ignored = mPickerSyncLockManager
                 .lock(PickerSyncLockManager.DB_CLOUD_LOCK)) {
             if (authority.equals(mCloudProvider)) {
-                return queryMediaIdForAppsLocked(qb, projection, selectionArgs);
+                return queryMediaIdForAppsLocked(qb, projection, selectionArgs, pickerSegmentType);
             }
         }
 
@@ -987,8 +985,9 @@
     }
 
     private Cursor queryMediaIdForAppsLocked(@NonNull SQLiteQueryBuilder qb,
-            @NonNull String[] projection, @NonNull String[] selectionArgs) {
-        return qb.query(mDatabase, getMediaStoreProjectionLocked(projection),
+            @NonNull String[] projection, @NonNull String[] selectionArgs,
+            String pickerSegmentType) {
+        return qb.query(mDatabase, getMediaStoreProjectionLocked(projection, pickerSegmentType),
                 /* selection */ null, selectionArgs, /* groupBy */ null, /* having */ null,
                 /* orderBy */ null, /* limitStr */ null);
     }
@@ -1127,7 +1126,7 @@
     private String[] getCloudMediaProjectionLocked() {
         return new String[] {
             getProjectionAuthorityLocked(),
-            getProjectionDataLocked(MediaColumns.DATA),
+            getProjectionDataLocked(MediaColumns.DATA, PickerUriResolver.PICKER_SEGMENT),
             getProjectionId(MediaColumns.ID),
             // The id in the picker.db table represents the row id. This is used in UI pagination.
             getProjectionSimple(KEY_ID, Item.ROW_ID),
@@ -1141,13 +1140,14 @@
         };
     }
 
-    private String[] getMediaStoreProjectionLocked(String[] columns) {
+    private String[] getMediaStoreProjectionLocked(String[] columns, String pickerSegmentType) {
         final String[] projection = new String[columns.length];
 
         for (int i = 0; i < projection.length; i++) {
             switch (columns[i]) {
                 case PickerMediaColumns.DATA:
-                    projection[i] = getProjectionDataLocked(PickerMediaColumns.DATA);
+                    projection[i] = getProjectionDataLocked(PickerMediaColumns.DATA,
+                            pickerSegmentType);
                     break;
                 case PickerMediaColumns.DISPLAY_NAME:
                     projection[i] =
@@ -1202,13 +1202,13 @@
                 KEY_CLOUD_ID, mLocalProvider, mCloudProvider, MediaColumns.AUTHORITY);
     }
 
-    private String getProjectionDataLocked(String asColumn) {
+    private String getProjectionDataLocked(String asColumn, String pickerSegmentType) {
         // _data format:
         // /sdcard/.transforms/synthetic/picker/<user-id>/<authority>/media/<display-name>
         // See PickerUriResolver#getMediaUri
         final String authority = String.format("CASE WHEN %s IS NULL THEN '%s' ELSE '%s' END",
                 KEY_CLOUD_ID, mLocalProvider, mCloudProvider);
-        final String fullPath = "'" + PICKER_PATH + "/'"
+        final String fullPath = "'" + getPickerPath(pickerSegmentType) + "/'"
                 + "||" + "'" + MediaStore.MY_USER_ID + "/'"
                 + "||" + authority
                 + "||" + "'/" + CloudMediaProviderContract.URI_PATH_MEDIA + "/'"
@@ -1216,6 +1216,13 @@
         return String.format("%s AS %s", fullPath, asColumn);
     }
 
+    private String getPickerPath(String pickerSegmentType) {
+        // Intentionally use /sdcard path so that the receiving app resolves it to its per-user
+        // external storage path, e.g. /storage/emulated/<userid>. That way FUSE cross-user
+        // access is not required for picker paths sent across users
+        return "/sdcard/" + getPickerRelativePath(pickerSegmentType);
+    }
+
     private String getProjectionId(String asColumn) {
         // We prefer cloud_id first and it only matters for cloud+local items. For those, the row
         // will already be associated with a cloud authority, see #getProjectionAuthorityLocked.
diff --git a/src/com/android/providers/media/photopicker/data/PickerResult.java b/src/com/android/providers/media/photopicker/data/PickerResult.java
index 7bea27c..8108afa 100644
--- a/src/com/android/providers/media/photopicker/data/PickerResult.java
+++ b/src/com/android/providers/media/photopicker/data/PickerResult.java
@@ -40,10 +40,10 @@
      * @return {@code Intent} which contains Uri that has been granted access on.
      */
     @NonNull
-    public static Intent getPickerResponseIntent(boolean canSelectMultiple,
+    public static Intent getPickerResponseIntent(String action, boolean canSelectMultiple,
             @NonNull List<Item> selectedItems) {
         // 1. Get Picker Uris corresponding to the selected items
-        List<Uri> selectedUris = getPickerUrisForItems(selectedItems);
+        List<Uri> selectedUris = getPickerUrisForItems(action, selectedItems);
 
         // 2. Grant read access to picker Uris and return
         Intent intent = new Intent();
@@ -71,22 +71,23 @@
     }
 
     @VisibleForTesting
-    static Uri getPickerUri(Uri uri) {
+    static Uri getPickerUri(String action, Uri uri) {
         final String userInfo = uri.getUserInfo();
         final String userId = userInfo == null ? UserId.CURRENT_USER.toString() : userInfo;
-        return PickerUriResolver.wrapProviderUri(uri, Integer.parseInt(userId));
+        return PickerUriResolver.wrapProviderUri(uri, action, Integer.parseInt(userId));
     }
 
     /**
      * Returns list of PhotoPicker Uris corresponding to each {@link Item}
      *
+     * @param action action name which opened PhotoPicker
      * @param items list of Item for which we return uri list.
      */
     @NonNull
-    public static List<Uri> getPickerUrisForItems(@NonNull List<Item> items) {
+    public static List<Uri> getPickerUrisForItems(String action, @NonNull List<Item> items) {
         List<Uri> uris = new ArrayList<>();
         for (Item item : items) {
-            uris.add(getPickerUri(item.getContentUri()));
+            uris.add(getPickerUri(action, item.getContentUri()));
         }
 
         return uris;
diff --git a/src/com/android/providers/media/photopicker/sync/ImmediateAlbumSyncWorker.java b/src/com/android/providers/media/photopicker/sync/ImmediateAlbumSyncWorker.java
index a0032d4..71cd5b3 100644
--- a/src/com/android/providers/media/photopicker/sync/ImmediateAlbumSyncWorker.java
+++ b/src/com/android/providers/media/photopicker/sync/ImmediateAlbumSyncWorker.java
@@ -30,6 +30,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 import androidx.work.ForegroundInfo;
 import androidx.work.ListenableWorker;
 import androidx.work.Worker;
@@ -143,4 +144,9 @@
                 .getInt(SYNC_WORKER_INPUT_SYNC_SOURCE, /* defaultValue */ SYNC_LOCAL_ONLY);
         markAlbumMediaSyncAsComplete(syncSource, getId());
     }
+
+    @VisibleForTesting
+    CancellationSignal getCancellationSignal() {
+        return mCancellationSignal;
+    }
 }
diff --git a/src/com/android/providers/media/photopicker/sync/ImmediateSyncWorker.java b/src/com/android/providers/media/photopicker/sync/ImmediateSyncWorker.java
index 56a6998..a284d31 100644
--- a/src/com/android/providers/media/photopicker/sync/ImmediateSyncWorker.java
+++ b/src/com/android/providers/media/photopicker/sync/ImmediateSyncWorker.java
@@ -30,6 +30,7 @@
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
 import androidx.work.ForegroundInfo;
 import androidx.work.ListenableWorker;
 import androidx.work.Worker;
@@ -123,4 +124,9 @@
                 .getInt(SYNC_WORKER_INPUT_SYNC_SOURCE, /* defaultValue */ SYNC_LOCAL_AND_CLOUD);
         markSyncAsComplete(syncSource, getId());
     }
+
+    @VisibleForTesting
+    CancellationSignal getCancellationSignal() {
+        return mCancellationSignal;
+    }
 }
diff --git a/src/com/android/providers/media/photopicker/sync/PickerSyncNotificationHelper.java b/src/com/android/providers/media/photopicker/sync/PickerSyncNotificationHelper.java
index e30f2eb..9579ccf 100644
--- a/src/com/android/providers/media/photopicker/sync/PickerSyncNotificationHelper.java
+++ b/src/com/android/providers/media/photopicker/sync/PickerSyncNotificationHelper.java
@@ -24,6 +24,7 @@
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
 import androidx.core.app.NotificationCompat;
 import androidx.work.ForegroundInfo;
 
@@ -35,8 +36,10 @@
  */
 public class PickerSyncNotificationHelper {
     private static final String TAG = "SyncNotifHelper";
-    private static final String NOTIFICATION_CHANNEL_ID = "PhotoPickerSyncChannel";
-    private static final int NOTIFICATION_ID = 0;
+    @VisibleForTesting
+    static final String NOTIFICATION_CHANNEL_ID = "PhotoPickerSyncChannel";
+    @VisibleForTesting
+    static final int NOTIFICATION_ID = 0;
     private static final int NOTIFICATION_TIMEOUT_MILLIS = 1000;
 
 
diff --git a/src/com/android/providers/media/photopicker/sync/ProactiveSyncWorker.java b/src/com/android/providers/media/photopicker/sync/ProactiveSyncWorker.java
index 178710d..c93d74f 100644
--- a/src/com/android/providers/media/photopicker/sync/ProactiveSyncWorker.java
+++ b/src/com/android/providers/media/photopicker/sync/ProactiveSyncWorker.java
@@ -29,6 +29,7 @@
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
 import androidx.work.ForegroundInfo;
 import androidx.work.ListenableWorker;
 import androidx.work.Worker;
@@ -134,4 +135,9 @@
                 .getInt(SYNC_WORKER_INPUT_SYNC_SOURCE, /* defaultValue */ SYNC_LOCAL_AND_CLOUD);
         markSyncAsComplete(syncSource, getId());
     }
+
+    @VisibleForTesting
+    CancellationSignal getCancellationSignal() {
+        return mCancellationSignal;
+    }
 }
diff --git a/src/com/android/providers/media/photopicker/ui/PreviewFragment.java b/src/com/android/providers/media/photopicker/ui/PreviewFragment.java
index 31209d1..a70e8fb 100644
--- a/src/com/android/providers/media/photopicker/ui/PreviewFragment.java
+++ b/src/com/android/providers/media/photopicker/ui/PreviewFragment.java
@@ -48,6 +48,7 @@
 import java.text.NumberFormat;
 import java.util.List;
 import java.util.Locale;
+import java.util.Objects;
 
 /**
  * Displays a selected items in one up view. Supports deselecting items.
@@ -114,11 +115,7 @@
         final List<Item> selectedItemsList = mSelection.getSelectedItemsForPreview();
         final int selectedItemsListSize = selectedItemsList.size();
 
-        if (selectedItemsListSize <= 0) {
-            // This can happen if we lost PickerViewModel to optimize memory.
-            Log.e(TAG, "No items to preview. Returning back to photo grid");
-            requireActivity().getSupportFragmentManager().popBackStack();
-        } else if (selectedItemsListSize > 1 && !mSelection.canSelectMultiple()) {
+        if (selectedItemsListSize > 1 && !mSelection.canSelectMultiple()) {
             // This should never happen
             throw new IllegalStateException("Found more than one preview items in single select"
                     + " mode. Selected items count: " + selectedItemsListSize);
@@ -135,6 +132,35 @@
 
         setUpPreviewLayout(view, getArguments());
         setupScrimLayerAndBottomBar(view);
+        // Don't add any code post this line. The lazy loading setup should be the last thing we do
+        // to avoid the UI getting overwritten.
+        setUpUIForLazyLoading(view, selectedItemsListSize);
+    }
+
+    private void setUpUIForLazyLoading(View view, int selectedItemsListSize) {
+        final Button selectedCheckButton = view.findViewById(R.id.preview_selected_check_button);
+        Objects.requireNonNull(selectedCheckButton);
+        if (selectedItemsListSize == 0) {
+            // This can happen in two cases -
+            // 1. ACTION_USER_SELECT_IMAGES_FOR_APP launched the Photo Picker UI, and we are waiting
+            //    for items that's not preloaded due to pagination
+            // 2. PreviewFragment was launched from SavedPreference state but PickerViewModel was
+            //    killed and hence there is no selected items.
+            // In both these cases, user will see a blank UI with only Add/Allow button
+            selectedCheckButton.setVisibility(View.GONE);
+            Log.i(TAG, "No items to preview yet" + selectedCheckButton.getVisibility());
+        }
+
+        if (mPickerViewModel.isManagedSelectionEnabled()) {
+            mPickerViewModel.getIsAllPreGrantedMediaLoaded().observe(this, (isLoadComplete) -> {
+                if (!isLoadComplete) return;
+
+                selectedCheckButton.setVisibility(View.VISIBLE);
+
+                mSelection.prepareSelectedItemsForPreviewAll();
+                mViewPager2Wrapper.updateList(mSelection.getSelectedItemsForPreview());
+            });
+        }
     }
 
     private void setupScrimLayerAndBottomBar(View fragmentView) {
diff --git a/src/com/android/providers/media/photopicker/ui/TabContainerFragment.java b/src/com/android/providers/media/photopicker/ui/TabContainerFragment.java
index 8e070b5..8f06fb5 100644
--- a/src/com/android/providers/media/photopicker/ui/TabContainerFragment.java
+++ b/src/com/android/providers/media/photopicker/ui/TabContainerFragment.java
@@ -18,6 +18,7 @@
 import static com.android.providers.media.util.MimeUtils.isVideoMimeType;
 
 import android.os.Bundle;
+import android.provider.MediaStore;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -68,11 +69,17 @@
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        mTabContainerAdapter = new TabContainerAdapter(/* fragment */ this);
         mViewPager = view.findViewById(R.id.picker_tab_viewpager);
-        mViewPager.setAdapter(mTabContainerAdapter);
         final ViewModelProvider viewModelProvider = new ViewModelProvider(requireActivity());
         mPickerViewModel = viewModelProvider.get(PickerViewModel.class);
+        mTabContainerAdapter = new TabContainerAdapter(/* fragment */ this);
+        mViewPager.setAdapter(mTabContainerAdapter);
+
+        // Launch in albums tab if the app requests so
+        if (mPickerViewModel.getPickerLaunchTab() == MediaStore.PICK_IMAGES_TAB_ALBUMS) {
+            // Launch the picker in Albums tab without any switch animation
+            mViewPager.setCurrentItem(ALBUMS_TAB_POSITION, /* smoothScroll */ false);
+        }
 
         // If the ViewPager2 has more than one page with BottomSheetBehavior, the scrolled view
         // (e.g. RecyclerView) on the second page can't be scrolled. The workaround is to update
diff --git a/src/com/android/providers/media/photopicker/ui/TabFragment.java b/src/com/android/providers/media/photopicker/ui/TabFragment.java
index 46a410f..14159c2 100644
--- a/src/com/android/providers/media/photopicker/ui/TabFragment.java
+++ b/src/com/android/providers/media/photopicker/ui/TabFragment.java
@@ -169,7 +169,9 @@
             });
             // Transition to PreviewFragment on clicking "View Selected".
             mViewSelectedButton.setOnClickListener(v -> {
-                // Load items for preview that are pre granted but not yet loaded for UI.
+                // Load items for preview that are pre granted but not yet loaded for UI. This is an
+                // async call. Until the items are loaded, we can still preview already available
+                // items
                 mPickerViewModel.getRemainingPreGrantedItems();
                 mSelection.prepareSelectedItemsForPreviewAll();
 
diff --git a/src/com/android/providers/media/photopicker/ui/ViewPager2Wrapper.java b/src/com/android/providers/media/photopicker/ui/ViewPager2Wrapper.java
index 235965e..f55376d 100644
--- a/src/com/android/providers/media/photopicker/ui/ViewPager2Wrapper.java
+++ b/src/com/android/providers/media/photopicker/ui/ViewPager2Wrapper.java
@@ -62,6 +62,10 @@
         mViewPager.setPageTransformer(compositePageTransformer);
     }
 
+    void updateList(List<Item> selectedItems) {
+        mAdapter.updateItemList(selectedItems);
+    }
+
     /**
      * Registers given {@link ViewPager2.OnPageChangeCallback} to the {@link ViewPager2}. This class
      * also takes care of unregistering the callback onDestroy()
diff --git a/src/com/android/providers/media/photopicker/ui/settings/SettingsCloudMediaSelectFragment.java b/src/com/android/providers/media/photopicker/ui/settings/SettingsCloudMediaSelectFragment.java
index f08bd75..7d05864 100644
--- a/src/com/android/providers/media/photopicker/ui/settings/SettingsCloudMediaSelectFragment.java
+++ b/src/com/android/providers/media/photopicker/ui/settings/SettingsCloudMediaSelectFragment.java
@@ -139,7 +139,8 @@
                             providerMediaCollectionInfo.getAccountConfigurationIntent();
                     selectedPref.setExtraWidgetOnClickListener(
                             accountConfigurationIntent == null ? null : v ->
-                                    requireActivity().startActivity(accountConfigurationIntent));
+                                    requireActivity().startActivityAsUser(
+                                            accountConfigurationIntent, mUserId.getUserHandle()));
                 });
     }
 
diff --git a/src/com/android/providers/media/photopicker/viewmodel/PickerViewModel.java b/src/com/android/providers/media/photopicker/viewmodel/PickerViewModel.java
index f51d9cc..7208675 100644
--- a/src/com/android/providers/media/photopicker/viewmodel/PickerViewModel.java
+++ b/src/com/android/providers/media/photopicker/viewmodel/PickerViewModel.java
@@ -105,7 +105,6 @@
     public static final String TAG = "PhotoPicker";
 
     private static final int RECENT_MINIMUM_COUNT = 12;
-
     private static final int INSTANCE_ID_MAX = 1 << 15;
     private static final int DELAY_MILLIS = 0;
 
@@ -122,6 +121,8 @@
 
     private final MuteStatus mMuteStatus;
     public boolean mEmptyPageDisplayed = false;
+    @MediaStore.PickImagesTab
+    private int mPickerLaunchTab = MediaStore.PICK_IMAGES_TAB_IMAGES;
 
     // TODO(b/193857982): We keep these four data sets now, we may need to find a way to reduce the
     //  data set to reduce memories.
@@ -137,6 +138,7 @@
     // The list of categories.
     private MutableLiveData<List<Category>> mCategoryList;
 
+    private MutableLiveData<Boolean> mIsAllPreGrantedMediaLoaded = new MutableLiveData<>(false);
     private final MutableLiveData<Boolean> mShouldRefreshUiLiveData = new MutableLiveData<>(false);
     private final ContentObserver mRefreshUiNotificationObserver = new ContentObserver(null) {
         @Override
@@ -226,6 +228,14 @@
         }
     }
 
+    public int getPickerLaunchTab() {
+        return mPickerLaunchTab;
+    }
+
+    public void setPickerLaunchTab(int launchTab) {
+        mPickerLaunchTab = launchTab;
+    }
+
     @VisibleForTesting
     protected void initConfigStore() {
         mConfigStore = MediaApplication.getConfigStore();
@@ -576,6 +586,14 @@
     }
 
     /**
+     * @return true when all pre-granted items data has been loaded for this session.
+     */
+    @NonNull
+    public MutableLiveData<Boolean> getIsAllPreGrantedMediaLoaded() {
+        return mIsAllPreGrantedMediaLoaded;
+    }
+
+    /**
      * Gets item data for Uris which have not yet been loaded to the UI. This is important when the
      * preview fragment is created and hence should be called only before creation.
      *
@@ -585,17 +603,24 @@
      * issue by selectively loading those items and adding them to the selection list.</p>
      */
     public void getRemainingPreGrantedItems() {
-        if (isManagedSelectionEnabled() && mSelection.getPreGrantedItems() != null) {
-            List<String> idsForItemsToBeFetched = new ArrayList<>(mSelection.getPreGrantedItems());
-            idsForItemsToBeFetched.removeAll(mSelection.getSelectedItemsIds());
-            idsForItemsToBeFetched.removeAll(mSelection.getPreGrantedItemIdsToBeRevoked());
-            if (!idsForItemsToBeFetched.isEmpty()) {
-                Log.d(TAG, "Fetching items for required preGranted ids.");
-                loadItemsWithLocalIdSelection(Category.DEFAULT,
-                        getUserIdManager().getCurrentUserProfileId(),
+        if (!isManagedSelectionEnabled() || mSelection.getPreGrantedItems() == null) return;
+
+        List<String> idsForItemsToBeFetched =
+                new ArrayList<>(mSelection.getPreGrantedItems());
+        idsForItemsToBeFetched.removeAll(mSelection.getSelectedItemsIds());
+        idsForItemsToBeFetched.removeAll(mSelection.getPreGrantedItemIdsToBeRevoked());
+
+        if (!idsForItemsToBeFetched.isEmpty()) {
+            final UserId userId = mUserIdManager.getCurrentUserProfileId();
+            DataLoaderThread.getHandler().postDelayed(() -> {
+                loadItemsWithLocalIdSelection(Category.DEFAULT, userId,
                         idsForItemsToBeFetched.stream().map(Integer::valueOf).collect(
                                 Collectors.toList()));
-            }
+                // If new data has loaded then post value representing a successful operation.
+                mIsAllPreGrantedMediaLoaded.postValue(true);
+                Log.d(TAG, "Fetched " + idsForItemsToBeFetched.size()
+                        + " items for required preGranted ids");
+            }, TOKEN, 0);
         }
     }
 
@@ -847,6 +872,23 @@
      * Parse values from {@code intent} and set corresponding fields
      */
     public void parseValuesFromIntent(Intent intent) throws IllegalArgumentException {
+        final Bundle extras = intent.getExtras();
+        if (extras != null && extras.containsKey(MediaStore.EXTRA_PICK_IMAGES_LAUNCH_TAB)) {
+            if (intent.getAction().equals(ACTION_GET_CONTENT)) {
+                Log.e(TAG, "EXTRA_PICKER_LAUNCH_TAB cannot be passed as an extra in "
+                        + "ACTION_GET_CONTENT");
+            } else if (intent.getAction().equals(MediaStore.ACTION_USER_SELECT_IMAGES_FOR_APP)) {
+                throw new IllegalArgumentException("EXTRA_PICKER_LAUNCH_TAB cannot be passed as an "
+                        + "extra in ACTION_USER_SELECT_IMAGES_FOR_APP");
+            } else {
+                mPickerLaunchTab = extras.getInt(MediaStore.EXTRA_PICK_IMAGES_LAUNCH_TAB);
+                if (!checkPickerLaunchOptionValidity(mPickerLaunchTab)) {
+                    throw new IllegalArgumentException("Incorrect value " + mPickerLaunchTab
+                            + " received for the intent extra: "
+                            + MediaStore.EXTRA_PICK_IMAGES_LAUNCH_TAB);
+                }
+            }
+        }
         mUserIdManager.setIntentAndCheckRestrictions(intent);
 
         mMimeTypeFilters = MimeFilterUtils.getMimeTypeFilters(intent);
@@ -883,6 +925,11 @@
         }
     }
 
+    private boolean checkPickerLaunchOptionValidity(int launchOption) {
+        return launchOption == MediaStore.PICK_IMAGES_TAB_IMAGES
+                || launchOption == MediaStore.PICK_IMAGES_TAB_ALBUMS;
+    }
+
     private void initBannerManager() {
         mBannerManager = shouldShowOnlyLocalFeatures()
                 ? new BannerManager(mAppContext, mUserIdManager, mConfigStore)
diff --git a/src/com/android/providers/media/util/IsoInterface.java b/src/com/android/providers/media/util/IsoInterface.java
index 8da64b9..5fb5130 100644
--- a/src/com/android/providers/media/util/IsoInterface.java
+++ b/src/com/android/providers/media/util/IsoInterface.java
@@ -261,6 +261,9 @@
             }
         } catch (ErrnoException e) {
             throw e.rethrowAsIOException();
+        } catch (OutOfMemoryError e) {
+            Log.e(TAG, "Too many boxes in file. This might imply a corrupted file.", e);
+            throw new IOException(e.getMessage());
         }
 
         // Also create a flattened structure to speed up searching
@@ -295,8 +298,8 @@
     public @NonNull long[] getBoxRanges(int type) {
         LongArray res = new LongArray();
         for (Box box : mFlattened) {
-            for (int i = 0; i < box.range.length; i += 2) {
-                if (box.type == type) {
+            if (box.type == type) {
+                for (int i = 0; i < box.range.length; i += 2) {
                     res.add(box.range[i] + box.headerSize);
                     res.add(box.range[i] + box.range[i + 1]);
                 }
@@ -308,8 +311,8 @@
     public @NonNull long[] getBoxRanges(@NonNull UUID uuid) {
         LongArray res = new LongArray();
         for (Box box : mFlattened) {
-            for (int i = 0; i < box.range.length; i += 2) {
-                if (box.type == BOX_UUID && Objects.equals(box.uuid, uuid)) {
+            if (box.type == BOX_UUID && Objects.equals(box.uuid, uuid)) {
+                for (int i = 0; i < box.range.length; i += 2) {
                     res.add(box.range[i] + box.headerSize);
                     res.add(box.range[i] + box.range[i + 1]);
                 }
diff --git a/src/com/android/providers/media/util/SyntheticPathUtils.java b/src/com/android/providers/media/util/SyntheticPathUtils.java
index aa0db93..6d73802 100644
--- a/src/com/android/providers/media/util/SyntheticPathUtils.java
+++ b/src/com/android/providers/media/util/SyntheticPathUtils.java
@@ -16,14 +16,17 @@
 
 package com.android.providers.media.util;
 
+import static com.android.providers.media.PickerUriResolver.PICKER_GET_CONTENT_SEGMENT;
+import static com.android.providers.media.PickerUriResolver.PICKER_SEGMENT;
 import static com.android.providers.media.util.FileUtils.buildPath;
 import static com.android.providers.media.util.FileUtils.buildPrimaryVolumeFile;
 import static com.android.providers.media.util.FileUtils.extractFileName;
 
-import androidx.annotation.VisibleForTesting;
 import android.text.TextUtils;
 import android.util.Log;
 
+import androidx.annotation.VisibleForTesting;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
@@ -37,7 +40,6 @@
     private static final String TRANSFORMS_DIR = ".transforms";
     private static final String SYNTHETIC_DIR = "synthetic";
     private static final String REDACTED_DIR = "redacted";
-    private static final String PICKER_DIR = "picker";
 
     public static final String REDACTED_URI_ID_PREFIX = "RUID";
     public static final int REDACTED_URI_ID_SIZE = 36;
@@ -48,8 +50,12 @@
         return buildPath(/* base */ null, TRANSFORMS_DIR, SYNTHETIC_DIR, REDACTED_DIR).getPath();
     }
 
-    public static String getPickerRelativePath() {
-        return buildPath(/* base */ null, TRANSFORMS_DIR, SYNTHETIC_DIR, PICKER_DIR).getPath();
+    /**
+     * Returns picker synthetic path directory.
+     */
+    public static String getPickerRelativePath(String pickerSegmentType) {
+        return buildPath(/* base */ null, TRANSFORMS_DIR, SYNTHETIC_DIR,
+                pickerSegmentType).getPath();
     }
 
     public static boolean isRedactedPath(String path, int userId) {
@@ -66,10 +72,13 @@
     }
 
     public static boolean isPickerPath(String path, int userId) {
-        final String pickerDir = buildPrimaryVolumeFile(userId, getPickerRelativePath())
-                .getAbsolutePath();
+        final String pickerDir = buildPrimaryVolumeFile(userId, getPickerRelativePath(
+                PICKER_SEGMENT)).getAbsolutePath();
+        final String pickerGetContentDir = buildPrimaryVolumeFile(userId,
+                getPickerRelativePath(PICKER_GET_CONTENT_SEGMENT)).getAbsolutePath();
 
-        return path != null && startsWith(path, pickerDir);
+        return path != null && (startsWith(path, pickerDir) || startsWith(path,
+                pickerGetContentDir));
     }
 
     public static boolean isSyntheticPath(String path, int userId) {
diff --git a/tests/src/com/android/providers/media/AccessCheckerTest.java b/tests/src/com/android/providers/media/AccessCheckerTest.java
index 49a870e..ef6c963 100644
--- a/tests/src/com/android/providers/media/AccessCheckerTest.java
+++ b/tests/src/com/android/providers/media/AccessCheckerTest.java
@@ -29,6 +29,7 @@
 import static com.android.providers.media.AccessChecker.getWhereForUserSelectedAccess;
 import static com.android.providers.media.AccessChecker.hasAccessToCollection;
 import static com.android.providers.media.AccessChecker.hasUserSelectedAccess;
+import static com.android.providers.media.AccessChecker.isRedactionNeededForPickerUri;
 import static com.android.providers.media.LocalUriMatcher.AUDIO_MEDIA;
 import static com.android.providers.media.LocalUriMatcher.DOWNLOADS;
 import static com.android.providers.media.LocalUriMatcher.DOWNLOADS_ID;
@@ -45,7 +46,9 @@
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
 
 import android.os.Bundle;
 import android.system.Os;
@@ -398,6 +401,28 @@
     }
 
     @Test
+    public void testIsRedactionNeededForPickerUri_returnsFalse_withNoRedactPerms() {
+        LocalCallingIdentity callingIdentityWithRedactionNotNeededPermission =
+                LocalCallingIdentity.forTest(
+                        InstrumentationRegistry.getTargetContext(), Os.getuid(),
+                        ~LocalCallingIdentity.PERMISSION_IS_REDACTION_NEEDED);
+
+        assertFalse("App with write perms should get non redacted data",
+                isRedactionNeededForPickerUri(callingIdentityWithRedactionNotNeededPermission));
+    }
+
+    @Test
+    public void testIsRedactionNeededForPickerUri_returnsTrue_withRedactPerms() {
+        LocalCallingIdentity callingIdentityWithRedactionNeededPermission =
+                LocalCallingIdentity.forTest(
+                        InstrumentationRegistry.getTargetContext(), Os.getuid(),
+                        LocalCallingIdentity.PERMISSION_IS_REDACTION_NEEDED);
+
+        assertTrue("App with no perms should get redacted data",
+                isRedactionNeededForPickerUri(callingIdentityWithRedactionNeededPermission));
+    }
+
+    @Test
     public void testGetWhereForConstrainedAccess_forWrite_hasLegacyWrite() {
         LocalCallingIdentity hasLegacyWrite = LocalCallingIdentity.forTest(
                 InstrumentationRegistry.getTargetContext(), Os.getuid(),
diff --git a/tests/src/com/android/providers/media/LocalUriMatcherTest.java b/tests/src/com/android/providers/media/LocalUriMatcherTest.java
index 32721ed..01ce3ec 100644
--- a/tests/src/com/android/providers/media/LocalUriMatcherTest.java
+++ b/tests/src/com/android/providers/media/LocalUriMatcherTest.java
@@ -43,6 +43,15 @@
                 LocalUriMatcher.PICKER_ID,
                 assembleTestUri(new String[] {"picker", "0", "anything", "media", "anything"}));
 
+        assertMatchesPublic(
+                LocalUriMatcher.PICKER_GET_CONTENT_ID,
+                assembleTestUri(new String[]{"picker_get_content", Integer.toString(1),
+                        Integer.toString(1)}));
+        assertMatchesPublic(
+                LocalUriMatcher.PICKER_GET_CONTENT_ID,
+                assembleTestUri(
+                        new String[]{"picker_get_content", "0", "anything", "media", "anything"}));
+
         assertMatchesPublic(LocalUriMatcher.CLI, assembleTestUri(new String[] {"cli"}));
 
         assertMatchesPublic(
@@ -204,6 +213,15 @@
                 LocalUriMatcher.PICKER_ID,
                 assembleTestUri(new String[] {"picker", "0", "anything", "media", "anything"}));
 
+        assertMatchesHidden(
+                LocalUriMatcher.PICKER_GET_CONTENT_ID,
+                assembleTestUri(new String[]{"picker_get_content", Integer.toString(1),
+                        Integer.toString(1)}));
+        assertMatchesHidden(
+                LocalUriMatcher.PICKER_GET_CONTENT_ID,
+                assembleTestUri(
+                        new String[]{"picker_get_content", "0", "anything", "media", "anything"}));
+
         assertMatchesHidden(LocalUriMatcher.CLI, assembleTestUri(new String[] {"cli"}));
 
         assertMatchesHidden(
diff --git a/tests/src/com/android/providers/media/PickerUriResolverTest.java b/tests/src/com/android/providers/media/PickerUriResolverTest.java
index 3d8c260..e1d1016 100644
--- a/tests/src/com/android/providers/media/PickerUriResolverTest.java
+++ b/tests/src/com/android/providers/media/PickerUriResolverTest.java
@@ -16,8 +16,10 @@
 
 package com.android.providers.media;
 
+import static android.content.Intent.ACTION_GET_CONTENT;
 import static android.content.pm.PackageManager.PERMISSION_DENIED;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.provider.MediaStore.ACTION_PICK_IMAGES;
 
 import static androidx.test.InstrumentationRegistry.getContext;
 import static androidx.test.InstrumentationRegistry.getTargetContext;
@@ -26,6 +28,7 @@
 
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -78,10 +81,13 @@
     private static Uri sTestPickerUri;
     private static String TEST_ID;
 
+    private static Uri sMediaStoreUriInOtherContext;
+
     private static class TestPickerUriResolver extends PickerUriResolver {
         TestPickerUriResolver(Context context) {
             super(context, new PickerDbFacade(getTargetContext(), new PickerSyncLockManager()),
-                    new ProjectionHelper(Column.class, ExportedSince.class));
+                    new ProjectionHelper(Column.class, ExportedSince.class),
+                    new LocalUriMatcher(MediaStore.AUTHORITY));
         }
 
         @Override
@@ -119,14 +125,16 @@
                         Manifest.permission.INTERACT_ACROSS_USERS);
         sCurrentContext = mock(Context.class);
         when(sCurrentContext.getUser()).thenReturn(UserHandle.of(UserHandle.myUserId()));
+        PackageManager packageManager = mock(PackageManager.class);
+        when(sCurrentContext.getPackageManager()).thenReturn(packageManager);
+        when(packageManager.getPackagesForUid(anyInt())).thenReturn(
+                new String[]{getContext().getPackageName()});
 
         final Context otherUserContext = createOtherUserContext(TEST_USER);
         sTestPickerUriResolver = new TestPickerUriResolver(sCurrentContext);
 
-        final Uri mediaStoreUriInOtherContext = createTestFileInContext(otherUserContext);
-        TEST_ID = mediaStoreUriInOtherContext.getLastPathSegment();
-        sTestPickerUri = getPickerUriForId(ContentUris.parseId(mediaStoreUriInOtherContext),
-                TEST_USER);
+        sMediaStoreUriInOtherContext = createTestFileInContext(otherUserContext);
+        TEST_ID = sMediaStoreUriInOtherContext.getLastPathSegment();
     }
 
     @AfterClass
@@ -136,24 +144,37 @@
 
     @Test
     public void wrapProviderUriValid() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         final String providerSuffix = "authority/media/media_id";
 
         final Uri providerUriUserImplicit = Uri.parse("content://" + providerSuffix);
 
         final Uri providerUriUser0 = Uri.parse("content://0@" + providerSuffix);
         final Uri mediaUriUser0 = Uri.parse("content://media/picker/0/" + providerSuffix);
+        final Uri mediaUriUser0PickerGetContent = Uri.parse(
+                "content://media/picker_get_content/0/" + providerSuffix);
 
         final Uri providerUriUser10 = Uri.parse("content://10@" + providerSuffix);
         final Uri mediaUriUser10 = Uri.parse("content://media/picker/10/" + providerSuffix);
 
-        assertThat(PickerUriResolver.wrapProviderUri(providerUriUserImplicit, 0))
+        assertThat(PickerUriResolver.wrapProviderUri(providerUriUserImplicit,
+                ACTION_PICK_IMAGES, 0))
                 .isEqualTo(mediaUriUser0);
-        assertThat(PickerUriResolver.wrapProviderUri(providerUriUser0, 0)).isEqualTo(mediaUriUser0);
+        assertThat(PickerUriResolver.wrapProviderUri(providerUriUserImplicit,
+                ACTION_GET_CONTENT, 0))
+                .isEqualTo(mediaUriUser0PickerGetContent);
+        assertThat(
+                PickerUriResolver.wrapProviderUri(providerUriUser0, ACTION_PICK_IMAGES,
+                        0)).isEqualTo(mediaUriUser0);
         assertThat(PickerUriResolver.unwrapProviderUri(mediaUriUser0)).isEqualTo(providerUriUser0);
 
-        assertThat(PickerUriResolver.wrapProviderUri(providerUriUserImplicit, 10))
+        assertThat(PickerUriResolver.wrapProviderUri(providerUriUserImplicit,
+                ACTION_PICK_IMAGES, 10))
                 .isEqualTo(mediaUriUser10);
-        assertThat(PickerUriResolver.wrapProviderUri(providerUriUser10, 10))
+        assertThat(
+                PickerUriResolver.wrapProviderUri(providerUriUser10, ACTION_PICK_IMAGES,
+                        10))
                 .isEqualTo(mediaUriUser10);
         assertThat(PickerUriResolver.unwrapProviderUri(mediaUriUser10))
                 .isEqualTo(providerUriUser10);
@@ -161,6 +182,8 @@
 
     @Test
     public void wrapProviderUriInvalid() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         final String providerSuffixLong = "authority/media/media_id/another_media_id";
         final String providerSuffixShort = "authority/media";
 
@@ -171,18 +194,22 @@
         final Uri mediaUriUserShort = Uri.parse("content://media/picker/0/" + providerSuffixShort);
 
         assertThrows(IllegalArgumentException.class,
-                () -> PickerUriResolver.wrapProviderUri(providerUriUserLong, 0));
+                () -> PickerUriResolver.wrapProviderUri(providerUriUserLong, ACTION_PICK_IMAGES,
+                        0));
         assertThrows(IllegalArgumentException.class,
                 () -> PickerUriResolver.unwrapProviderUri(mediaUriUserLong));
 
         assertThrows(IllegalArgumentException.class,
                 () -> PickerUriResolver.unwrapProviderUri(mediaUriUserShort));
         assertThrows(IllegalArgumentException.class,
-                () -> PickerUriResolver.wrapProviderUri(providerUriUserShort, 0));
+                () -> PickerUriResolver.wrapProviderUri(providerUriUserShort, ACTION_PICK_IMAGES,
+                        0));
     }
 
     @Test
     public void testGetAlbumUri() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         final String authority = "foo";
         final Uri uri = Uri.parse("content://foo/album");
         assertThat(PickerUriResolver.getAlbumUri(authority)).isEqualTo(uri);
@@ -190,6 +217,8 @@
 
     @Test
     public void testGetMediaUri() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         final String authority = "foo";
         final Uri uri = Uri.parse("content://foo/media");
         assertThat(PickerUriResolver.getMediaUri(authority)).isEqualTo(uri);
@@ -197,6 +226,8 @@
 
     @Test
     public void testGetDeletedMediaUri() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         final String authority = "foo";
         final Uri uri = Uri.parse("content://foo/deleted_media");
         assertThat(PickerUriResolver.getDeletedMediaUri(authority)).isEqualTo(uri);
@@ -204,6 +235,8 @@
 
     @Test
     public void testCreateSurfaceControllerUri() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         final String authority = "foo";
         final Uri uri = Uri.parse("content://foo/surface_controller");
         assertThat(PickerUriResolver.createSurfaceControllerUri(authority)).isEqualTo(uri);
@@ -211,10 +244,13 @@
 
     @Test
     public void testOpenFile_mode_w() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         updateReadUriPermission(sTestPickerUri, /* grant */ true);
         try {
             sTestPickerUriResolver.openFile(sTestPickerUri, "w", /* signal */ null,
-                    /* callingPid */ -1, /* callingUid */ -1);
+                    LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                            0));
             fail("Write is not supported for Picker Uris. uri: " + sTestPickerUri);
         } catch (SecurityException expected) {
             // expected
@@ -225,10 +261,13 @@
 
     @Test
     public void testOpenFile_mode_rw() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         updateReadUriPermission(sTestPickerUri, /* grant */ true);
         try {
             sTestPickerUriResolver.openFile(sTestPickerUri, "rw", /* signal */ null,
-                    /* callingPid */ -1, /* callingUid */ -1);
+                    LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                            0));
             fail("Read-Write is not supported for Picker Uris. uri: " + sTestPickerUri);
         } catch (SecurityException expected) {
             // expected
@@ -239,10 +278,13 @@
 
     @Test
     public void testOpenFile_mode_invalid() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         updateReadUriPermission(sTestPickerUri, /* grant */ true);
         try {
             sTestPickerUriResolver.openFile(sTestPickerUri, "foo", /* signal */ null,
-                    /* callingPid */ -1, /* callingUid */ -1);
+                    LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                            0));
             fail("Invalid mode should not be supported for openFile. uri: " + sTestPickerUri);
         } catch (IllegalArgumentException expected) {
             // expected
@@ -252,6 +294,8 @@
 
     @Test
     public void testPickerUriResolver_permissionDenied() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         updateReadUriPermission(sTestPickerUri, /* grant */ false);
 
         testOpenFile_permissionDenied(sTestPickerUri);
@@ -262,13 +306,15 @@
 
     @Test
     public void testPermissionGrantedOnOtherUserUri() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         // This test requires the uri to be valid in 2 different users, but the permission is
         // granted in one user only.
         final int otherUserId = 50;
         final Context otherUserContext = createOtherUserContext(otherUserId);
         final Uri mediaStoreUserInAnotherValidUser = createTestFileInContext(otherUserContext);
         final Uri grantedUri = getPickerUriForId(ContentUris.parseId(
-                mediaStoreUserInAnotherValidUser), otherUserId);
+                mediaStoreUserInAnotherValidUser), otherUserId, ACTION_PICK_IMAGES);
         updateReadUriPermission(grantedUri, /* grant */ true);
 
         final Uri deniedUri = sTestPickerUri;
@@ -282,9 +328,12 @@
 
     @Test
     public void testPickerUriResolver_userInvalid() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         final int invalidUserId = 40;
 
-        final Uri inValidUserPickerUri = getPickerUriForId(/* id */ 1, invalidUserId);
+        final Uri inValidUserPickerUri = getPickerUriForId(/* id */ 1, invalidUserId,
+                ACTION_PICK_IMAGES);
         updateReadUriPermission(inValidUserPickerUri, /* grant */ true);
 
         // This method is called on current context when pickerUriResolver wants to get the content
@@ -302,6 +351,8 @@
 
     @Test
     public void testPickerUriResolver_userValid() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         updateReadUriPermission(sTestPickerUri, /* grant */ true);
 
         assertThat(PickerUriResolver.getUserId(sTestPickerUri)).isEqualTo(TEST_USER);
@@ -312,7 +363,102 @@
     }
 
     @Test
+    public void testPickerUriResolver_pickerUri_fileOpenWithRequireOriginal() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
+        // Grants given on original uri
+        updateReadUriPermission(sTestPickerUri, /* grant */ true);
+        sTestPickerUri = MediaStore.setRequireOriginal(sTestPickerUri);
+
+        assertThat(PickerUriResolver.getUserId(sTestPickerUri)).isEqualTo(TEST_USER);
+        try (ParcelFileDescriptor pfd = sTestPickerUriResolver.openFile(sTestPickerUri,
+                "r", /* signal */ null,
+                LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                        0))) {
+            fail("Require original should not be supported for picker uri:" + sTestPickerUri);
+        } catch (UnsupportedOperationException expected) {
+            // expected
+        }
+        try (ParcelFileDescriptor pfd = sTestPickerUriResolver.openFile(sTestPickerUri,
+                "r", /* signal */ null,
+                LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                        0))) {
+            fail("Require original should not be supported for picker uri:" + sTestPickerUri);
+        } catch (UnsupportedOperationException expected) {
+            // expected
+        }
+
+        try (AssetFileDescriptor afd = sTestPickerUriResolver.openTypedAssetFile(sTestPickerUri,
+                "image/*", /* opts */ null, /* signal */ null,
+                LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                        0))) {
+            fail("Require original should not be supported for picker uri:" + sTestPickerUri);
+        } catch (UnsupportedOperationException expected) {
+            // expected
+        }
+        try (AssetFileDescriptor afd = sTestPickerUriResolver.openTypedAssetFile(sTestPickerUri,
+                "image/*", /* opts */ null, /* signal */ null,
+                LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                        0))) {
+            fail("Require original should not be supported for picker uri:" + sTestPickerUri);
+        } catch (UnsupportedOperationException expected) {
+            // expected
+        }
+
+        testQuery(sTestPickerUri);
+        testGetType(sTestPickerUri, "image/jpeg");
+    }
+
+    @Test
+    public void testPickerUriResolver_pickerGetContentUri_fileOpenWithRequireOriginal()
+            throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_GET_CONTENT);
+        // Grants given on original uri
+        updateReadUriPermission(sTestPickerUri, /* grant */ true);
+        sTestPickerUri = MediaStore.setRequireOriginal(sTestPickerUri);
+
+        assertThat(PickerUriResolver.getUserId(sTestPickerUri)).isEqualTo(TEST_USER);
+        try (ParcelFileDescriptor pfd = sTestPickerUriResolver.openFile(sTestPickerUri,
+                "r", /* signal */ null,
+                LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                        ~LocalCallingIdentity.PERMISSION_IS_REDACTION_NEEDED))) {
+            assertThat(pfd).isNotNull();
+        }
+        try (ParcelFileDescriptor pfd = sTestPickerUriResolver.openFile(sTestPickerUri,
+                "r", /* signal */ null,
+                LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                        LocalCallingIdentity.PERMISSION_IS_REDACTION_NEEDED))) {
+            fail("Require original should not be supported when calling package does not have "
+                    + "required permission");
+        } catch (UnsupportedOperationException expected) {
+            // expected
+        }
+
+        try (AssetFileDescriptor afd = sTestPickerUriResolver.openTypedAssetFile(sTestPickerUri,
+                "image/*", /* opts */ null, /* signal */ null,
+                LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                        ~LocalCallingIdentity.PERMISSION_IS_REDACTION_NEEDED))) {
+            assertThat(afd).isNotNull();
+        }
+        try (AssetFileDescriptor afd = sTestPickerUriResolver.openTypedAssetFile(sTestPickerUri,
+                "image/*", /* opts */ null, /* signal */ null,
+                LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                        LocalCallingIdentity.PERMISSION_IS_REDACTION_NEEDED))) {
+            fail("Require original should not be supported when calling package does not have "
+                    + "required permission");
+        } catch (UnsupportedOperationException expected) {
+            // expected
+        }
+
+        testQuery(sTestPickerUri);
+        testGetType(sTestPickerUri, "image/jpeg");
+    }
+
+    @Test
     public void testQueryUnknownColumn() throws Exception {
+        sTestPickerUri = getPickerUriForId(ContentUris.parseId(sMediaStoreUriInOtherContext),
+                TEST_USER, ACTION_PICK_IMAGES);
         final int myUid = Process.myUid();
         final int myPid = Process.myPid();
         final String myPackageName = getContext().getPackageName();
@@ -367,25 +513,28 @@
                 Intent.FLAG_GRANT_READ_URI_PERMISSION)).thenReturn(permission);
     }
 
-    private static Uri getPickerUriForId(long id, int user) {
+    private static Uri getPickerUriForId(long id, int user, String action) {
         final Uri providerUri = PickerUriResolver
                 .getMediaUri(PickerSyncController.LOCAL_PICKER_PROVIDER_AUTHORITY)
                 .buildUpon()
                 .appendPath(String.valueOf(id))
                 .build();
-        return PickerUriResolver.wrapProviderUri(providerUri, user);
+        return PickerUriResolver.wrapProviderUri(providerUri, action, user);
     }
 
     private void testOpenFile(Uri uri) throws Exception {
         try (ParcelFileDescriptor pfd = sTestPickerUriResolver.openFile(uri, "r", /* signal */ null,
-                /* callingPid */ -1, /* callingUid */ -1)) {
+                LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                        0))) {
             assertThat(pfd).isNotNull();
         }
     }
 
     private void testOpenTypedAssetFile(Uri uri) throws Exception {
         try (AssetFileDescriptor afd = sTestPickerUriResolver.openTypedAssetFile(uri, "image/*",
-                /* opts */ null, /* signal */ null, /* callingPid */ -1, /* callingUid */ -1)) {
+                /* opts */ null, /* signal */ null,
+                LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                        0))) {
             assertThat(afd).isNotNull();
         }
     }
@@ -409,8 +558,9 @@
 
     private void testOpenFileInvalidUser(Uri uri) {
         try {
-            sTestPickerUriResolver.openFile(uri, "r", /* signal */ null, /* callingPid */ -1,
-                    /* callingUid */ -1);
+            sTestPickerUriResolver.openFile(uri, "r", /* signal */ null,
+                    LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                            0));
             fail("Invalid user specified in the picker uri: " + uri);
         } catch (FileNotFoundException expected) {
             // expected
@@ -421,7 +571,9 @@
     private void testOpenTypedAssetFileInvalidUser(Uri uri) throws Exception {
         try {
             sTestPickerUriResolver.openTypedAssetFile(uri, "image/*", /* opts */ null,
-                    /* signal */ null, /* callingPid */ -1, /* callingUid */ -1);
+                    /* signal */ null,
+                    LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                            0));
             fail("Invalid user specified in the picker uri: " + uri);
         } catch (FileNotFoundException expected) {
             // expected
@@ -449,8 +601,9 @@
 
     private void testOpenFile_permissionDenied(Uri uri) throws Exception {
         try {
-            sTestPickerUriResolver.openFile(uri, "r", /* signal */ null, /* callingPid */ -1,
-                    /* callingUid */ -1);
+            sTestPickerUriResolver.openFile(uri, "r", /* signal */ null,
+                    LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                            0));
             fail("openFile should fail if the caller does not have permission grant on the picker"
                     + " uri: " + uri);
         } catch (SecurityException expected) {
@@ -463,7 +616,9 @@
     private void testOpenTypedAssetFile_permissionDenied(Uri uri) throws Exception {
         try {
             sTestPickerUriResolver.openTypedAssetFile(uri, "image/*", /* opts */ null,
-                    /* signal */ null, /* callingPid */ -1, /* callingUid */ -1);
+                    /* signal */ null,
+                    LocalCallingIdentity.forTest(sCurrentContext, /* uid */ -1, /* permission */
+                            0));
             fail("openTypedAssetFile should fail if the caller does not have permission grant on"
                     + " the picker uri: " + uri);
         } catch (SecurityException expected) {
diff --git a/tests/src/com/android/providers/media/photopicker/PickerSyncControllerTest.java b/tests/src/com/android/providers/media/photopicker/PickerSyncControllerTest.java
index 1d06576..7408e4b 100644
--- a/tests/src/com/android/providers/media/photopicker/PickerSyncControllerTest.java
+++ b/tests/src/com/android/providers/media/photopicker/PickerSyncControllerTest.java
@@ -1716,6 +1716,29 @@
     }
 
     @Test
+    public void testCollectionIdChangeResetsUi() throws InterruptedException {
+        final ContentResolver contentResolver = mContext.getContentResolver();
+        final TestContentObserver refreshUiNotificationObserver = new TestContentObserver(null);
+        try {
+            setCloudProviderAndSyncAllMedia(CLOUD_PRIMARY_PROVIDER_AUTHORITY);
+            mCloudPrimaryMediaGenerator.setMediaCollectionId(COLLECTION_1);
+
+            // Simulate a UI session begins listening.
+            contentResolver.registerContentObserver(REFRESH_UI_PICKER_INTERNAL_OBSERVABLE_URI,
+                    /* notifyForDescendants */ false, refreshUiNotificationObserver);
+
+            mCloudPrimaryMediaGenerator.setMediaCollectionId(COLLECTION_2);
+
+            mController.syncAllMedia();
+
+            assertWithMessage("Refresh ui notification should have been received.")
+                    .that(refreshUiNotificationObserver.mNotificationReceived).isTrue();
+        } finally {
+            contentResolver.unregisterContentObserver(refreshUiNotificationObserver);
+        }
+    }
+
+    @Test
     public void testRefreshUiNotifications() throws InterruptedException {
         final ContentResolver contentResolver = mContext.getContentResolver();
         final TestContentObserver refreshUiNotificationObserver = new TestContentObserver(null);
diff --git a/tests/src/com/android/providers/media/photopicker/data/PickerDbFacadeTest.java b/tests/src/com/android/providers/media/photopicker/data/PickerDbFacadeTest.java
index d7838af..769223d 100644
--- a/tests/src/com/android/providers/media/photopicker/data/PickerDbFacadeTest.java
+++ b/tests/src/com/android/providers/media/photopicker/data/PickerDbFacadeTest.java
@@ -21,7 +21,6 @@
 
 import static com.android.providers.media.util.MimeUtils.getExtensionFromMimeType;
 
-import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.junit.Assert.assertThrows;
@@ -41,6 +40,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.providers.media.PickerUriResolver;
 import com.android.providers.media.ProjectionHelper;
 import com.android.providers.media.photopicker.sync.PickerSyncLockManager;
 import com.android.providers.media.photopicker.sync.SyncTracker;
@@ -1351,20 +1351,38 @@
         // Assert all projection columns
         final String[] allProjection = mProjectionHelper.getProjectionMap(
                 PickerMediaColumns.class).keySet().toArray(new String[0]);
-        try (Cursor cr = mFacade.queryMediaIdForApps(LOCAL_PROVIDER, LOCAL_ID,
-                allProjection)) {
-            assertThat(cr.getCount()).isEqualTo(1);
+        try (Cursor cr = mFacade.queryMediaIdForApps(PickerUriResolver.PICKER_SEGMENT,
+                LOCAL_PROVIDER, LOCAL_ID, allProjection)) {
+            assertWithMessage(
+                    "Unexpected number of rows when asserting all projection columns with "
+                            + "PickerUriResolver as PICKER_SEGMENT on local provider.")
+                    .that(cr.getCount()).isEqualTo(1);
 
             cr.moveToFirst();
-            assertMediaStoreCursor(cr, LOCAL_ID, DATE_TAKEN_MS);
+            assertMediaStoreCursor(cr, LOCAL_ID, DATE_TAKEN_MS, PickerUriResolver.PICKER_SEGMENT);
+        }
+
+        try (Cursor cr = mFacade.queryMediaIdForApps(PickerUriResolver.PICKER_GET_CONTENT_SEGMENT,
+                LOCAL_PROVIDER, LOCAL_ID, allProjection)) {
+            assertWithMessage(
+                    "Unexpected number of rows when asserting all projection columns with "
+                            + "PickerUriResolver as PICKER_GET_CONTENT_SEGMENT on local provider.")
+                    .that(cr.getCount()).isEqualTo(1);
+
+            cr.moveToFirst();
+            assertMediaStoreCursor(cr, LOCAL_ID, DATE_TAKEN_MS,
+                    PickerUriResolver.PICKER_GET_CONTENT_SEGMENT);
         }
 
         // Assert one projection column
         final String[] oneProjection = new String[]{PickerMediaColumns.DATE_TAKEN};
 
-        try (Cursor cr = mFacade.queryMediaIdForApps(CLOUD_PROVIDER, CLOUD_ID,
-                oneProjection)) {
-            assertThat(cr.getCount()).isEqualTo(1);
+        try (Cursor cr = mFacade.queryMediaIdForApps(PickerUriResolver.PICKER_SEGMENT,
+                CLOUD_PROVIDER, CLOUD_ID, oneProjection)) {
+            assertWithMessage(
+                    "Unexpected number of rows when asserting one projection column with cloud "
+                            + "provider.")
+                    .that(cr.getCount()).isEqualTo(1);
 
             cr.moveToFirst();
             assertWithMessage(
@@ -1380,9 +1398,12 @@
                 invalidColumn
         };
 
-        try (Cursor cr = mFacade.queryMediaIdForApps(CLOUD_PROVIDER, CLOUD_ID,
-                invalidProjection)) {
-            assertThat(cr.getCount()).isEqualTo(1);
+        try (Cursor cr = mFacade.queryMediaIdForApps(PickerUriResolver.PICKER_SEGMENT,
+                CLOUD_PROVIDER, CLOUD_ID, invalidProjection)) {
+            assertWithMessage(
+                    "Unexpected number of rows when asserting invalid projection column with "
+                            + "cloud provider.")
+                    .that(cr.getCount()).isEqualTo(1);
 
             cr.moveToFirst();
             assertWithMessage(
@@ -2243,8 +2264,8 @@
         return mediaId + getExtensionFromMimeType(mimeType);
     }
 
-    private static String getData(String authority, String displayName) {
-        return "/sdcard/.transforms/synthetic/picker/0/" + authority + "/media/"
+    private static String getData(String authority, String displayName, String pickerSegmentType) {
+        return "/sdcard/.transforms/synthetic/" + pickerSegmentType + "/0/" + authority + "/media/"
                 + displayName;
     }
 
@@ -2270,8 +2291,10 @@
 
     private static void assertCloudMediaCursor(Cursor cursor, String id, String mimeType) {
         final String displayName = getDisplayName(id, mimeType);
-        final String localData = getData(LOCAL_PROVIDER, displayName);
-        final String cloudData = getData(CLOUD_PROVIDER, displayName);
+        final String localData = getData(LOCAL_PROVIDER, displayName,
+                PickerUriResolver.PICKER_SEGMENT);
+        final String cloudData = getData(CLOUD_PROVIDER, displayName,
+                PickerUriResolver.PICKER_SEGMENT);
 
         assertWithMessage("Unexpected value of MediaColumns.ID for the cloud media cursor.")
                 .that(cursor.getString(cursor.getColumnIndex(MediaColumns.ID)))
@@ -2358,10 +2381,11 @@
         }
     }
 
-    private static void assertMediaStoreCursor(Cursor cursor, String id, long dateTakenMs) {
+    private static void assertMediaStoreCursor(Cursor cursor, String id, long dateTakenMs,
+            String pickerSegmentType) {
         final String displayName = getDisplayName(id, MP4_VIDEO_MIME_TYPE);
-        final String localData = getData(LOCAL_PROVIDER, displayName);
-        final String cloudData = getData(CLOUD_PROVIDER, displayName);
+        final String localData = getData(LOCAL_PROVIDER, displayName, pickerSegmentType);
+        final String cloudData = getData(CLOUD_PROVIDER, displayName, pickerSegmentType);
 
         assertWithMessage(
                 "Unexpected value for PickerMediaColumns.DISPLAY_NAME for the media store cursor.")
diff --git a/tests/src/com/android/providers/media/photopicker/data/PickerResultTest.java b/tests/src/com/android/providers/media/photopicker/data/PickerResultTest.java
index e4ded70..3fb365d 100644
--- a/tests/src/com/android/providers/media/photopicker/data/PickerResultTest.java
+++ b/tests/src/com/android/providers/media/photopicker/data/PickerResultTest.java
@@ -16,9 +16,12 @@
 
 package com.android.providers.media.photopicker.data;
 
+import static android.content.Intent.ACTION_GET_CONTENT;
+import static android.provider.MediaStore.ACTION_PICK_IMAGES;
 import static android.provider.MediaStore.Files.FileColumns._SPECIAL_FORMAT_NONE;
 
 import static com.android.compatibility.common.util.SystemUtil.runShellCommand;
+import static com.android.providers.media.PickerUriResolver.PICKER_GET_CONTENT_SEGMENT;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -58,7 +61,7 @@
     }
 
     /**
-     * Tests {@link PickerResult#getPickerResponseIntent(boolean, List)} with single item
+     * Tests {@link PickerResult#getPickerResponseIntent(String, boolean, List)} with single item
      * @throws Exception
      */
     @Test
@@ -66,9 +69,10 @@
         List<Item> items = null;
         try {
             items = createItemSelection(1);
-            final Uri expectedPickerUri = PickerResult.getPickerUri(items.get(0).getContentUri());
+            final Uri expectedPickerUri = PickerResult.getPickerUri(ACTION_PICK_IMAGES,
+                    items.get(0).getContentUri());
             final Intent intent = PickerResult.getPickerResponseIntent(
-                    /* canSelectMultiple */ false, items);
+                    ACTION_PICK_IMAGES, /* canSelectMultiple */ false, items);
 
             final Uri result = intent.getData();
             assertPickerUriFormat(result);
@@ -84,8 +88,32 @@
         }
     }
 
+    @Test
+    public void testGetResultSingleForActionGetContent() throws Exception {
+        List<Item> items = null;
+        try {
+            items = createItemSelection(1);
+            final Uri expectedPickerUri = PickerResult.getPickerUri(ACTION_GET_CONTENT,
+                    items.get(0).getContentUri());
+            final Intent intent = PickerResult.getPickerResponseIntent(
+                    ACTION_GET_CONTENT, /* canSelectMultiple */ false, items);
+
+            final Uri result = intent.getData();
+            assertGetContentPickerUriFormat(result);
+            assertThat(result).isEqualTo(expectedPickerUri);
+
+            final ClipData clipData = intent.getClipData();
+            assertThat(clipData).isNotNull();
+            final int count = clipData.getItemCount();
+            assertThat(count).isEqualTo(1);
+            assertThat(clipData.getItemAt(0).getUri()).isEqualTo(expectedPickerUri);
+        } finally {
+            deleteFiles(items);
+        }
+    }
+
     /**
-     * Tests {@link PickerResult#getPickerResponseIntent(boolean, List)} with multiple items
+     * Tests {@link PickerResult#getPickerResponseIntent(String, boolean, List)} with multiple items
      * @throws Exception
      */
     @Test
@@ -95,11 +123,12 @@
             final int itemCount = 3;
             items = createItemSelection(itemCount);
             List<Uri> expectedPickerUris = new ArrayList<>();
-            for (Item item: items) {
-                expectedPickerUris.add(PickerResult.getPickerUri(item.getContentUri()));
+            for (Item item : items) {
+                expectedPickerUris.add(PickerResult.getPickerUri(ACTION_PICK_IMAGES,
+                        item.getContentUri()));
             }
-            final Intent intent = PickerResult.getPickerResponseIntent(/* canSelectMultiple */ true,
-                    items);
+            final Intent intent = PickerResult.getPickerResponseIntent(
+                    ACTION_PICK_IMAGES, /* canSelectMultiple */ true, items);
 
             final ClipData clipData = intent.getClipData();
             final int count = clipData.getItemCount();
@@ -114,10 +143,36 @@
         }
     }
 
+    @Test
+    public void testGetResultMultipleForActionGetContent() throws Exception {
+        ArrayList<Item> items = null;
+        try {
+            final int itemCount = 3;
+            items = createItemSelection(itemCount);
+            List<Uri> expectedPickerUris = new ArrayList<>();
+            for (Item item : items) {
+                expectedPickerUris.add(PickerResult.getPickerUri(ACTION_GET_CONTENT,
+                        item.getContentUri()));
+            }
+            final Intent intent = PickerResult.getPickerResponseIntent(
+                    ACTION_GET_CONTENT, /* canSelectMultiple */ true, items);
+
+            final ClipData clipData = intent.getClipData();
+            final int count = clipData.getItemCount();
+            assertThat(count).isEqualTo(itemCount);
+            for (int i = 0; i < count; i++) {
+                Uri uri = clipData.getItemAt(i).getUri();
+                assertGetContentPickerUriFormat(uri);
+                assertThat(uri).isEqualTo(expectedPickerUris.get(i));
+            }
+        } finally {
+            deleteFiles(items);
+        }
+    }
+
     /**
-     * Tests {@link PickerResult#getPickerResponseIntent(boolean, List)} when the user selected
-     * only one item in multi-select mode
-     * @throws Exception
+     * Tests {@link PickerResult#getPickerResponseIntent(String, boolean, List)} when the user
+     * selected only one item in multi-select mode
      */
     @Test
     public void testGetResultMultiple_onlyOneItemSelected() throws Exception {
@@ -125,9 +180,10 @@
         try {
             final int itemCount = 1;
             items = createItemSelection(itemCount);
-            final Uri expectedPickerUri = PickerResult.getPickerUri(items.get(0).getContentUri());
-            final Intent intent = PickerResult.getPickerResponseIntent(/* canSelectMultiple */ true,
-                    items);
+            final Uri expectedPickerUri = PickerResult.getPickerUri(ACTION_PICK_IMAGES,
+                    items.get(0).getContentUri());
+            final Intent intent = PickerResult.getPickerResponseIntent(
+                    ACTION_PICK_IMAGES, /* canSelectMultiple */ true, items);
 
             final ClipData clipData = intent.getClipData();
             final int count = clipData.getItemCount();
@@ -144,6 +200,12 @@
         assertThat(uri.toString().startsWith(pickerUriPrefix)).isTrue();
     }
 
+    private void assertGetContentPickerUriFormat(Uri uri) {
+        final String pickerNonRedactedUriPrefix = MediaStore.AUTHORITY_URI.buildUpon().appendPath(
+                PICKER_GET_CONTENT_SEGMENT).build().toString();
+        assertThat(uri.toString().startsWith(pickerNonRedactedUriPrefix)).isTrue();
+    }
+
     /**
      * Returns a PhotoSelection on which the test app does not have access to.
      */
diff --git a/tests/src/com/android/providers/media/photopicker/espresso/PhotoPickerBaseTest.java b/tests/src/com/android/providers/media/photopicker/espresso/PhotoPickerBaseTest.java
index cc9626f..f0b6b03 100644
--- a/tests/src/com/android/providers/media/photopicker/espresso/PhotoPickerBaseTest.java
+++ b/tests/src/com/android/providers/media/photopicker/espresso/PhotoPickerBaseTest.java
@@ -138,7 +138,7 @@
         extras.putBoolean(MANAGED_SELECTION_ENABLED_EXTRA, true);
         sPickerChoiceManagedSelectionIntent.putExtras(extras);
     }
-    private static final File IMAGE_1_FILE = new File(Environment.getExternalStorageDirectory(),
+    public static final File IMAGE_1_FILE = new File(Environment.getExternalStorageDirectory(),
             Environment.DIRECTORY_DCIM + "/Camera"
                     + "/image_" + System.currentTimeMillis() + ".jpeg");
     private static final File IMAGE_2_FILE = new File(Environment.getExternalStorageDirectory(),
diff --git a/tests/src/com/android/providers/media/photopicker/espresso/PhotoPickerUserSelectActivityTest.java b/tests/src/com/android/providers/media/photopicker/espresso/PhotoPickerUserSelectActivityTest.java
index 110fbb7..8c39da5 100644
--- a/tests/src/com/android/providers/media/photopicker/espresso/PhotoPickerUserSelectActivityTest.java
+++ b/tests/src/com/android/providers/media/photopicker/espresso/PhotoPickerUserSelectActivityTest.java
@@ -33,12 +33,17 @@
 import static com.android.providers.media.photopicker.ui.TabAdapter.ITEM_TYPE_BANNER;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static junit.framework.Assert.fail;
 
 import static org.hamcrest.Matchers.allOf;
 import static org.hamcrest.Matchers.not;
 
 import android.app.Activity;
+import android.content.ContentUris;
 import android.content.Intent;
+import android.net.Uri;
 import android.provider.MediaStore;
 
 import androidx.lifecycle.ViewModelProvider;
@@ -49,6 +54,7 @@
 
 import com.android.providers.media.R;
 import com.android.providers.media.library.RunOnlyOnPostsubmit;
+import com.android.providers.media.photopicker.DataLoaderThread;
 import com.android.providers.media.photopicker.data.Selection;
 import com.android.providers.media.photopicker.viewmodel.PickerViewModel;
 
@@ -56,6 +62,10 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 @RunOnlyOnPostsubmit
 @SdkSuppress(minSdkVersion = 34, codeName = "UpsideDownCake")
 @RunWith(AndroidJUnit4ClassRunner.class)
@@ -185,14 +195,12 @@
         clickItem(PICKER_TAB_RECYCLERVIEW_ID, IMAGE_1_POSITION, ICON_THUMBNAIL_ID);
         // Navigate to preview
         onView(withId(VIEW_SELECTED_BUTTON_ID)).perform(click());
-
         try (ViewPager2IdlingResource idlingResource =
                      ViewPager2IdlingResource.register(mScenario, PREVIEW_VIEW_PAGER_ID)) {
             final int previewAddButtonId = R.id.preview_add_button;
             final int previewSelectButtonId = R.id.preview_selected_check_button;
             final String selectedString =
                     getTargetContext().getResources().getString(R.string.selected);
-
             // Verify that, initially, we show "selected" check button
             onView(withId(previewSelectButtonId)).check(matches(isSelected()));
             onView(withId(previewSelectButtonId)).check(matches(withText(selectedString)));
@@ -231,6 +239,82 @@
     }
 
     @Test
+    public void testPreview_showsOnlyAlreadyLoadedGrantItems() throws Exception {
+        launchValidActivityWithManagedSelectionEnabled();
+        onView(withId(PICKER_TAB_RECYCLERVIEW_ID)).check(matches(isDisplayed()));
+
+        final Uri uri = MediaStore.scanFile(getIsolatedContext().getContentResolver(),
+                IMAGE_1_FILE);
+        MediaStore.waitForIdle(getIsolatedContext().getContentResolver());
+        mScenario.onActivity(activity -> {
+            // Add an item id to the pre-granted set, so that when preview fragment gets opened up
+            // there is something to load as a remaining item.
+            Selection selection =
+                    new ViewModelProvider(activity).get(PickerViewModel.class).getSelection();
+            selection.setTotalNumberOfPreGrantedItems(1);
+            selection.setPreGrantedItemSet(Set.of(String.valueOf(ContentUris.parseId(uri))));
+
+            // Verify that we don't have anything to preview
+            selection.prepareSelectedItemsForPreviewAll();
+            assertWithMessage("Expected preview-able item list to be empty")
+                    .that(selection.getSelectedItemsForPreview()).isEmpty();
+        });
+
+        // Block the DataLoader thread by posting a conditional wait. This will block fetching of
+        // pregranted items in preview
+        final CountDownLatch latch = new CountDownLatch(1);
+        DataLoaderThread.waitForIdle();
+        DataLoaderThread.getHandler().postDelayed(() -> {
+            // Wait for 5 seconds if we don't receive a countdown
+            try {
+                assertWithMessage("Expected the test to send countdown before 5s")
+                        .that(latch.await(5, TimeUnit.SECONDS)).isTrue();
+            } catch (InterruptedException e) {
+                fail("Unexpected excepetion : " + e.getMessage());
+            }
+        }, DataLoaderThread.TOKEN, 0);
+
+        // Navigate to preview
+        onView(withId(VIEW_SELECTED_BUTTON_ID)).perform(click());
+
+        // Verify that UI shows no selected / deselected button
+        try (ViewPager2IdlingResource idlingResource =
+                     ViewPager2IdlingResource.register(mScenario, PREVIEW_VIEW_PAGER_ID)) {
+            final int previewAddButtonId = R.id.preview_add_button;
+            final int previewSelectButtonId = R.id.preview_selected_check_button;
+            // Verify that, initially, we show "selected" check button
+            onView(withId(previewSelectButtonId)).check(matches(not(isDisplayed())));
+            onView(withId(previewAddButtonId)).check(matches(isDisplayed()));
+            // Verify that the text in Add button matches "Allow (1)"
+            onView(withId(previewAddButtonId)).check(matches(withText("Allow (1)")));
+        }
+
+        // Free DataLoaderThread so that it can load pregranted items
+        latch.countDown();
+        DataLoaderThread.waitForIdle();
+
+        // Verify that UI now shows selected button
+        try (ViewPager2IdlingResource idlingResource =
+                     ViewPager2IdlingResource.register(mScenario, PREVIEW_VIEW_PAGER_ID)) {
+            final int previewAddButtonId = R.id.preview_add_button;
+            final int previewSelectButtonId = R.id.preview_selected_check_button;
+            final String selectedString =
+                    getTargetContext().getResources().getString(R.string.selected);
+            // Verify that, initially, we show "selected" check button
+            onView(withId(previewSelectButtonId)).check(matches(isSelected()));
+            onView(withId(previewSelectButtonId)).check(matches(withText(selectedString)));
+            // Verify that the text in Add button matches "Allow (1)"
+            onView(withId(previewAddButtonId))
+                    .check(matches(withText("Allow (1)")));
+            mScenario.onActivity(activity -> {
+                Selection selection =
+                        new ViewModelProvider(activity).get(PickerViewModel.class).getSelection();
+                assertThat(selection.getSelectedItemCount().getValue()).isEqualTo(1);
+            });
+        }
+    }
+
+    @Test
     public void testUserSelectCorrectHeaderTextIsShown() {
         launchValidActivity();
         onView(withText(R.string.picker_header_permissions)).check(matches(isDisplayed()));
diff --git a/tests/src/com/android/providers/media/photopicker/sync/ImmediateAlbumSyncWorkerTest.java b/tests/src/com/android/providers/media/photopicker/sync/ImmediateAlbumSyncWorkerTest.java
index 6ce4031..aa1f2f4 100644
--- a/tests/src/com/android/providers/media/photopicker/sync/ImmediateAlbumSyncWorkerTest.java
+++ b/tests/src/com/android/providers/media/photopicker/sync/ImmediateAlbumSyncWorkerTest.java
@@ -16,10 +16,13 @@
 
 package com.android.providers.media.photopicker.sync;
 
+import static com.android.providers.media.photopicker.sync.PickerSyncNotificationHelper.NOTIFICATION_CHANNEL_ID;
+import static com.android.providers.media.photopicker.sync.PickerSyncNotificationHelper.NOTIFICATION_ID;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getCloudAlbumSyncInputData;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalAlbumSyncInputData;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalAndCloudAlbumSyncInputData;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalAndCloudSyncInputData;
+import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalAndCloudSyncTestWorkParams;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.initializeTestWorkManager;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -36,6 +39,7 @@
 
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.work.ForegroundInfo;
 import androidx.work.OneTimeWorkRequest;
 import androidx.work.WorkInfo;
 import androidx.work.WorkManager;
@@ -246,4 +250,37 @@
         verify(mMockCloudAlbumSyncTracker, times(/* wantedNumberOfInvocations */ 0))
                 .markSyncCompleted(any());
     }
+
+    @Test
+    public void testImmediateAlbumSyncWorkerOnStopped() {
+        // Setup
+        final ImmediateAlbumSyncWorker immediateAlbumSyncWorker =
+                new ImmediateAlbumSyncWorker(mContext, getLocalAndCloudSyncTestWorkParams());
+
+        // Test onStopped
+        immediateAlbumSyncWorker.onStopped();
+
+        // Verify
+        assertThat(immediateAlbumSyncWorker.getCancellationSignal().isCanceled()).isTrue();
+
+        verify(mMockLocalAlbumSyncTracker, times(/* wantedNumberOfInvocations */ 0))
+                .createSyncFuture(any());
+        verify(mMockLocalAlbumSyncTracker, times(/* wantedNumberOfInvocations */ 1))
+                .markSyncCompleted(any());
+
+        verify(mMockCloudAlbumSyncTracker, times(/* wantedNumberOfInvocations */ 0))
+                .createSyncFuture(any());
+        verify(mMockCloudAlbumSyncTracker, times(/* wantedNumberOfInvocations */ 1))
+                .markSyncCompleted(any());
+    }
+
+    @Test
+    public void testGetForegroundInfo() {
+        final ForegroundInfo foregroundInfo = new ImmediateAlbumSyncWorker(
+                mContext, getLocalAndCloudSyncTestWorkParams()).getForegroundInfo();
+
+        assertThat(foregroundInfo.getNotificationId()).isEqualTo(NOTIFICATION_ID);
+        assertThat(foregroundInfo.getNotification().getChannelId())
+                .isEqualTo(NOTIFICATION_CHANNEL_ID);
+    }
 }
diff --git a/tests/src/com/android/providers/media/photopicker/sync/ImmediateSyncWorkerTest.java b/tests/src/com/android/providers/media/photopicker/sync/ImmediateSyncWorkerTest.java
index b74d9e8..c28e3b2 100644
--- a/tests/src/com/android/providers/media/photopicker/sync/ImmediateSyncWorkerTest.java
+++ b/tests/src/com/android/providers/media/photopicker/sync/ImmediateSyncWorkerTest.java
@@ -16,9 +16,12 @@
 
 package com.android.providers.media.photopicker.sync;
 
+import static com.android.providers.media.photopicker.sync.PickerSyncNotificationHelper.NOTIFICATION_CHANNEL_ID;
+import static com.android.providers.media.photopicker.sync.PickerSyncNotificationHelper.NOTIFICATION_ID;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getCloudSyncInputData;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalAndCloudSyncInputData;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalSyncInputData;
+import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalAndCloudSyncTestWorkParams;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.initializeTestWorkManager;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -34,6 +37,7 @@
 
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.work.ForegroundInfo;
 import androidx.work.OneTimeWorkRequest;
 import androidx.work.WorkInfo;
 import androidx.work.WorkManager;
@@ -208,4 +212,37 @@
         verify(mMockCloudSyncTracker, times(/* wantedNumberOfInvocations */ 1))
                 .markSyncCompleted(any());
     }
+
+    @Test
+    public void testImmediateSyncWorkerOnStopped() {
+        // Setup
+        final ImmediateSyncWorker immediateSyncWorker =
+                new ImmediateSyncWorker(mContext, getLocalAndCloudSyncTestWorkParams());
+
+        // Test onStopped
+        immediateSyncWorker.onStopped();
+
+        // Verify
+        assertThat(immediateSyncWorker.getCancellationSignal().isCanceled()).isTrue();
+
+        verify(mMockLocalSyncTracker, times(/* wantedNumberOfInvocations */ 0))
+                .createSyncFuture(any());
+        verify(mMockLocalSyncTracker, times(/* wantedNumberOfInvocations */ 1))
+                .markSyncCompleted(any());
+
+        verify(mMockCloudSyncTracker, times(/* wantedNumberOfInvocations */ 0))
+                .createSyncFuture(any());
+        verify(mMockCloudSyncTracker, times(/* wantedNumberOfInvocations */ 1))
+                .markSyncCompleted(any());
+    }
+
+    @Test
+    public void testGetForegroundInfo() {
+        final ForegroundInfo foregroundInfo = new ImmediateSyncWorker(
+                mContext, getLocalAndCloudSyncTestWorkParams()).getForegroundInfo();
+
+        assertThat(foregroundInfo.getNotificationId()).isEqualTo(NOTIFICATION_ID);
+        assertThat(foregroundInfo.getNotification().getChannelId())
+                .isEqualTo(NOTIFICATION_CHANNEL_ID);
+    }
 }
diff --git a/tests/src/com/android/providers/media/photopicker/sync/MediaResetWorkerTest.java b/tests/src/com/android/providers/media/photopicker/sync/MediaResetWorkerTest.java
index 617028f..18f89fb 100644
--- a/tests/src/com/android/providers/media/photopicker/sync/MediaResetWorkerTest.java
+++ b/tests/src/com/android/providers/media/photopicker/sync/MediaResetWorkerTest.java
@@ -22,7 +22,10 @@
 import static com.android.providers.media.photopicker.sync.PickerSyncManager.SYNC_WORKER_INPUT_RESET_TYPE;
 import static com.android.providers.media.photopicker.sync.PickerSyncManager.SYNC_WORKER_INPUT_SYNC_SOURCE;
 import static com.android.providers.media.photopicker.sync.PickerSyncManager.SYNC_WORKER_TAG_IS_PERIODIC;
+import static com.android.providers.media.photopicker.sync.PickerSyncNotificationHelper.NOTIFICATION_CHANNEL_ID;
+import static com.android.providers.media.photopicker.sync.PickerSyncNotificationHelper.NOTIFICATION_ID;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getAlbumResetInputData;
+import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalAndCloudSyncTestWorkParams;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.initializeTestWorkManager;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -42,6 +45,7 @@
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.work.Data;
+import androidx.work.ForegroundInfo;
 import androidx.work.OneTimeWorkRequest;
 import androidx.work.WorkInfo;
 import androidx.work.WorkManager;
@@ -361,6 +365,31 @@
         cursor.close();
     }
 
+    @Test
+    public void testMediaResetWorkerOnStopped() {
+        new MediaResetWorker(mContext, getLocalAndCloudSyncTestWorkParams()).onStopped();
+
+        verify(mMockLocalAlbumSyncTracker, times(/* wantedNumberOfInvocations */ 0))
+                .createSyncFuture(any());
+        verify(mMockLocalAlbumSyncTracker, times(/* wantedNumberOfInvocations */ 1))
+                .markSyncCompleted(any());
+
+        verify(mMockCloudAlbumSyncTracker, times(/* wantedNumberOfInvocations */ 0))
+                .createSyncFuture(any());
+        verify(mMockCloudAlbumSyncTracker, times(/* wantedNumberOfInvocations */ 1))
+                .markSyncCompleted(any());
+    }
+
+    @Test
+    public void testGetForegroundInfo() {
+        final ForegroundInfo foregroundInfo = new MediaResetWorker(
+                mContext, getLocalAndCloudSyncTestWorkParams()).getForegroundInfo();
+
+        assertThat(foregroundInfo.getNotificationId()).isEqualTo(NOTIFICATION_ID);
+        assertThat(foregroundInfo.getNotification().getChannelId())
+                .isEqualTo(NOTIFICATION_CHANNEL_ID);
+    }
+
     /**
      * Builds a suitible mock Album media cursor that could be returned from a provider.
      *
diff --git a/tests/src/com/android/providers/media/photopicker/sync/ProactiveSyncWorkerTest.java b/tests/src/com/android/providers/media/photopicker/sync/ProactiveSyncWorkerTest.java
index d253783..5d11b3e 100644
--- a/tests/src/com/android/providers/media/photopicker/sync/ProactiveSyncWorkerTest.java
+++ b/tests/src/com/android/providers/media/photopicker/sync/ProactiveSyncWorkerTest.java
@@ -16,8 +16,11 @@
 
 package com.android.providers.media.photopicker.sync;
 
+import static com.android.providers.media.photopicker.sync.PickerSyncNotificationHelper.NOTIFICATION_CHANNEL_ID;
+import static com.android.providers.media.photopicker.sync.PickerSyncNotificationHelper.NOTIFICATION_ID;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getCloudSyncInputData;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalAndCloudSyncInputData;
+import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalAndCloudSyncTestWorkParams;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.getLocalSyncInputData;
 import static com.android.providers.media.photopicker.sync.SyncWorkerTestUtils.initializeTestWorkManager;
 
@@ -34,6 +37,7 @@
 
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.work.ForegroundInfo;
 import androidx.work.OneTimeWorkRequest;
 import androidx.work.WorkInfo;
 import androidx.work.WorkManager;
@@ -204,4 +208,37 @@
         verify(mMockCloudSyncTracker, times(/* wantedNumberOfInvocations */ 1))
                 .markSyncCompleted(any());
     }
+
+    @Test
+    public void testProactiveSyncWorkerOnStopped() {
+        // Setup
+        final ProactiveSyncWorker proactiveSyncWorker =
+                new ProactiveSyncWorker(mContext, getLocalAndCloudSyncTestWorkParams());
+
+        // Test onStopped
+        proactiveSyncWorker.onStopped();
+
+        // Verify
+        assertThat(proactiveSyncWorker.getCancellationSignal().isCanceled()).isTrue();
+
+        verify(mMockLocalSyncTracker, times(/* wantedNumberOfInvocations */ 0))
+                .createSyncFuture(any());
+        verify(mMockLocalSyncTracker, times(/* wantedNumberOfInvocations */ 1))
+                .markSyncCompleted(any());
+
+        verify(mMockCloudSyncTracker, times(/* wantedNumberOfInvocations */ 0))
+                .createSyncFuture(any());
+        verify(mMockCloudSyncTracker, times(/* wantedNumberOfInvocations */ 1))
+                .markSyncCompleted(any());
+    }
+
+    @Test
+    public void testGetForegroundInfo() {
+        final ForegroundInfo foregroundInfo = new ProactiveSyncWorker(
+                mContext, getLocalAndCloudSyncTestWorkParams()).getForegroundInfo();
+
+        assertThat(foregroundInfo.getNotificationId()).isEqualTo(NOTIFICATION_ID);
+        assertThat(foregroundInfo.getNotification().getChannelId())
+                .isEqualTo(NOTIFICATION_CHANNEL_ID);
+    }
 }
diff --git a/tests/src/com/android/providers/media/photopicker/sync/SyncWorkerTestUtils.java b/tests/src/com/android/providers/media/photopicker/sync/SyncWorkerTestUtils.java
index de621d9..7307c15 100644
--- a/tests/src/com/android/providers/media/photopicker/sync/SyncWorkerTestUtils.java
+++ b/tests/src/com/android/providers/media/photopicker/sync/SyncWorkerTestUtils.java
@@ -25,17 +25,27 @@
 import static com.android.providers.media.photopicker.sync.PickerSyncManager.SYNC_WORKER_INPUT_RESET_TYPE;
 import static com.android.providers.media.photopicker.sync.PickerSyncManager.SYNC_WORKER_INPUT_SYNC_SOURCE;
 
+import static org.mockito.Mockito.mock;
+
 import android.content.Context;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.work.Configuration;
 import androidx.work.Data;
+import androidx.work.ForegroundUpdater;
+import androidx.work.ProgressUpdater;
+import androidx.work.WorkerFactory;
+import androidx.work.WorkerParameters;
+import androidx.work.impl.utils.taskexecutor.TaskExecutor;
 import androidx.work.testing.SynchronousExecutor;
 import androidx.work.testing.WorkManagerTestInitHelper;
 
+import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
+import java.util.UUID;
+import java.util.concurrent.Executor;
 
 public class SyncWorkerTestUtils {
     public static void initializeTestWorkManager(@NonNull Context context) {
@@ -95,4 +105,24 @@
         return new Data(Map.of(SYNC_WORKER_INPUT_SYNC_SOURCE, SYNC_LOCAL_AND_CLOUD,
                 SYNC_WORKER_INPUT_ALBUM_ID, albumId));
     }
+
+    /**
+     * All the values used in the construction of {@link WorkerParameters} here are default
+     * {@link NonNull} values except the {@link Data inputData} which is derived from
+     * {@link SyncWorkerTestUtils#getLocalAndCloudSyncInputData()}.
+     */
+    static WorkerParameters getLocalAndCloudSyncTestWorkParams() {
+        return new WorkerParameters(
+                UUID.randomUUID(),
+                getLocalAndCloudSyncInputData(),
+                /* tags= */ Collections.emptyList(),
+                new WorkerParameters.RuntimeExtras(),
+                /* runAttemptCount= */ 0,
+                /* generation= */ 0,
+                mock(Executor.class),
+                mock(TaskExecutor.class),
+                mock(WorkerFactory.class),
+                mock(ProgressUpdater.class),
+                mock(ForegroundUpdater.class));
+    }
 }
diff --git a/tests/src/com/android/providers/media/photopicker/viewmodel/PickerViewModelTest.java b/tests/src/com/android/providers/media/photopicker/viewmodel/PickerViewModelTest.java
index 4ca8dd9..f9f9351 100644
--- a/tests/src/com/android/providers/media/photopicker/viewmodel/PickerViewModelTest.java
+++ b/tests/src/com/android/providers/media/photopicker/viewmodel/PickerViewModelTest.java
@@ -598,6 +598,53 @@
     }
 
     @Test
+    public void testParseValuesFromPickImagesIntent_launchPickerInPhotosTab() {
+        final Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
+        intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_LAUNCH_TAB, MediaStore.PICK_IMAGES_TAB_IMAGES);
+
+        mPickerViewModel.parseValuesFromIntent(intent);
+
+        assertThat(mPickerViewModel.getPickerLaunchTab()).isEqualTo(
+                MediaStore.PICK_IMAGES_TAB_IMAGES);
+    }
+
+    @Test
+    public void testParseValuesFromPickImagesIntent_launchPickerInAlbumsTab() {
+        final Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
+        intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_LAUNCH_TAB, MediaStore.PICK_IMAGES_TAB_ALBUMS);
+
+        mPickerViewModel.parseValuesFromIntent(intent);
+
+        assertThat(mPickerViewModel.getPickerLaunchTab()).isEqualTo(
+                MediaStore.PICK_IMAGES_TAB_ALBUMS);
+    }
+
+    @Test
+    public void testParseValuesFromPickImagesIntent_launchPickerWithIncorrectTabOption() {
+        final Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
+        intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_LAUNCH_TAB, 2);
+
+        try {
+            mPickerViewModel.parseValuesFromIntent(intent);
+            fail("Incorrect value passed for the picker launch tab option in the intent");
+        } catch (IllegalArgumentException expected) {
+            // Expected
+        }
+    }
+
+    @Test
+    public void testParseValuesFromGetContentIntent_extraPickerLaunchTab() {
+        final Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+        intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_LAUNCH_TAB, MediaStore.PICK_IMAGES_TAB_ALBUMS);
+
+        mPickerViewModel.parseValuesFromIntent(intent);
+
+        // GET_CONTENT doesn't support this option. Launch tab will always default to photos
+        assertThat(mPickerViewModel.getPickerLaunchTab()).isEqualTo(
+                MediaStore.PICK_IMAGES_TAB_IMAGES);
+    }
+
+    @Test
     public void testShouldShowOnlyLocalFeatures() {
         mConfigStore.enableCloudMediaFeature();
 
diff --git a/tests/src/com/android/providers/media/stableuris/job/StableUriIdleMaintenanceServiceTest.java b/tests/src/com/android/providers/media/stableuris/job/StableUriIdleMaintenanceServiceTest.java
index efba7ab..3405ff0 100644
--- a/tests/src/com/android/providers/media/stableuris/job/StableUriIdleMaintenanceServiceTest.java
+++ b/tests/src/com/android/providers/media/stableuris/job/StableUriIdleMaintenanceServiceTest.java
@@ -49,6 +49,7 @@
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -105,13 +106,10 @@
         DeviceConfig.setProperty(ConfigStore.NAMESPACE_MEDIAPROVIDER,
                 ConfigStore.ConfigStoreImpl.KEY_STABILIZE_VOLUME_PUBLIC, Boolean.TRUE.toString(),
                 false);
-
-        createNewPublicVolume();
     }
 
     @AfterClass
     public static void tearDownClass() throws Exception {
-        deletePublicVolumes();
 
         // Restore previous value of the flag
         DeviceConfig.setProperty(ConfigStore.NAMESPACE_MEDIAPROVIDER,
@@ -213,59 +211,67 @@
     }
 
     @Test
+    @Ignore
     public void testDataMigrationForPublicVolume() throws Exception {
-        final Context context = InstrumentationRegistry.getTargetContext();
-        final ContentResolver resolver = context.getContentResolver();
-        final Set<String> volNames = MediaStore.getExternalVolumeNames(context);
+        createNewPublicVolume();
+        try {
+            final Context context = InstrumentationRegistry.getTargetContext();
+            final ContentResolver resolver = context.getContentResolver();
+            final Set<String> volNames = MediaStore.getExternalVolumeNames(context);
 
-        for (String volName : volNames) {
-            if (!MediaStore.VOLUME_EXTERNAL_PRIMARY.equalsIgnoreCase(volName)
-                    && !MediaStore.VOLUME_INTERNAL.equalsIgnoreCase(volName)) {
-                // public volume
-                Set<String> newFilePaths = new HashSet<String>();
-                Map<String, Long> pathToIdMap = new HashMap<>();
-                MediaStore.waitForIdle(resolver);
+            for (String volName : volNames) {
+                if (!MediaStore.VOLUME_EXTERNAL_PRIMARY.equalsIgnoreCase(volName)
+                        && !MediaStore.VOLUME_INTERNAL.equalsIgnoreCase(volName)) {
+                    // public volume
+                    Set<String> newFilePaths = new HashSet<String>();
+                    Map<String, Long> pathToIdMap = new HashMap<>();
+                    MediaStore.waitForIdle(resolver);
 
-                try {
-                    for (int i = 0; i < 10; i++) {
-                        File volPath = getVolumePath(context, volName);
-                        final File dir = new File(volPath.getAbsoluteFile() + "/Download");
-                        final File file = new File(dir, System.nanoTime() + ".png");
+                    try {
+                        for (int i = 0; i < 10; i++) {
+                            File volPath = getVolumePath(context, volName);
+                            final File dir = new File(volPath.getAbsoluteFile() + "/Download");
+                            final File file = new File(dir, System.nanoTime() + ".png");
 
-                        // Write 1 byte because 0 byte files are not valid in the db
-                        try (FileOutputStream fos = new FileOutputStream(file)) {
-                            fos.write(1);
+                            // Write 1 byte because 0 byte files are not valid in the db
+                            try (FileOutputStream fos = new FileOutputStream(file)) {
+                                fos.write(1);
+                            }
+
+                            Uri uri = MediaStore.scanFile(resolver, file);
+                            long id = ContentUris.parseId(uri);
+                            newFilePaths.add(file.getAbsolutePath());
+                            pathToIdMap.put(file.getAbsolutePath(), id);
                         }
 
-                        Uri uri = MediaStore.scanFile(resolver, file);
-                        long id = ContentUris.parseId(uri);
-                        newFilePaths.add(file.getAbsolutePath());
-                        pathToIdMap.put(file.getAbsolutePath(), id);
-                    }
+                        assertFalse(newFilePaths.isEmpty());
+                        MediaStore.waitForIdle(resolver);
+                        // Creates backup
+                        MediaStore.runIdleMaintenanceForStableUris(resolver);
 
-                    assertFalse(newFilePaths.isEmpty());
-                    MediaStore.waitForIdle(resolver);
-                    // Creates backup
-                    MediaStore.runIdleMaintenanceForStableUris(resolver);
-
-                    verifyLevelDbPresence(resolver, PUBLIC_VOLUME_BACKUP_NAME + volName);
-                    verifyLevelDbPresence(resolver, OWNERSHIP_BACKUP_NAME);
-                    // Verify that all internal files are backed up
-                    for (String filePath : newFilePaths) {
-                        BackupIdRow backupIdRow = BackupIdRow.deserialize(
-                                MediaStore.readBackup(resolver, volName, filePath));
-                        assertNotNull(backupIdRow);
-                        assertEquals(pathToIdMap.get(filePath).longValue(), backupIdRow.getId());
-                        assertEquals(UserHandle.myUserId(), backupIdRow.getUserId());
-                        assertEquals(context.getPackageName(),
-                                MediaStore.getOwnerPackageName(resolver, backupIdRow.getOwnerPackageId()));
-                    }
-                } finally {
-                    for (String path : newFilePaths) {
-                        new File(path).delete();
+                        verifyLevelDbPresence(resolver, PUBLIC_VOLUME_BACKUP_NAME + volName);
+                        verifyLevelDbPresence(resolver, OWNERSHIP_BACKUP_NAME);
+                        // Verify that all internal files are backed up
+                        for (String filePath : newFilePaths) {
+                            BackupIdRow backupIdRow = BackupIdRow.deserialize(
+                                    MediaStore.readBackup(resolver, volName, filePath));
+                            assertNotNull(backupIdRow);
+                            assertEquals(pathToIdMap.get(filePath).longValue(),
+                                    backupIdRow.getId());
+                            assertEquals(UserHandle.myUserId(), backupIdRow.getUserId());
+                            assertEquals(context.getPackageName(),
+                                    MediaStore.getOwnerPackageName(resolver,
+                                            backupIdRow.getOwnerPackageId()));
+                        }
+                    } finally {
+                        for (String path : newFilePaths) {
+                            new File(path).delete();
+                        }
                     }
                 }
             }
+        } finally {
+            deletePublicVolumes();
         }
     }
 
diff --git a/tests/src/com/android/providers/media/util/IsoInterfaceTest.java b/tests/src/com/android/providers/media/util/IsoInterfaceTest.java
index 37dd48f..a105bbd 100644
--- a/tests/src/com/android/providers/media/util/IsoInterfaceTest.java
+++ b/tests/src/com/android/providers/media/util/IsoInterfaceTest.java
@@ -18,6 +18,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 
 import android.content.Context;
@@ -27,11 +28,14 @@
 
 import com.android.providers.media.R;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
@@ -97,6 +101,18 @@
         assertEquals("3F9DD7A46B26513A7C35272F0D623A06", xmp.getOriginalDocumentId());
     }
 
+
+    @Test
+    @Ignore // This test creates a file that causes MediaProvider to OOM with our current
+    // IsoInterface implementation.
+    // While MediaProvider should now be resistant to that, we cannot leave this test safely enabled
+    // in a test suite as for b/316578793
+    // Leaving its implementation here to test further improvement to IsoInterface implementation.
+    public void testFileWithTooManyBoxesDoesNotRunOutOfMemory() throws Exception {
+        final File file = createFileWithLotsOfBoxes("too-many-boxes");
+        assertThrows(IOException.class, () -> IsoInterface.fromFile(file));
+    }
+
     @Test
     public void testIsoMeta() throws Exception {
         final IsoInterface isoMeta = IsoInterface.fromFile(stageFile(R.raw.test_video_xmp));
@@ -128,4 +144,19 @@
         }
         return file;
     }
+
+    private static File createFileWithLotsOfBoxes(String filename) throws Exception {
+        File file = File.createTempFile(filename, ".mp4");
+        try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))) {
+            byte[] sizeHeader = new byte[]{0x00, 0x00, 0x00, 0x08};
+            out.write(sizeHeader);
+            out.write("ftyp".getBytes());
+            byte[] freeBlock = "free".getBytes();
+            for (int i = 0; i < 5000000; i++) {
+                out.write(sizeHeader);
+                out.write(freeBlock);
+            }
+        }
+        return file;
+    }
 }
diff --git a/tests/src/com/android/providers/media/util/SyntheticPathUtilsTest.java b/tests/src/com/android/providers/media/util/SyntheticPathUtilsTest.java
index b913114..0c8c5df 100644
--- a/tests/src/com/android/providers/media/util/SyntheticPathUtilsTest.java
+++ b/tests/src/com/android/providers/media/util/SyntheticPathUtilsTest.java
@@ -23,9 +23,13 @@
 import static com.android.providers.media.util.SyntheticPathUtils.isPickerPath;
 import static com.android.providers.media.util.SyntheticPathUtils.isRedactedPath;
 import static com.android.providers.media.util.SyntheticPathUtils.isSyntheticPath;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import androidx.test.runner.AndroidJUnit4;
+
+import com.android.providers.media.PickerUriResolver;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -46,7 +50,10 @@
 
     @Test
     public void testGetPickerRelativePath() throws Exception {
-        assertThat(getPickerRelativePath()).isEqualTo(".transforms/synthetic/picker");
+        assertThat(getPickerRelativePath(PickerUriResolver.PICKER_SEGMENT)).isEqualTo(
+                ".transforms/synthetic/picker");
+        assertThat(getPickerRelativePath(PickerUriResolver.PICKER_GET_CONTENT_SEGMENT)).isEqualTo(
+                ".transforms/synthetic/picker_get_content");
     }
 
     @Test
diff --git a/tools/photopicker/res/layout/activity_main.xml b/tools/photopicker/res/layout/activity_main.xml
index 6348a4e..d5db47d 100644
--- a/tools/photopicker/res/layout/activity_main.xml
+++ b/tools/photopicker/res/layout/activity_main.xml
@@ -100,6 +100,7 @@
             android:textSize="16sp" />
     </LinearLayout>
 
+
     <CheckBox
         android:id="@+id/cbx_ordered_selection"
         android:layout_width="wrap_content"
@@ -107,6 +108,37 @@
         android:text="ORDERED SELECTION"
         android:textSize="16sp" />
 
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <CheckBox
+            android:id="@+id/cbx_set_picker_launch_tab"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/picker_launch_tab_option"
+            android:textSize="16sp" />
+
+        <RadioGroup
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+            <RadioButton android:id="@+id/rb_albums"
+                         android:layout_width="wrap_content"
+                         android:layout_height="wrap_content"
+                         android:text="Albums"
+                         android:enabled="false"/>
+            <RadioButton android:id="@+id/rb_photos"
+                         android:layout_width="wrap_content"
+                         android:layout_height="wrap_content"
+                         android:text="Photos"
+                         android:enabled="false"/>
+        </RadioGroup>
+
+    </LinearLayout>
+
+
     <Button
         android:id="@+id/launch_button"
         android:layout_width="match_parent"
diff --git a/tools/photopicker/res/values/strings.xml b/tools/photopicker/res/values/strings.xml
new file mode 100644
index 0000000..b6b6131
--- /dev/null
+++ b/tools/photopicker/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<resources>
+    <!-- Picker launch tab checkbox label -->
+    <string name="picker_launch_tab_option">SET PICKER LAUNCH TAB</string>
+</resources>
\ No newline at end of file
diff --git a/tools/photopicker/src/com/android/providers/media/tools/photopicker/PhotoPickerToolActivity.java b/tools/photopicker/src/com/android/providers/media/tools/photopicker/PhotoPickerToolActivity.java
index 1d549f3..98e58c0 100644
--- a/tools/photopicker/src/com/android/providers/media/tools/photopicker/PhotoPickerToolActivity.java
+++ b/tools/photopicker/src/com/android/providers/media/tools/photopicker/PhotoPickerToolActivity.java
@@ -34,6 +34,7 @@
 import android.widget.EditText;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
+import android.widget.RadioButton;
 import android.widget.ScrollView;
 import android.widget.TextView;
 import android.widget.VideoView;
@@ -48,6 +49,8 @@
     private static final String TAG = "PhotoPickerToolActivity";
     private static final String EXTRA_PICK_IMAGES_MAX = "android.provider.extra.PICK_IMAGES_MAX";
     private static final String ACTION_PICK_IMAGES = "android.provider.action.PICK_IMAGES";
+    private static final String EXTRA_PICK_IMAGES_LAUNCH_TAB =
+            "android.provider.extra.PICK_IMAGES_LAUNCH_TAB";
     private static final int PICK_IMAGES_MAX_LIMIT = 100;
     private static final int REQUEST_CODE = 42;
 
@@ -63,10 +66,17 @@
     private CheckBox mSetSelectionCountCheckBox;
     private CheckBox mAllowMultipleCheckBox;
     private CheckBox mGetContentCheckBox;
+
     private CheckBox mOrderedSelectionCheckBox;
+
+    private CheckBox mPickerLaunchTabCheckBox;
+
     private EditText mMaxCountText;
     private EditText mMimeTypeText;
 
+    private RadioButton mAlbumsRadioButton;
+    private RadioButton mPhotosRadioButton;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -82,12 +92,17 @@
         mMaxCountText = findViewById(R.id.edittext_max_count);
         mMimeTypeText = findViewById(R.id.edittext_mime_type);
         mScrollView = findViewById(R.id.scrollview);
+        mPickerLaunchTabCheckBox = findViewById(R.id.cbx_set_picker_launch_tab);
+        mAlbumsRadioButton = findViewById(R.id.rb_albums);
+        mPhotosRadioButton = findViewById(R.id.rb_photos);
 
         mSetImageOnlyCheckBox.setOnCheckedChangeListener(this::onShowImageOnlyCheckedChanged);
         mSetVideoOnlyCheckBox.setOnCheckedChangeListener(this::onShowVideoOnlyCheckedChanged);
         mSetMimeTypeCheckBox.setOnCheckedChangeListener(this::onSetMimeTypeCheckedChanged);
         mSetSelectionCountCheckBox.setOnCheckedChangeListener(
                 this::onSetSelectionCountCheckedChanged);
+        mPickerLaunchTabCheckBox.setOnCheckedChangeListener(
+                this::onSetPickerLaunchTabCheckedChanged);
 
         mMaxCountText.addTextChangedListener(new TextWatcher() {
             @Override
@@ -157,6 +172,11 @@
         mMaxCountText.setEnabled(isChecked);
     }
 
+    private void onSetPickerLaunchTabCheckedChanged(View view, boolean isChecked) {
+        mAlbumsRadioButton.setEnabled(isChecked);
+        mPhotosRadioButton.setEnabled(isChecked);
+    }
+
     private void onLaunchButtonClicked(View view) {
         final Intent intent;
         if (mGetContentCheckBox.isChecked()) {
@@ -164,6 +184,16 @@
             intent.setType("*/*");
         } else {
             intent = new Intent(ACTION_PICK_IMAGES);
+            // This extra is not permitted in GET_CONTENT
+            if (mPickerLaunchTabCheckBox.isChecked()) {
+                int launchTab;
+                if (mAlbumsRadioButton.isChecked()) {
+                    launchTab = 0;
+                } else {
+                    launchTab = 1;
+                }
+                intent.putExtra(EXTRA_PICK_IMAGES_LAUNCH_TAB, launchTab);
+            }
         }
 
         if (mAllowMultipleCheckBox.isChecked()) {