Merge "Create new view for audio_artists_albums" into sc-dev
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 64830a3..87582bb 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -46,6 +46,14 @@
     "postsubmit": [
         {
             "name": "MediaProviderClientTests"
+        },
+        {
+            "name": "CtsAppSecurityHostTestCases",
+            "options": [
+                {
+                    "include-filter": "android.appsecurity.cts.ExternalStorageHostTest"
+                }
+            ]
         }
     ]
 }
diff --git a/apex/framework/java/android/provider/MediaStore.java b/apex/framework/java/android/provider/MediaStore.java
index 13ad86a..2a17e34 100644
--- a/apex/framework/java/android/provider/MediaStore.java
+++ b/apex/framework/java/android/provider/MediaStore.java
@@ -928,10 +928,19 @@
             @NonNull ParcelFileDescriptor fileDescriptor) throws IOException {
         Bundle input = new Bundle();
         input.putParcelable(EXTRA_FILE_DESCRIPTOR, fileDescriptor);
+        ParcelFileDescriptor pfd;
+        try {
+            Bundle output = context.getContentResolver().call(AUTHORITY,
+                    GET_ORIGINAL_MEDIA_FORMAT_FILE_DESCRIPTOR_CALL, null, input);
+            pfd = output.getParcelable(EXTRA_FILE_DESCRIPTOR);
+        } catch (Exception e) {
+            throw new IOException(e);
+        }
 
-        Bundle output = context.getContentResolver().call(AUTHORITY,
-                GET_ORIGINAL_MEDIA_FORMAT_FILE_DESCRIPTOR_CALL, null, input);
-        return output.getParcelable(EXTRA_FILE_DESCRIPTOR);
+        if (pfd == null) {
+            throw new IOException("Input file descriptor already original");
+        }
+        return pfd;
     }
 
     /**
diff --git a/jni/FuseDaemon.cpp b/jni/FuseDaemon.cpp
index 4f29271..a482e01 100755
--- a/jni/FuseDaemon.cpp
+++ b/jni/FuseDaemon.cpp
@@ -645,6 +645,13 @@
         if (pkg == ".nomedia") {
             return true;
         }
+        if (android::base::StartsWith(path, "/storage/emulated")) {
+            // Emulated storage bind-mounts app-private data directories, and so these
+            // should not be accessible through FUSE anyway.
+            LOG(WARNING) << "Rejected access to app-private dir on FUSE: " << path
+                         << " from uid: " << uid;
+            return false;
+        }
         if (!mp->isUidAllowedAccessToDataOrObbPath(uid, path)) {
             PLOG(WARNING) << "Invalid other package file access from " << uid << "(: " << path;
             return false;
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 5a69e62..fb69fe1 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other"><xliff:g id="COUNT">^1</xliff:g> ንጥሎችን በመሰረዝ ላይ…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> የሚዲያ ፋይሎችን ማሄድ አይችልም"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"ሚዲያን ማሰናዳት ተሰርዟል"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"ሚዲያን የማሰናዳት ስህተት"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"ሚዲያን የማሰናዳት ስኬት"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"ሚዲያን ማሰናዳት ተጀምሯል"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"ሚዲያን በማሰናዳት ላይ…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"ይቅር"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"ጠብቅ"</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index f6d3f9a..9fef177 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -308,18 +308,11 @@
       <item quantity="one">جارٍ حذف عنصر واحد…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"يتعذّر على التطبيق <xliff:g id="APP_NAME">%s</xliff:g> معالجة ملفات الوسائط."</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"تم إلغاء معالجة الوسائط."</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"حدث خطأ أثناء معالجة الوسائط."</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"تمت عملية معالجة الوسائط."</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"بدأت عملية معالجة الوسائط."</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"جارٍ معالجة الوسائط…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"إلغاء"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"الانتظار"</string>
 </resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 87ba5cf..fbb3a35 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other"><xliff:g id="COUNT">^1</xliff:g> টা বস্তু মচি থকা হৈছে…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g>এ মিডিয়া ফাইলৰ প্ৰক্ৰিয়াকৰণ কৰিব নোৱাৰে"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"মিডিয়াৰ প্ৰক্ৰিয়াকৰণ বাতিল কৰা হৈছে"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"মিডিয়াৰ প্ৰক্ৰিয়াকৰণত আসোঁৱাহ হৈছে"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"মিডিয়াৰ প্ৰক্ৰিয়াকৰণ সফল হৈছে"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"মিডিয়াৰ প্ৰক্ৰিয়াকৰণ আৰম্ভ হৈছে"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"মিডিয়াৰ প্ৰক্ৰিয়াকৰণ কৰি থকা হৈছে…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"বাতিল কৰক"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"অপেক্ষা কৰক"</string>
 </resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index fbfc179..785ada1 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Element silinir…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> media fayllarını emal edə bilmir"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Media emalı ləğv edilib"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Media emalı zamanı xəta oldu"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Media emalı uğurlu oldu"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Media emalı başladılıb"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Media emal edilir…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Ləğv edin"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Gözləyin"</string>
 </resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 7b7d874..a4a20c8 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -206,18 +206,11 @@
       <item quantity="other">Briše se <xliff:g id="COUNT">^1</xliff:g> stavki…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ne može da obradi medijske fajlove"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Obrada medija je otkazana"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Greška pri obradi medija"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Obrada medija je uspela"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Obrada medija je započela"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Obrađuju se mediji…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Otkaži"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Sačekaj"</string>
 </resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 599151e..18c1dcc 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -240,18 +240,11 @@
       <item quantity="other">Выдаляюцца <xliff:g id="COUNT">^1</xliff:g> элемента…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Праграме \"<xliff:g id="APP_NAME">%s</xliff:g>\" не ўдалося апрацаваць файлы мультымедыя"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Апрацоўка мультымедыя скасавана"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Памылка апрацоўкі мультымедыя"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Апрацоўка мультымедыя завершана"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Пачалася апрацоўка мультымедыя"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Ідзе апрацоўка мультымедыя…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Скасаваць"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Пачакаць"</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index f703ee6..878ad13 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Елементът се изтрива…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> не може да обработва мултимедийни файлове"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Обработването на мултимедията е анулирано"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Грешка при обработването на мултимедията"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Обработването на мултимедията бе успешно"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Обработването на мултимедията стартира"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Мултимедията се обработва…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Отказ"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Изчакване"</string>
 </resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index b6ff938..06b23e7 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other"><xliff:g id="COUNT">^1</xliff:g>টি আইটেম মুছে ফেলা হচ্ছে…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> মিডিয়া ফাইল প্রসেস করতে পারবে না"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"মিডিয়া ফাইল প্রসেস করা বাতিল হয়ে গেছে"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"মিডিয়া ফাইল প্রসেস করার সময়ে সমস্যা হচ্ছে"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"মিডিয়া ফাইল প্রসেস করা হয়ে গেছে"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"মিডিয়া ফাইল প্রসেস করা শুরু হয়ে গেছে"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"মিডিয়া ফাইল প্রসেস করা হচ্ছে…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"বাতিল করুন"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"অপেক্ষা করুন"</string>
 </resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index a65aee4..791b3a4 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -206,18 +206,11 @@
       <item quantity="other">Brisanje <xliff:g id="COUNT">^1</xliff:g> stavki…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ne može obrađivati medijske fajlove"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Obrada medijskih fajlova je otkazana"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Greška prilikom obrade medijskih fajlova"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Obrada medijskih fajlova je uspjela"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Obrada medijskih fajlova je započeta"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Obrada medijskih fajlova…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Otkaži"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Sačekaj"</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 6c02cb7..9341998 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">S\'està suprimint l\'element…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> no pot processar els fitxers multimèdia"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"El processament del contingut multimèdia s\'ha cancel·lat"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"S\'ha produït un error en processar el contingut multimèdia"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"El contingut multimèdia s\'ha processat correctament"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"El processament del contingut multimèdia s\'ha iniciat"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"S\'està processant el contingut multimèdia…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Cancel·la"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Espera"</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 1f98546..eab7293 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -240,18 +240,11 @@
       <item quantity="one">Mazání položky…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Aplikace <xliff:g id="APP_NAME">%s</xliff:g> nedokáže zpracovat mediální soubory"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Zpracování mediálního obsahu bylo zrušeno"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Při zpracování mediálního obsahu došlo k chybě"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Zpracování mediálního obsahu bylo úspěšně dokončeno"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Zpracování mediálního obsahu bylo zahájeno"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Mediální obsah se zpracovává…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Zrušit"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Počkat"</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 1132bd3..e5bba25 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other">Sletter <xliff:g id="COUNT">^1</xliff:g> elementer…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> kan ikke behandle mediefiler"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Mediebehandlingen er annulleret"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Mediebehandlingsfejl"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Mediebehandlingen er fuldført"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Mediebehandlingen er startet"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Behandler medier…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Annuller"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Vent"</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 175ab92..6a0001a 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Element wird gelöscht…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Die App „<xliff:g id="APP_NAME">%s</xliff:g>“ kann Mediendateien nicht verarbeiten"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Medienverarbeitung abgebrochen"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Fehler bei Medienverarbeitung"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Medienverarbeitung erfolgreich"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Medienverarbeitung gestartet"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Medien werden verarbeitet…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Abbrechen"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Warten"</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index fc22c90..e50e8f8 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Διαγραφή στοιχείου…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Η εφαρμογή <xliff:g id="APP_NAME">%s</xliff:g> δεν έχει δυνατότητα επεξεργασία αρχείων μέσων"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Η επεξεργασία μέσων ακυρώθηκε"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Σφάλμα επεξεργασίας μέσων"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Η επεξεργασία μέσων ολοκληρώθηκε επιτυχώς"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Η επεξεργασία μέσων ξεκίνησε"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Επεξεργασία μέσων…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Ακύρωση"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Αναμονή"</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index b959a09..89b404f 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Eliminando elemento…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> no puede procesar archivos multimedia"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Procesamiento de elementos multimedia cancelado"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"No se han podido procesar elementos multimedia"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Elementos multimedia procesados"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Procesamiento de elementos multimedia iniciado"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Procesando elementos multimedia…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Cancelar"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Espera"</string>
 </resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index c6f1232..27a526a 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Üksuse kustutamine …</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ei saa meediafaile töödelda"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Meedia töötlemine tühistati"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Viga meedia töötlemisel"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Meedia töötlemine õnnestus"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Alustati meedia töötlemist"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Meedia töötlemine …"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Tühista"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Oota"</string>
 </resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 940b112..1c14882 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Elementua ezabatzen…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> aplikazioak ezin ditu prozesatu multimedia-fitxategiak"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Bertan behera utzi da multimedia-edukiaren prozesamendua"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Errore bat gertatu da multimedia-edukia prozesatzean"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Prozesatu da multimedia-edukia"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Hasi da multimedia-edukiaren prozesamendua"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Multimedia-edukia prozesatzen…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Utzi"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Itxaron"</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 0e365b8..9e65ae7 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Poistetaan kohdetta…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ei voi käsitellä mediatiedostoja"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Mediasisällön käsittely peruttiin"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Virhe mediasisällön käsittelyssä"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Mediasisällön käsittely onnistui"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Mediasisällön käsittely alkoi"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Käsitellään mediasisältöä…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Peru"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Odota"</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 208ae09..de7245c 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other">Suppression de <xliff:g id="COUNT">^1</xliff:g> éléments en cours…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ne peut pas traiter les fichiers multimédias"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Le traitement du contenu multimédia a été annulé"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Une erreur s\'est produite durant le traitement du contenu multimédia"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Le traitement du contenu multimédia a réussi"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Le traitement du contenu multimédia a démarré"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Traitement du contenu multimédia en cours…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Annuler"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Patienter"</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index eb209d2..c995739 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other">Suppression de <xliff:g id="COUNT">^1</xliff:g> éléments…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ne peut pas traiter les fichiers multimédias"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Traitement des contenus multimédias annulé"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Erreur de traitement des contenus multimédias"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Le traitement des contenus multimédias a réussi"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Le traitement des contenus multimédias a commencé"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Traitement des contenus multimédias…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Annuler"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Attendre"</string>
 </resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index afe59c2..aa53246 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Eliminando 1 elemento…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> non pode procesar ficheiros multimedia"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Cancelouse o procesamento do contido multimedia"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Produciuse un erro no procesamento do contido multimedia"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Realizouse correctamente o procesamento do contido multimedia"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Iniciouse o procesamento do contido multimedia"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Procesando contido multimedia…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Cancelar"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Esperar"</string>
 </resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index b0ea764..3cffaf6 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other"><xliff:g id="COUNT">^1</xliff:g> આઇટમ ડિલીટ કરી રહ્યાં છીએ…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> મીડિયા ફાઇલો પર પ્રક્રિયા કરી શકતું નથી"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"મીડિયા પર થતી પ્રક્રિયા રદ કરવામાં આવી"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"મીડિયા પર થતી પ્રક્રિયામાં ભૂલ આવી"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"મીડિયા પર પ્રક્રિયા કરવાનું સફળ થયું"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"મીડિયા પર પ્રક્રિયા શરૂ કરવામાં આવી"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"મીડિયા પર પ્રક્રિયા થઈ રહી છે…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"રદ કરો"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"રાહ જુઓ"</string>
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index bcf93c6..5881984 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other"><xliff:g id="COUNT">^1</xliff:g> आइटम मिटाए जा रहे हैं…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> मीडिया फ़ाइलों को प्रोसेस नहीं कर सकता"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"मीडिया को प्रोसेस करने की कार्रवाई रद्द की गई"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"मीडिया को प्रोसेस करने में गड़बड़ी हुई"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"मीडिया को प्रोसेस कर लिया गया"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"मीडिया को प्रोसेस करना शुरू किया गया"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"मीडिया को प्रोसेस किया जा रहा है…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"अभी नहीं"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"इंतज़ार करें"</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 7a48bb1..776b290 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -206,18 +206,11 @@
       <item quantity="other">Brisanje <xliff:g id="COUNT">^1</xliff:g> stavki…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Aplikacija <xliff:g id="APP_NAME">%s</xliff:g> ne može obraditi medijske datoteke"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Obrada medijskih sadržaja otkazana"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Pogreška prilikom obrade medijskih sadržaja"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Obrada medijskih sadržaja uspješno je dovršena"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Započela je obrada medijskih sadržaja"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Obrada medijskih sadržaja…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Odustani"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Pričekaj"</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index efb9cce..e3ea512 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Az elem törlése folyamatban van…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"A(z) <xliff:g id="APP_NAME">%s</xliff:g> nem tudja feldolgozni a médiafájlokat"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Mediatartalom feldolgozása megszakítva"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Médiatartalom-feldolgozási hiba"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Médiatartalom feldolgozása sikeres"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Médiatartalom feldolgozása megkezdődött"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Médiatartalom feldolgozása…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Mégse"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Várakozás"</string>
 </resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index e497318..095e238 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other"><xliff:g id="COUNT">^1</xliff:g> տարր ջնջվում է…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> հավելվածը չի կարող մեդիաֆայլեր մշակել"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Մեդիաֆայլի մշակումը չեղարկվել է"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Մեդիաֆայլի մշակման սխալ"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Մեդիաֆայլի մշակումն ավարտված է"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Մեդիաֆայլի մշակումը սկսված է"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Մեդիաֆայլը մշակվում է…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Չեղարկել"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Սպասել"</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index d4b25bb..3987c55 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Menghapus item …</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> tidak dapat memproses file media"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Pemrosesan media dibatalkan"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Pemrosesan media mengalami error"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Pemrosesan media berhasil"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Pemrosesan media dimulai"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Memproses media…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Batal"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Tunggu"</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 532c9a1..4552372 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -240,18 +240,11 @@
       <item quantity="one">מתבצעת מחיקה של פריט אחד…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"האפליקציה <xliff:g id="APP_NAME">%s</xliff:g> לא יכולה לעבד קובצי מדיה"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"עיבוד המדיה בוטל"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"שגיאה בעיבוד המדיה"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"עיבוד המדיה הסתיים בהצלחה"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"עיבוד המדיה החל"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"המדיה בעיבוד…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"ביטול"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"המתנה"</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 58abfbf..58cc9b0 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">アイテムを削除しています…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g>はメディア ファイルを処理できません"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"メディアの処理をキャンセルしました"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"メディア処理エラー"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"メディアの処理が終わりました"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"メディアの処理を開始しました"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"メディアを処理しています…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"キャンセル"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"待機"</string>
 </resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 69d34ce..f6a9252 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Элемент жойылуда…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> қолданбасы медиа файлдарды өңдей алмайды."</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Медиафайлды өңдеу тоқтатылды."</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Медиафайлды өңдеуде қате пайда болды."</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Медиафайл сәтті өңделді."</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Медиафайлды өңдеу басталды."</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Медиафайл өңделуде…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Бас тарту"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Күту"</string>
 </resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index a8463c7..d7662d6 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">កំពុងលុប​ធាតុ…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> មិនអាច​ដំណើរការ​ឯកសារមេឌៀ​បានទេ"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"បានបោះបង់​ការដំណើរការ​មេឌៀ"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"មានបញ្ហា​ក្នុងការដំណើរការ​មេឌៀ"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"ការដំណើរការមេឌៀជោគជ័យហើយ"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"បានចាប់ផ្ដើម​ការដំណើរការមេឌៀ"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"កំពុងដំណើរការមេឌៀ…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"បោះបង់"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"រង់ចាំ"</string>
 </resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index cd9fdfb..ca1da24 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other"><xliff:g id="COUNT">^1</xliff:g> ಐಟಂಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ಮಾಧ್ಯಮ ಫೈಲ್‌ಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"ಮಾಧ್ಯಮ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವಿಕೆ ರದ್ದುಗೊಂಡಿದೆ"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"ಮಾಧ್ಯಮ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವಿಕೆ ದೋಷ"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"ಮಾಧ್ಯಮ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"ಮಾಧ್ಯಮ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವಿಕೆ ಪ್ರಾರಂಭವಾಗಿದೆ"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿರುವ ಮಾಧ್ಯಮ…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"ರದ್ದುಮಾಡಿ"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"ನಿರೀಕ್ಷಿಸಿ"</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 9eb246e..afb14cc 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">항목 삭제 중…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g>에서 미디어 파일을 처리할 수 없습니다"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"미디어 처리 취소됨"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"미디어 처리 오류"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"미디어 처리 성공"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"미디어 처리 시작됨"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"미디어 처리 중…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"취소"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"대기"</string>
 </resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 8136fe1..f6b244b 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Элемент жок кылынууда…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> медиа файлдарды иштете албайт"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Медианы иштетүү жокко чыгарылды"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Медианы иштетүү катасы"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Медиа ийгиликтүү иштетилди"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Медиа иштетилип баштады"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Медиа иштетилүүдө…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Жокко чыгаруу"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Күтүү"</string>
 </resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 19a5935..c21aec4 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">ກຳລັງລຶບລາຍການອອກ…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ບໍ່ສາມາດປະມວນຜົນໄຟລ໌ມີເດຍໄດ້"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"ຍົກເລີກການປະມວນຜົນມີເດຍແລ້ວ"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"ການປະມວນຜົນມີເດຍຜິດພາດ"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"ການປະມວນຜົນມີເດຍສຳເລັດແລ້ວ"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"ເລີ່ມການປະມວນຜົນມີເດຍແລ້ວ"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"ກຳລັງປະມວນຜົນມີເດຍ…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"ຍົກເລີກ"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"ລໍຖ້າ"</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 403860f..c4f30d9 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -240,18 +240,11 @@
       <item quantity="other">Ištrinama <xliff:g id="COUNT">^1</xliff:g> elementų…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Programa „<xliff:g id="APP_NAME">%s</xliff:g>“ negali apdoroti medijos failų"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Medija apdorojimas atšauktas"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Medija apdorojimo klaida"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Medija apdorojimas sėkmingas"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Pradedama apdoroti mediją"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Medija apdorojama…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Atšaukti"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Palaukti"</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 13f1a97..fbd2cba 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -206,18 +206,11 @@
       <item quantity="other">Notiek <xliff:g id="COUNT">^1</xliff:g> vienumu dzēšana…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> nevar apstrādāt multivides failus"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Multivides apstrāde ir atcelta."</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Radās multivides apstrādes kļūda."</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Multivides apstrāde bija sekmīga."</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Tika sākta multivides apstrāde."</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Notiek multivides apstrāde…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Atcelt"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Gaidīt"</string>
 </resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index e40c61e..ca450f7 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other">Се бришат <xliff:g id="COUNT">^1</xliff:g> ставки…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> не може да обработува датотеки со аудиовизуелни содржини"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Транскодирањето е откажано"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Грешка при транскодирање"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Транскодирањето е успешно"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Транскодирањето започна"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Се транскодира…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Откажи"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Почекајте"</string>
 </resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 94659ea..a11ddef 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">ഇനം ഇല്ലാതാക്കുന്നു…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> എന്നതിന് മീഡിയ ഫയലുകൾ പ്രോസസ് ചെയ്യാനാകില്ല"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"മീഡിയ പ്രോസസ് ചെയ്യൽ റദ്ദാക്കി"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"മീഡിയ പ്രോസസ് ചെയ്യുന്നതിൽ പിശക്"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"മീഡിയ പ്രോസസ് ചെയ്യൽ പൂർത്തിയായി"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"മീഡിയ പ്രോസസ് ചെയ്യൽ ആരംഭിച്ചു"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"മീഡിയ പ്രോസസ് ചെയ്യുന്നു…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"റദ്ദാക്കുക"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"കാത്തിരിക്കുക"</string>
 </resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index b1b10c6..3b791d8 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Зүйлийг устгаж байна…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> медиа файлуудыг боловсруулах боломжгүй"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Медиагийн боловсруулалтыг цуцалсан"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Медиаг боловсруулахад алдаа гарлаа"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Медиаг амжилттай боловсруулсан"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Медиаг боловсруулж эхэлсэн"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Медиаг боловсруулж байна…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Цуцлах"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Хүлээх"</string>
 </resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index ecba1ac..98bef88 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">आयटम हटवत आहे…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> मीडिया फाइलवर प्रक्रिया करू नाही"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"मीडियावर प्रक्रिया करणे रद्द केले"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"मीडियावर प्रक्रिया करण्यासंबंधित एरर"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"मीडियावर प्रक्रिया करणे यशस्वी झाले"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"मीडियावर प्रक्रिया सुरू झाली"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"मीडियावर प्रक्रिया सुरू आहे…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"रद्द करा"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"प्रतीक्षा करा"</string>
 </resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index fa0c9f5..dc5d040 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Memadamkan item…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> tidak dapat memproses fail media"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Pemprosesan media dibatalkan"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Ralat pemprosesan media"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Pemprosesan media berjaya"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Pemprosesan media telah bermula"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Memproses media…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Batal"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Tunggu"</string>
 </resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 07accdc..ce0b311 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">ဖိုင်ကို ဖျက်နေသည်…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> က မီဒီယာဖိုင်များကို မလုပ်ဆောင်နိုင်ပါ"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"မီဒီယာ လုပ်ဆောင်ခြင်းကို ရပ်လိုက်သည်"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"မီဒီယာ လုပ်ဆောင်ခြင်း အမှားရှိသည်"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"မီဒီယာ လုပ်ဆောင်ခြင်း အောင်မြင်ပါသည်"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"မီဒီယာ လုပ်ဆောင်ခြင်း စတင်လိုက်သည်"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"မီဒီယာကို လုပ်ဆောင်နေသည်…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"မလုပ်တော့"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"စောင့်ရန်"</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index d0e16be..3ebc4c1 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Sletter elementet …</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> kan ikke behandle mediefiler"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Behandlingen av mediene er avbrutt"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Feil under behandling av mediene"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Mediene er blitt behandlet"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Behandlingen av mediene er startet"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Mediene behandles …"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Avbryt"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Vent"</string>
 </resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 1f2f068..ea47c97 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -171,20 +171,12 @@
       <item quantity="other"><xliff:g id="COUNT">^1</xliff:g> वटा वस्तु मेटाइँदै छन्…</item>
       <item quantity="one">वस्तु मेटाइँदै छ…</item>
     </plurals>
-    <!-- no translation found for transcode_denied (6760546817138288976) -->
-    <skip />
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ले मिडिया फाइलहरू प्रयोग गर्न सक्दैन"</string>
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"मिडिया प्रोसेस गर्ने कार्य रद्द गरियो"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"मिडिया प्रोसेस गर्ने क्रममा त्रुटि भयो"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"मिडिया प्रोसेस गरियो"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"मिडिया प्रोसेस गर्न थालियो"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"मिडिया प्रोसेस गरिँदै छ…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"रद्द गर्नुहोस्"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"पर्खनुहोस्"</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index ab2f390..dcd8a36 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Item verwijderen…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> kan geen mediabestanden verwerken"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Mediaverwerking geannuleerd"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Fout bij mediaverwerking"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Mediaverwerking afgerond"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Mediaverwerking gestart"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Media verwerken…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Annuleren"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Wachten"</string>
 </resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index e16221d..1e185dc 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">ଆଇଟମ୍ ଡିଲିଟ୍ କରାଯାଉଛି…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ମିଡିଆ ଫାଇଲଗୁଡ଼ିକୁ ପ୍ରକ୍ରିୟାନ୍ୱିତ କରିପାରିବ ନାହିଁ"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"ମିଡିଆ ପ୍ରକ୍ରିୟାକରଣ ବାତିଲ୍ କରାଯାଇଛି"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"ମିଡିଆ ପ୍ରକ୍ରିୟାକରଣ ତ୍ରୁଟି"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"ମିଡିଆ ପ୍ରକ୍ରିୟାକରଣ ସଫଳ ହୋଇଛି"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"ମିଡିଆ ପ୍ରକ୍ରିୟାକରଣ ଆରମ୍ଭ କରାଯାଇଛି"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"ମିଡିଆ ପ୍ରକ୍ରିୟାକରଣ କରାଯାଉଛି…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"ଅପେକ୍ଷା କରନ୍ତୁ"</string>
 </resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index e48cc44..273c6b6 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other"><xliff:g id="COUNT">^1</xliff:g> ਆਈਟਮਾਂ ਮਿਟਾਈਆਂ ਜਾ ਰਹੀਆਂ ਹਨ…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> ਐਪ ਮੀਡੀਆ ਫ਼ਾਈਲਾਂ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਨਹੀਂ ਕਰ ਸਕਦੀ"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"ਮੀਡੀਆ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਰੱਦ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"ਮੀਡੀਆ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਸੰਬੰਧੀ ਗੜਬੜ"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"ਮੀਡੀਆ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਸਫਲ ਰਹੀ"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"ਮੀਡੀਆ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਸ਼ੁਰੂ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"ਮੀਡੀਆ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"ਰੱਦ ਕਰੋ"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"ਉਡੀਕ ਕਰੋ"</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index ee80645..d308c74 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -240,18 +240,11 @@
       <item quantity="one">Usuwam element…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Aplikacja <xliff:g id="APP_NAME">%s</xliff:g> nie może przetworzyć plików multimediów"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Anulowano przetwarzanie multimediów"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Błąd przetwarzania multimediów"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Przetworzono multimedia"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Rozpoczęto przetwarzanie multimediów"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Przetwarzam multimedia…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Anuluj"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Czekaj"</string>
 </resources>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 80520a0..82f8b43 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other">Excluindo <xliff:g id="COUNT">^1</xliff:g> itens…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Não é possível processar arquivos de mídia no app <xliff:g id="APP_NAME">%s</xliff:g>"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Processamento de mídia cancelado"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Erro no processamento de mídia"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Processamento de mídia concluído"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Processamento de mídia iniciado"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Processando mídia…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Cancelar"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Aguardar"</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 80520a0..82f8b43 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other">Excluindo <xliff:g id="COUNT">^1</xliff:g> itens…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Não é possível processar arquivos de mídia no app <xliff:g id="APP_NAME">%s</xliff:g>"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Processamento de mídia cancelado"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Erro no processamento de mídia"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Processamento de mídia concluído"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Processamento de mídia iniciado"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Processando mídia…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Cancelar"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Aguardar"</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 99c8cbf..4bd0b43 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -206,18 +206,11 @@
       <item quantity="one">Se șterge elementul…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> nu poate procesa fișiere media"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Procesarea conținutului media a fost anulată"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Eroare la procesarea conținutului media"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Procesarea conținutului media s-a finalizat"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Procesarea conținutului media a început"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Se procesează conținutul media…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Anulați"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Așteptați"</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 0272bec..054d9fc 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -240,18 +240,11 @@
       <item quantity="other">Удаление <xliff:g id="COUNT">^1</xliff:g> объекта…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Приложение \"<xliff:g id="APP_NAME">%s</xliff:g>\" не может обрабатывать медиафайлы."</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Обработка медиафайла отменена."</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Произошла ошибка при обработке медиафайла."</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Обработка медиафайла завершена."</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Началась обработка медиафайла."</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Обработка медиафайла…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Отмена"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Подождать"</string>
 </resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 7b1448e..d69a10c 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Një artikull po fshihet…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> nuk mund t\'i përpunojë skedarët e medias"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Përpunimi i medias u anulua"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Gabim i përpunimit të medias"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Përpunimi i medias u krye me sukses"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Përpunimi i medias ka filluar"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Media po përpunohet…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Anulo"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Prit"</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 1905244..cfc2aa8 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -206,18 +206,11 @@
       <item quantity="other">Брише се <xliff:g id="COUNT">^1</xliff:g> ставки…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> не може да обради медијске фајлове"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Обрада медија је отказана"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Грешка при обради медија"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Обрада медија је успела"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Обрада медија је започела"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Обрађују се медији…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Откажи"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Сачекај"</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 325a023..a576b61 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Objektet raderas …</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> kan inte behandla mediefiler"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Mediebearbetningen har avbrutits"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Fel vid mediebearbetning"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Mediebearbetningen har slutförts"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Mediebearbetningen har startats"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Bearbetar media …"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Avbryt"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Vänta"</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 9b4e8da..1357d44 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Inafuta kipengee…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> imeshindwa kuchakata faili za maudhui"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Mchakato wa maudhui umeghairiwa"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Hitilafu ya kuchakata maudhui"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Imemaliza kuchakata maudhui"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Imeanza kuchakata maudhui"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Inachakata maudhui…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Ghairi"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Subiri"</string>
 </resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 8f37640..e1404f6 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">ஆவணத்தை நீக்குகிறது…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"மீடியா கோப்புகளை <xliff:g id="APP_NAME">%s</xliff:g> ஆப்ஸால் செயலாக்க முடியவில்லை"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"மீடியா செயலாக்கம் ரத்துசெய்யப்பட்டது"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"மீடியா செயலாக்கத்தில் பிழை"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"மீடியா செயலாக்கம் நிறைவடைந்தது"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"மீடியா செயலாக்கம் தொடங்கியது"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"மீடியாவைச் செயலாக்குகிறது…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"ரத்துசெய்"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"காத்திருங்கள்"</string>
 </resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 7f2e66f..2b14c3e 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">ఐటెమ్‌ను తొలగిస్తోంది…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> మీడియా ఫైల్‌లను ప్రాసెస్ చేయదు"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"మీడియా ప్రాసెసింగ్ రద్దు చేయబడింది"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"మీడియా ప్రాసెసింగ్‌లో ఎర్రర్ ఏర్పడింది"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"మీడియా ప్రాసెసింగ్ విజయవంతమైంది"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"మీడియా ప్రాసెసింగ్ ప్రారంభమైంది"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"మీడియాను ప్రాసెస్ చేస్తోంది…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"రద్దు చేయి"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"వేచి ఉండు"</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 444e7de..da8604c 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">กำลังลบรายการ…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g>ประมวลผลไฟล์สื่อไม่ได้"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"ยกเลิกการประมวลผลสื่อแล้ว"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"ข้อผิดพลาดในการประมวลผลสื่อ"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"การประมวลผลสื่อสำเร็จแล้ว"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"เริ่มการประมวลผลสื่อแล้ว"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"กำลังประมวลผลสื่อ…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"ยกเลิก"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"รอ"</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index d34d363..804e99e 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="other">Nagde-delete ng <xliff:g id="COUNT">^1</xliff:g> na item…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Hindi nakakapagproseso ng mga media file ang <xliff:g id="APP_NAME">%s</xliff:g>"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Nakansela ang pagpoproseso ng media"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Error sa pagpoproseso ng media"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Matagumpay ang pagpoproseso ng media"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Sinimulan ang pagpoproseso ng media"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Pinoproseso ang media…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Kanselahin"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Maghintay"</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index d382386..e3efff8 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Öğe siliniyor…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g>, medya dosyalarını işleyemez"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Medya işleme iptal edildi"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Medya işleme hatası"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Medya işleme başarılı"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Medya işleme başladı"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Medya işleniyor…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"İptal"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Bekle"</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 9069411..d03fb4c 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -240,18 +240,11 @@
       <item quantity="other">Видалення <xliff:g id="COUNT">^1</xliff:g> об\'єкта…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"Додаток <xliff:g id="APP_NAME">%s</xliff:g> не може обробляти медіафайли"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Обробку медіафайлів скасовано"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Не вдалось обробити медіафайли"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Обробку медіафайлів завершено"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Почалась обробка медіафайлів"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Обробка медіафайлів…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Скасувати"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Зачекати"</string>
 </resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index b8ce3b6..63488cf 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">آئٹم حذف کیا جا رہا ہے…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> میڈیا کی فائلز پر کارروائی نہیں کر سکتی"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"میڈیا پر کارروائی منسوخ ہو گئی"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"میڈیا پر کارروائی کرنے میں خرابی"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"میڈیا پر کارروائی کامیاب ہو گئی"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"میڈیا پر کارروائی شروع ہو گئی"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"میڈیا پر کارروائی ہو رہی ہے…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"منسوخ کریں"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"انتظار کریں"</string>
 </resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 79340e5..168bbf8 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Element oʻchirilmoqda…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> media fayllarni ijro qila olmaydi"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Mediaga ishlov berish bekor qilindi"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Mediaga ishlov berishda xatolik yuz berdi"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Mediga ishlov berildi"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Mediaga ishlov berish boshlandi"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Mediaga ishlov berilmoqda…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Bekor qilish"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Kutish"</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 1cf7fbe..87f6201 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">Đang xóa mục…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g> không thể xử lý các tệp nội dung nghe nhìn"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"Đã hủy quá trình xử lý nội dung nghe nhìn"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"Lỗi khi xử lý nội dung nghe nhìn"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"Đã xử lý thành công nội dung nghe nhìn"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"Đã bắt đầu xử lý nội dung nghe nhìn"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"Đang xử lý nội dung nghe nhìn..."</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"Hủy"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"Đợi"</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index dd13c82..b1f7f7f 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">正在删除内容…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"<xliff:g id="APP_NAME">%s</xliff:g>无法处理媒体文件"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"已取消处理媒体内容"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"处理媒体内容时出错"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"已成功处理媒体内容"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"已开始处理媒体内容"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"正在处理媒体内容…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"取消"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"等待"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index a9b3eeb..51d8c9e 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">正在刪除項目…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"「<xliff:g id="APP_NAME">%s</xliff:g>」無法處理媒體檔案"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"已取消處理媒體"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"處理媒體時發生錯誤"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"處理媒體成功"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"已開始處理媒體"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"正在處理媒體…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"取消"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"等待"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 5cb8919..a67a29e 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -172,18 +172,11 @@
       <item quantity="one">正在刪除項目…</item>
     </plurals>
     <string name="transcode_denied" msgid="6760546817138288976">"「<xliff:g id="APP_NAME">%s</xliff:g>」無法處理媒體檔案"</string>
-    <!-- no translation found for transcode_processing_cancelled (5340383917746945590) -->
-    <skip />
-    <!-- no translation found for transcode_processing_error (8921643164508407874) -->
-    <skip />
-    <!-- no translation found for transcode_processing_success (447288876429730122) -->
-    <skip />
-    <!-- no translation found for transcode_processing_started (7789086308155361523) -->
-    <skip />
-    <!-- no translation found for transcode_processing (6753136468864077258) -->
-    <skip />
-    <!-- no translation found for transcode_cancel (8555752601907598192) -->
-    <skip />
-    <!-- no translation found for transcode_wait (8909773149560697501) -->
-    <skip />
+    <string name="transcode_processing_cancelled" msgid="5340383917746945590">"已取消處理媒體"</string>
+    <string name="transcode_processing_error" msgid="8921643164508407874">"處理媒體時發生錯誤"</string>
+    <string name="transcode_processing_success" msgid="447288876429730122">"媒體處理成功"</string>
+    <string name="transcode_processing_started" msgid="7789086308155361523">"已開始處理媒體"</string>
+    <string name="transcode_processing" msgid="6753136468864077258">"正在處理媒體…"</string>
+    <string name="transcode_cancel" msgid="8555752601907598192">"取消"</string>
+    <string name="transcode_wait" msgid="8909773149560697501">"等待"</string>
 </resources>
diff --git a/src/com/android/providers/media/LocalCallingIdentity.java b/src/com/android/providers/media/LocalCallingIdentity.java
index 97a33e3..d19627c 100644
--- a/src/com/android/providers/media/LocalCallingIdentity.java
+++ b/src/com/android/providers/media/LocalCallingIdentity.java
@@ -69,6 +69,7 @@
 public class LocalCallingIdentity {
     public final int pid;
     public final int uid;
+    private final UserHandle user;
     private final Context context;
     private final String packageNameUnchecked;
     // Info used for logging permission checks
@@ -77,9 +78,16 @@
 
     private LocalCallingIdentity(Context context, int pid, int uid, String packageNameUnchecked,
             @Nullable String attributionTag) {
+        this(context, pid, uid, UserHandle.getUserHandleForUid(uid), packageNameUnchecked,
+                attributionTag);
+    }
+
+    private LocalCallingIdentity(Context context, int pid, int uid, UserHandle user,
+            String packageNameUnchecked, @Nullable String attributionTag) {
         this.context = context;
         this.pid = pid;
         this.uid = uid;
+        this.user = user;
         this.packageNameUnchecked = packageNameUnchecked;
         this.attributionTag = attributionTag;
     }
@@ -112,8 +120,16 @@
         if (callingAttributionTag == null) {
             callingAttributionTag = context.getAttributionTag();
         }
+        UserHandle user;
+        if (binderUid == Process.SHELL_UID || binderUid == Process.ROOT_UID) {
+            // For requests coming from the shell (eg `content query`), assume they are
+            // for the user we are running as.
+            user = Process.myUserHandle();
+        } else {
+            user = UserHandle.getUserHandleForUid(binderUid);
+        }
         return new LocalCallingIdentity(context, Binder.getCallingPid(), binderUid,
-                callingPackage, callingAttributionTag);
+                user, callingPackage, callingAttributionTag);
     }
 
     public static LocalCallingIdentity fromExternal(Context context, int uid) {
@@ -131,6 +147,7 @@
                 ident.hasPermissionResolved = PERMISSION_IS_REDACTION_NEEDED;
             }
         }
+
         return ident;
     }
 
@@ -140,10 +157,15 @@
     }
 
     public static LocalCallingIdentity fromSelf(Context context) {
+        return fromSelfAsUser(context, Process.myUserHandle());
+    }
+
+    public static LocalCallingIdentity fromSelfAsUser(Context context, UserHandle user) {
         final LocalCallingIdentity ident = new LocalCallingIdentity(
                 context,
                 android.os.Process.myPid(),
                 android.os.Process.myUid(),
+                user,
                 context.getOpPackageName(),
                 context.getAttributionTag());
 
@@ -218,6 +240,10 @@
         return Build.VERSION_CODES.CUR_DEVELOPMENT;
     }
 
+    public UserHandle getUser() {
+        return user;
+    }
+
     public static final int PERMISSION_IS_SELF = 1 << 0;
     public static final int PERMISSION_IS_SHELL = 1 << 1;
     public static final int PERMISSION_IS_MANAGER = 1 << 2;
@@ -394,9 +420,12 @@
             ai = context.getPackageManager()
                     .getApplicationInfo(getPackageName(), 0);
             if (ai != null) {
-                Boolean shouldBypass = ai.hasRequestRawExternalStorageAccess();
-                if (shouldBypass != null) {
-                    return shouldBypass;
+                final int requestRawExternalStorageValue
+                        = ai.getRequestRawExternalStorageAccess();
+                if (requestRawExternalStorageValue
+                        != ApplicationInfo.RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT) {
+                    return requestRawExternalStorageValue
+                            == ApplicationInfo.RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED;
                 }
                 // Manifest flag is not set, hence return default value based on the category of the
                 // app and targetSDK.
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index f109369..69efcae 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -376,17 +376,6 @@
         sDataColumns.put(MediaStore.Audio.AlbumColumns.ALBUM_ART, null);
     }
 
-    private static final Object sCacheLock = new Object();
-
-    @GuardedBy("sCacheLock")
-    private static final Set<String> sCachedExternalVolumeNames = new ArraySet<>();
-    @GuardedBy("sCacheLock")
-    private static final Map<String, File> sCachedVolumePaths = new ArrayMap<>();
-    @GuardedBy("sCacheLock")
-    private static final Map<String, Collection<File>> sCachedVolumeScanPaths = new ArrayMap<>();
-    @GuardedBy("sCacheLock")
-    private static final ArrayMap<File, String> sCachedVolumePathToId = new ArrayMap<>();
-
     private static final int sUserId = UserHandle.myUserId();
 
     /**
@@ -401,42 +390,18 @@
     private final LRUCache<String, Integer> mNonHiddenPaths = new LRUCache<>(NON_HIDDEN_CACHE_SIZE);
 
     public void updateVolumes() {
-        synchronized (sCacheLock) {
-            sCachedExternalVolumeNames.clear();
-            sCachedExternalVolumeNames.addAll(MediaStore.getExternalVolumeNames(getContext()));
-            Log.v(TAG, "Updated external volumes to: " + sCachedExternalVolumeNames.toString());
-
-            sCachedVolumePaths.clear();
-            sCachedVolumeScanPaths.clear();
-            sCachedVolumePathToId.clear();
-            try {
-                sCachedVolumeScanPaths.put(MediaStore.VOLUME_INTERNAL,
-                        FileUtils.getVolumeScanPaths(getContext(), MediaStore.VOLUME_INTERNAL));
-            } catch (FileNotFoundException e) {
-                Log.wtf(TAG, "Failed to update volume " + MediaStore.VOLUME_INTERNAL, e);
-            }
-
-            for (String volumeName : sCachedExternalVolumeNames) {
-                try {
-                    final Uri uri = MediaStore.Files.getContentUri(volumeName);
-                    final StorageVolume volume = mStorageManager.getStorageVolume(uri);
-                    sCachedVolumePaths.put(volumeName, volume.getDirectory());
-                    sCachedVolumeScanPaths.put(volumeName,
-                            FileUtils.getVolumeScanPaths(getContext(), volumeName));
-                    sCachedVolumePathToId.put(volume.getDirectory(), volume.getId());
-                } catch (IllegalStateException | FileNotFoundException e) {
-                    Log.wtf(TAG, "Failed to update volume " + volumeName, e);
-                }
-            }
-        }
-
+        mVolumeCache.update();
         // Update filters to reflect mounted volumes so users don't get
         // confused by metadata from ejected volumes
         ForegroundThread.getExecutor().execute(() -> {
-            mExternalDatabase.setFilterVolumeNames(getExternalVolumeNames());
+            mExternalDatabase.setFilterVolumeNames(mVolumeCache.getExternalVolumeNames());
         });
     }
 
+    public @NonNull MediaVolume getVolume(@NonNull String volumeName) throws FileNotFoundException {
+        return mVolumeCache.findVolume(volumeName, mCallingIdentity.get().getUser());
+    }
+
     public @NonNull File getVolumePath(@NonNull String volumeName) throws FileNotFoundException {
         // Ugly hack to keep unit tests passing, where we don't always have a
         // Context to discover volumes with
@@ -444,54 +409,16 @@
             return Environment.getExternalStorageDirectory();
         }
 
-        synchronized (sCacheLock) {
-            if (sCachedVolumePaths.containsKey(volumeName)) {
-                return sCachedVolumePaths.get(volumeName);
-            }
-
-            // Nothing found above; let's ask directly and cache the answer
-            final File res = FileUtils.getVolumePath(getContext(), volumeName);
-            sCachedVolumePaths.put(volumeName, res);
-            return res;
-        }
+        return mVolumeCache.getVolumePath(volumeName, mCallingIdentity.get().getUser());
     }
 
     public @NonNull String getVolumeId(@NonNull File file) throws FileNotFoundException {
-        synchronized (sCacheLock) {
-            for (int i = 0; i < sCachedVolumePathToId.size(); i++) {
-                if (FileUtils.contains(sCachedVolumePathToId.keyAt(i), file)) {
-                    return sCachedVolumePathToId.valueAt(i);
-                }
-            }
-
-            // Nothing found above; let's ask directly and cache the answer
-            final StorageVolume volume = mStorageManager.getStorageVolume(file);
-            if (volume == null) {
-                throw new FileNotFoundException("Missing volume for " + file);
-            }
-            sCachedVolumePathToId.put(volume.getDirectory(), volume.getId());
-            return volume.getId();
-        }
-    }
-
-    public @NonNull Set<String> getExternalVolumeNames() {
-        synchronized (sCacheLock) {
-            return new ArraySet<>(sCachedExternalVolumeNames);
-        }
+        return mVolumeCache.getVolumeId(file);
     }
 
     public @NonNull Collection<File> getVolumeScanPaths(String volumeName)
             throws FileNotFoundException {
-        synchronized (sCacheLock) {
-            if (sCachedVolumeScanPaths.containsKey(volumeName)) {
-                return new ArrayList<>(sCachedVolumeScanPaths.get(volumeName));
-            }
-
-            // Nothing found above; let's ask directly and cache the answer
-            final Collection<File> res = FileUtils.getVolumeScanPaths(getContext(), volumeName);
-            sCachedVolumeScanPaths.put(volumeName, res);
-            return res;
-        }
+        return mVolumeCache.getVolumeScanPaths(volumeName, mCallingIdentity.get().getUser());
     }
 
     /**
@@ -515,6 +442,8 @@
     private DevicePolicyManager mDevicePolicyManager;
     private UserManager mUserManager;
 
+    private VolumeCache mVolumeCache;
+
     private int mExternalStorageAuthorityAppId;
     private int mDownloadsAuthorityAppId;
     private Size mThumbSize;
@@ -894,39 +823,22 @@
      * devices. We only do this once per volume so we don't annoy the user if
      * deleted manually.
      */
-    private void ensureDefaultFolders(@NonNull String volumeName, @NonNull SQLiteDatabase db) {
-        try {
-            final File path = getVolumePath(volumeName);
-            final StorageVolume vol = mStorageManager.getStorageVolume(path);
-            final String key;
-            if (vol == null) {
-                Log.w(TAG, "Failed to ensure default folders for " + volumeName);
-                return;
-            }
+    private void ensureDefaultFolders(@NonNull MediaVolume volume, @NonNull SQLiteDatabase db) {
+        final String key = "created_default_folders_" + volume.getId();
 
-            if (vol.isPrimary()) {
-                key = "created_default_folders";
-            } else {
-                key = "created_default_folders_" + vol.getMediaStoreVolumeName();
-            }
-
-            final SharedPreferences prefs = PreferenceManager
-                    .getDefaultSharedPreferences(getContext());
-            if (prefs.getInt(key, 0) == 0) {
-                for (String folderName : DEFAULT_FOLDER_NAMES) {
-                    final File folder = new File(vol.getDirectory(), folderName);
-                    if (!folder.exists()) {
-                        folder.mkdirs();
-                        insertDirectory(db, folder.getAbsolutePath());
-                    }
+        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
+        if (prefs.getInt(key, 0) == 0) {
+            for (String folderName : DEFAULT_FOLDER_NAMES) {
+                final File folder = new File(volume.getPath(), folderName);
+                if (!folder.exists()) {
+                    folder.mkdirs();
+                    insertDirectory(db, folder.getAbsolutePath());
                 }
-
-                SharedPreferences.Editor editor = prefs.edit();
-                editor.putInt(key, 1);
-                editor.commit();
             }
-        } catch (IOException e) {
-            Log.w(TAG, "Failed to ensure default folders for " + volumeName, e);
+
+            SharedPreferences.Editor editor = prefs.edit();
+            editor.putInt(key, 1);
+            editor.commit();
         }
     }
 
@@ -936,10 +848,10 @@
      * {@link DatabaseHelper#getOrCreateUuid} doesn't match the UUID found on
      * disk, then all thumbnails will be considered stable and will be deleted.
      */
-    private void ensureThumbnailsValid(@NonNull String volumeName, @NonNull SQLiteDatabase db) {
+    private void ensureThumbnailsValid(@NonNull MediaVolume volume, @NonNull SQLiteDatabase db) {
         final String uuidFromDatabase = DatabaseHelper.getOrCreateUuid(db);
         try {
-            for (File dir : getThumbnailDirectories(volumeName)) {
+            for (File dir : getThumbnailDirectories(volume)) {
                 if (!dir.exists()) {
                     dir.mkdirs();
                 }
@@ -967,7 +879,7 @@
                 }
             }
         } catch (IOException e) {
-            Log.w(TAG, "Failed to ensure thumbnails valid for " + volumeName, e);
+            Log.w(TAG, "Failed to ensure thumbnails valid for " + volume.getName(), e);
         }
     }
 
@@ -992,6 +904,7 @@
         mPackageManager = context.getPackageManager();
         mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
         mUserManager = context.getSystemService(UserManager.class);
+        mVolumeCache = new VolumeCache(context);
 
         // Reasonable thumbnail size is half of the smallest screen edge width
         final DisplayMetrics metrics = context.getResources().getDisplayMetrics();
@@ -1029,9 +942,9 @@
                 });
 
         updateVolumes();
-        attachVolume(MediaStore.VOLUME_INTERNAL, /* validate */ false);
-        for (String volumeName : getExternalVolumeNames()) {
-            attachVolume(volumeName, /* validate */ false);
+        attachVolume(MediaVolume.fromInternal(), /* validate */ false);
+        for (MediaVolume volume : mVolumeCache.getExternalVolumes()) {
+            attachVolume(volume, /* validate */ false);
         }
 
         // Watch for performance-sensitive activity
@@ -1092,7 +1005,11 @@
     }
 
     public LocalCallingIdentity clearLocalCallingIdentity() {
-        return clearLocalCallingIdentity(LocalCallingIdentity.fromSelf(getContext()));
+        // We retain the user part of the calling identity, since we are executing
+        // the call on behalf of that user, and we need to maintain the user context
+        // to correctly resolve things like volumes
+        UserHandle user = mCallingIdentity.get().getUser();
+        return clearLocalCallingIdentity(LocalCallingIdentity.fromSelfAsUser(getContext(), user));
     }
 
     public LocalCallingIdentity clearLocalCallingIdentity(LocalCallingIdentity replacement) {
@@ -1133,19 +1050,19 @@
         Logging.trimPersistent();
 
         // Scan all volumes to resolve any staleness
-        for (String volumeName : getExternalVolumeNames()) {
+        for (MediaVolume volume : mVolumeCache.getExternalVolumes()) {
             // Possibly bail before digging into each volume
             signal.throwIfCanceled();
 
             try {
-                MediaService.onScanVolume(getContext(), volumeName, REASON_IDLE);
+                MediaService.onScanVolume(getContext(), volume, REASON_IDLE);
             } catch (IOException e) {
                 Log.w(TAG, e);
             }
 
             // Ensure that our thumbnails are valid
             mExternalDatabase.runWithTransaction((db) -> {
-                ensureThumbnailsValid(volumeName, db);
+                ensureThumbnailsValid(volume, db);
                 return null;
             });
         }
@@ -1177,27 +1094,11 @@
         });
         Log.d(TAG, "Pruned " + stalePackages + " unknown packages");
 
-        // Delete any expired content on mounted volumes. The expired content on unmounted
-        // volumes will be deleted when we forget any stale volumes; we're cautious about
-        // wildly changing clocks, so only delete items within the last week
-        final long from = ((System.currentTimeMillis() - DateUtils.WEEK_IN_MILLIS) / 1000);
-        final long to = (System.currentTimeMillis() / 1000);
-        final int expiredMedia = mExternalDatabase.runWithTransaction((db) -> {
-            String selection = FileColumns.DATE_EXPIRES + " BETWEEN " + from + " AND " + to;
-            selection += " AND volume_name in " + bindList(MediaStore.getExternalVolumeNames(
-                    getContext()).toArray());
-            try (Cursor c = db.query(true, "files", new String[] { "volume_name", "_id" },
-                    selection, null, null, null, null, null, signal)) {
-                int totalCount = 0;
-                while (c.moveToNext()) {
-                    final String volumeName = c.getString(0);
-                    final long id = c.getLong(1);
-                    totalCount += delete(Files.getContentUri(volumeName, id), null, null);
-                }
-                return totalCount;
-            }
-        });
-        Log.d(TAG, "Deleted " + expiredMedia + " expired items");
+        // Delete the expired items or extend them on mounted volumes
+        final int[] result = deleteOrExtendExpiredItems(signal);
+        final int deletedExpiredMedia = result[0];
+        Log.d(TAG, "Deleted " + deletedExpiredMedia + " expired items");
+        Log.d(TAG, "Extended " + result[1] + " expired items");
 
         // Forget any stale volumes
         mExternalDatabase.runWithTransaction((db) -> {
@@ -1231,7 +1132,84 @@
 
         final long durationMillis = (SystemClock.elapsedRealtime() - startTime);
         Metrics.logIdleMaintenance(MediaStore.VOLUME_EXTERNAL, itemCount,
-                durationMillis, staleThumbnails, expiredMedia);
+                durationMillis, staleThumbnails, deletedExpiredMedia);
+    }
+
+    /**
+     * Delete any expired content on mounted volumes. The expired content on unmounted
+     * volumes will be deleted when we forget any stale volumes; we're cautious about
+     * wildly changing clocks, so only delete items within the last week.
+     * If the items are expired more than one week, extend the expired time of them
+     * another one week to avoid data loss with incorrect time zone data. We will
+     * delete it when it is expired next time.
+     *
+     * @param signal the cancellation signal
+     * @return the integer array includes total deleted count and total extended count
+     */
+    @NonNull
+    private int[] deleteOrExtendExpiredItems(@NonNull CancellationSignal signal) {
+        final long expiredOneWeek =
+                ((System.currentTimeMillis() - DateUtils.WEEK_IN_MILLIS) / 1000);
+        final long now = (System.currentTimeMillis() / 1000);
+        final Long extendedTime = now + (FileUtils.DEFAULT_DURATION_EXTENDED / 1000);
+        final int result[] = mExternalDatabase.runWithTransaction((db) -> {
+            String selection = FileColumns.DATE_EXPIRES + " < " + now;
+            selection += " AND volume_name in " + bindList(MediaStore.getExternalVolumeNames(
+                    getContext()).toArray());
+            String[] projection = new String[]{"volume_name", "_id",
+                    FileColumns.DATE_EXPIRES, FileColumns.DATA};
+            try (Cursor c = db.query(true, "files", projection, selection, null, null, null, null,
+                    null, signal)) {
+                int totalDeleteCount = 0;
+                int totalExtendedCount = 0;
+                while (c.moveToNext()) {
+                    final String volumeName = c.getString(0);
+                    final long id = c.getLong(1);
+                    final long dateExpires = c.getLong(2);
+                    // we only delete the items that expire in one week
+                    if (dateExpires > expiredOneWeek) {
+                        totalDeleteCount += delete(Files.getContentUri(volumeName, id), null, null);
+                    } else {
+                        final String oriPath = c.getString(3);
+                        final boolean success = extendExpiredItem(db, oriPath, id, extendedTime);
+                        if (success) {
+                            totalExtendedCount++;
+                        }
+                    }
+                }
+                return new int[]{totalDeleteCount, totalExtendedCount};
+            }
+        });
+        return result;
+    }
+
+    /**
+     * Extend the expired items by renaming the file to new path with new
+     * timestamp and updating the database for {@link FileColumns#DATA} and
+     * {@link FileColumns#DATE_EXPIRES}
+     */
+    private boolean extendExpiredItem(@NonNull SQLiteDatabase db, @NonNull String originalPath,
+            Long id, Long extendedTime) {
+        final String newPath = FileUtils.getAbsoluteExtendedPath(originalPath, extendedTime);
+        if (newPath == null) {
+            return false;
+        }
+
+        try {
+            Os.rename(originalPath, newPath);
+            invalidateFuseDentry(originalPath);
+            invalidateFuseDentry(newPath);
+        } catch (ErrnoException e) {
+            final String errorMessage = "Rename " + originalPath + " to " + newPath + " failed.";
+            Log.e(TAG, errorMessage, e);
+            return false;
+        }
+
+        final ContentValues values = new ContentValues();
+        values.put(FileColumns.DATA, newPath);
+        values.put(FileColumns.DATE_EXPIRES, extendedTime);
+        final int count = db.update("files", values, "_id=?", new String[]{String.valueOf(id)});
+        return count == 1;
     }
 
     public void onIdleMaintenanceStopped() {
@@ -1280,7 +1258,7 @@
     }
 
     public Uri scanFile(File file, int reason) {
-        return mMediaScanner.scanFile(file, reason);
+        return scanFile(file, reason, null);
     }
 
     public Uri scanFile(File file, int reason, String ownerPackage) {
@@ -4110,13 +4088,20 @@
 
         if (match == VOLUMES) {
             String name = initialValues.getAsString("name");
-            Uri attachedVolume = attachVolume(name, /* validate */ true);
-            if (mMediaScannerVolume != null && mMediaScannerVolume.equals(name)) {
-                final DatabaseHelper helper = getDatabaseForUri(
-                        MediaStore.Files.getContentUri(mMediaScannerVolume));
-                helper.mScanStartTime = SystemClock.elapsedRealtime();
+            MediaVolume volume = null;
+            try {
+                volume = getVolume(name);
+                Uri attachedVolume = attachVolume(volume, /* validate */ true);
+                if (mMediaScannerVolume != null && mMediaScannerVolume.equals(name)) {
+                    final DatabaseHelper helper = getDatabaseForUri(
+                            MediaStore.Files.getContentUri(mMediaScannerVolume));
+                    helper.mScanStartTime = SystemClock.elapsedRealtime();
+                }
+                return attachedVolume;
+            } catch (FileNotFoundException e) {
+                Log.w(TAG, "Couldn't find volume with name " + volume.getName());
+                return null;
             }
-            return attachedVolume;
         }
 
         final DatabaseHelper helper = getDatabaseForUri(uri);
@@ -4564,7 +4549,7 @@
         final String volumeName = MediaStore.getVolumeName(uri);
         final String includeVolumes;
         if (MediaStore.VOLUME_EXTERNAL.equals(volumeName)) {
-            includeVolumes = bindList(getExternalVolumeNames().toArray());
+            includeVolumes = bindList(mVolumeCache.getExternalVolumeNames().toArray());
         } else {
             includeVolumes = bindList(volumeName);
         }
@@ -5544,6 +5529,7 @@
             }
             case MediaStore.SCAN_FILE_CALL:
             case MediaStore.SCAN_VOLUME_CALL: {
+                final int userId = Binder.getCallingUid() / PER_USER_RANGE;
                 final LocalCallingIdentity token = clearLocalCallingIdentity();
                 final CallingIdentity providerToken = clearCallingIdentity();
                 try {
@@ -5556,7 +5542,13 @@
                         }
                         case MediaStore.SCAN_VOLUME_CALL: {
                             final String volumeName = arg;
-                            MediaService.onScanVolume(getContext(), volumeName, REASON_DEMAND);
+                            try {
+                                MediaVolume volume = mVolumeCache.findVolume(volumeName,
+                                        UserHandle.of(userId));
+                                MediaService.onScanVolume(getContext(), volume, REASON_DEMAND);
+                            } catch (FileNotFoundException e) {
+                                Log.w(TAG, "Failed to find volume " + volumeName, e);
+                            }
                             break;
                         }
                     }
@@ -5705,15 +5697,19 @@
                         extras.getParcelable(MediaStore.EXTRA_FILE_DESCRIPTOR);
                 try {
                     File file = getFileFromFileDescriptor(inputPfd);
-                    boolean supportsTranscode = mTranscodeHelper.supportsTranscode(file.getPath());
-                    if (!supportsTranscode) {
-                        throw new IOException("Input file descriptor is already original");
+                    boolean isModernFormat = mTranscodeHelper.isModernFormat(file.getPath());
+                    if (!isModernFormat) {
+                        // Return an empty bundle instead of throwing an exception in the special
+                        // case where the file is not a modern format. This avoids a misleading
+                        // warning in android.database.DatabaseUtils#writeExceptionToParcel
+                        return new Bundle();
                     }
 
                     FuseDaemon fuseDaemon = getFuseDaemonForFile(file);
                     String outputPath = fuseDaemon.getOriginalMediaFormatFilePath(inputPfd);
                     if (TextUtils.isEmpty(outputPath)) {
-                        throw new IOException("Invalid path for original media format file");
+                        throw new IllegalArgumentException(
+                                "Invalid path for original media format file");
                     }
 
                     int posixMode = Os.fcntlInt(inputPfd.getFileDescriptor(), F_GETFL,
@@ -5728,9 +5724,9 @@
                     res.putParcelable(MediaStore.EXTRA_FILE_DESCRIPTOR, outputPfd);
                     return res;
                 } catch (IOException e) {
-                    throw new RuntimeException(e);
+                    throw new IllegalStateException(e);
                 } catch (ErrnoException e) {
-                    throw new RuntimeException(
+                    throw new IllegalStateException(
                             "Failed to fetch access mode for file descriptor", e);
                 }
             }
@@ -5929,12 +5925,12 @@
         final long[] knownIdsRaw = knownIds.toArray();
         Arrays.sort(knownIdsRaw);
 
-        for (String volumeName : getExternalVolumeNames()) {
+        for (MediaVolume volume : mVolumeCache.getExternalVolumes()) {
             final List<File> thumbDirs;
             try {
-                thumbDirs = getThumbnailDirectories(volumeName);
+                thumbDirs = getThumbnailDirectories(volume);
             } catch (FileNotFoundException e) {
-                Log.w(TAG, "Failed to resolve volume " + volumeName, e);
+                Log.w(TAG, "Failed to resolve volume " + volume.getName(), e);
                 continue;
             }
 
@@ -6076,8 +6072,8 @@
         }
     };
 
-    private List<File> getThumbnailDirectories(String volumeName) throws FileNotFoundException {
-        final File volumePath = getVolumePath(volumeName);
+    private List<File> getThumbnailDirectories(MediaVolume volume) throws FileNotFoundException {
+        final File volumePath = volume.getPath();
         return Arrays.asList(
                 FileUtils.buildPath(volumePath, Environment.DIRECTORY_MUSIC, DIRECTORY_THUMBNAILS),
                 FileUtils.buildPath(volumePath, Environment.DIRECTORY_MOVIES, DIRECTORY_THUMBNAILS),
@@ -8331,7 +8327,7 @@
 
     /**
      * Enforces file creation restrictions (see return values) for the given file on behalf of the
-     * app with the given {@code uid}. If the file is is added to the shared storage, creates a
+     * app with the given {@code uid}. If the file is added to the shared storage, creates a
      * database entry for it.
      * <p> Does NOT create file.
      *
@@ -9215,8 +9211,16 @@
 
     private @NonNull DatabaseHelper getDatabaseForUri(Uri uri) throws VolumeNotFoundException {
         final String volumeName = resolveVolumeName(uri);
-        synchronized (mAttachedVolumeNames) {
-            if (!mAttachedVolumeNames.contains(volumeName)) {
+        synchronized (mAttachedVolumes) {
+            boolean volumeAttached = false;
+            for (MediaVolume vol : mAttachedVolumes) {
+                UserHandle user = mCallingIdentity.get().getUser();
+                if (vol.getName().equals(volumeName) && vol.isVisibleToUser(user)) {
+                    volumeAttached = true;
+                    break;
+                }
+            }
+            if (!volumeAttached) {
                 throw new VolumeNotFoundException(volumeName);
             }
         }
@@ -9251,42 +9255,43 @@
         return MediaStore.AUTHORITY_URI.buildUpon().appendPath(volumeName).build();
     }
 
-    public Uri attachVolume(String volume, boolean validate) {
+    public Uri attachVolume(MediaVolume volume, boolean validate) {
         if (mCallingIdentity.get().pid != android.os.Process.myPid()) {
             throw new SecurityException(
                     "Opening and closing databases not allowed.");
         }
 
+        final String volumeName = volume.getName();
+
         // Quick check for shady volume names
-        MediaStore.checkArgumentVolumeName(volume);
+        MediaStore.checkArgumentVolumeName(volumeName);
 
         // Quick check that volume actually exists
-        if (!MediaStore.VOLUME_INTERNAL.equals(volume) && validate) {
+        if (!MediaStore.VOLUME_INTERNAL.equals(volumeName) && validate) {
             try {
-                getVolumePath(volume);
+                getVolumePath(volumeName);
             } catch (IOException e) {
                 throw new IllegalArgumentException(
                         "Volume " + volume + " currently unavailable", e);
             }
         }
 
-        synchronized (mAttachedVolumeNames) {
-            mAttachedVolumeNames.add(volume);
+        synchronized (mAttachedVolumes) {
+            mAttachedVolumes.add(volume);
         }
 
         final ContentResolver resolver = getContext().getContentResolver();
-        final Uri uri = getBaseContentUri(volume);
-        resolver.notifyChange(getBaseContentUri(volume), null);
+        final Uri uri = getBaseContentUri(volumeName);
+        // TODO(b/182396009) we probably also want to notify clone profile (and vice versa)
+        resolver.notifyChange(getBaseContentUri(volumeName), null);
 
         if (LOGV) Log.v(TAG, "Attached volume: " + volume);
-        if (!MediaStore.VOLUME_INTERNAL.equals(volume)) {
+        if (!MediaStore.VOLUME_INTERNAL.equals(volumeName)) {
             // Also notify on synthetic view of all devices
             resolver.notifyChange(getBaseContentUri(MediaStore.VOLUME_EXTERNAL), null);
 
             ForegroundThread.getExecutor().execute(() -> {
-                final DatabaseHelper helper = MediaStore.VOLUME_INTERNAL.equals(volume)
-                        ? mInternalDatabase : mExternalDatabase;
-                helper.runWithTransaction((db) -> {
+                mExternalDatabase.runWithTransaction((db) -> {
                     ensureDefaultFolders(volume, db);
                     ensureThumbnailsValid(volume, db);
                     return null;
@@ -9295,26 +9300,33 @@
                 // We just finished the database operation above, we know that
                 // it's ready to answer queries, so notify our DocumentProvider
                 // so it can answer queries without risking ANR
-                MediaDocumentsProvider.onMediaStoreReady(getContext(), volume);
+                MediaDocumentsProvider.onMediaStoreReady(getContext(), volumeName);
             });
         }
         return uri;
     }
 
     private void detachVolume(Uri uri) {
-        detachVolume(MediaStore.getVolumeName(uri));
+        final String volumeName = MediaStore.getVolumeName(uri);
+        try {
+            detachVolume(getVolume(volumeName));
+        } catch (FileNotFoundException e) {
+            Log.e(TAG, "Couldn't find volume for URI " + uri, e) ;
+        }
     }
 
-    public void detachVolume(String volume) {
+    public void detachVolume(MediaVolume volume) {
         if (mCallingIdentity.get().pid != android.os.Process.myPid()) {
             throw new SecurityException(
                     "Opening and closing databases not allowed.");
         }
 
-        // Quick check for shady volume names
-        MediaStore.checkArgumentVolumeName(volume);
+        final String volumeName = volume.getName();
 
-        if (MediaStore.VOLUME_INTERNAL.equals(volume)) {
+        // Quick check for shady volume names
+        MediaStore.checkArgumentVolumeName(volumeName);
+
+        if (MediaStore.VOLUME_INTERNAL.equals(volumeName)) {
             throw new UnsupportedOperationException(
                     "Deleting the internal volume is not allowed");
         }
@@ -9322,24 +9334,24 @@
         // Signal any scanning to shut down
         mMediaScanner.onDetachVolume(volume);
 
-        synchronized (mAttachedVolumeNames) {
-            mAttachedVolumeNames.remove(volume);
+        synchronized (mAttachedVolumes) {
+            mAttachedVolumes.remove(volume);
         }
 
         final ContentResolver resolver = getContext().getContentResolver();
-        final Uri uri = getBaseContentUri(volume);
-        resolver.notifyChange(getBaseContentUri(volume), null);
+        final Uri uri = getBaseContentUri(volumeName);
+        resolver.notifyChange(getBaseContentUri(volumeName), null);
 
-        if (!MediaStore.VOLUME_INTERNAL.equals(volume)) {
+        if (!MediaStore.VOLUME_INTERNAL.equals(volumeName)) {
             // Also notify on synthetic view of all devices
             resolver.notifyChange(getBaseContentUri(MediaStore.VOLUME_EXTERNAL), null);
         }
 
-        if (LOGV) Log.v(TAG, "Detached volume: " + volume);
+        if (LOGV) Log.v(TAG, "Detached volume: " + volumeName);
     }
 
-    @GuardedBy("mAttachedVolumeNames")
-    private final ArraySet<String> mAttachedVolumeNames = new ArraySet<>();
+    @GuardedBy("mAttachedVolumes")
+    private final ArraySet<MediaVolume> mAttachedVolumes = new ArraySet<>();
     @GuardedBy("mCustomCollators")
     private final ArraySet<String> mCustomCollators = new ArraySet<>();
 
@@ -9669,8 +9681,8 @@
     @Override
     public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
         writer.println("mThumbSize=" + mThumbSize);
-        synchronized (mAttachedVolumeNames) {
-            writer.println("mAttachedVolumeNames=" + mAttachedVolumeNames);
+        synchronized (mAttachedVolumes) {
+            writer.println("mAttachedVolumes=" + mAttachedVolumes);
         }
         writer.println();
 
diff --git a/src/com/android/providers/media/MediaService.java b/src/com/android/providers/media/MediaService.java
index d7c6bab..5e3e10f 100644
--- a/src/com/android/providers/media/MediaService.java
+++ b/src/com/android/providers/media/MediaService.java
@@ -27,7 +27,9 @@
 import android.content.Intent;
 import android.media.RingtoneManager;
 import android.net.Uri;
+import android.os.Bundle;
 import android.os.Trace;
+import android.os.storage.StorageVolume;
 import android.provider.MediaStore;
 import android.util.Log;
 
@@ -68,7 +70,7 @@
                     break;
                 }
                 case Intent.ACTION_MEDIA_MOUNTED: {
-                    onScanVolume(this, intent.getData(), REASON_MOUNTED);
+                    onScanVolume(this, intent, REASON_MOUNTED);
                     break;
                 }
                 default: {
@@ -100,21 +102,25 @@
         }
     }
 
-    private static void onScanVolume(Context context, Uri uri, int reason)
+    private static void onScanVolume(Context context, Intent intent, int reason)
             throws IOException {
-        final File file = new File(uri.getPath()).getCanonicalFile();
-        final String volumeName = FileUtils.getVolumeName(context, file);
 
-        onScanVolume(context, volumeName, reason);
+        final StorageVolume volume = intent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
+        if (volume != null) {
+            onScanVolume(context, MediaVolume.fromStorageVolume(volume), reason);
+        } else {
+            Log.e(TAG, "Couldn't retrieve StorageVolume from intent");
+        }
     }
 
-    public static void onScanVolume(Context context, String volumeName, int reason)
+    public static void onScanVolume(Context context, MediaVolume volume, int reason)
             throws IOException {
+        final String volumeName = volume.getName();
         // If we're about to scan any external storage, scan internal first
         // to ensure that we have ringtones ready to roll before a possibly very
         // long external storage scan
         if (!MediaStore.VOLUME_INTERNAL.equals(volumeName)) {
-            onScanVolume(context, MediaStore.VOLUME_INTERNAL, reason);
+            onScanVolume(context, MediaVolume.fromInternal(), reason);
             RingtoneManager.ensureDefaultRingtones(context);
         }
 
@@ -131,7 +137,7 @@
         try (ContentProviderClient cpc = context.getContentResolver()
                 .acquireContentProviderClient(MediaStore.AUTHORITY)) {
             final MediaProvider provider = ((MediaProvider) cpc.getLocalContentProvider());
-            provider.attachVolume(volumeName, /* validate */ true);
+            provider.attachVolume(volume, /* validate */ true);
 
             final ContentResolver resolver = ContentResolver.wrap(cpc.getLocalContentProvider());
 
diff --git a/src/com/android/providers/media/MediaVolume.java b/src/com/android/providers/media/MediaVolume.java
new file mode 100644
index 0000000..577a040
--- /dev/null
+++ b/src/com/android/providers/media/MediaVolume.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.media;
+
+import android.os.UserHandle;
+import android.os.storage.StorageVolume;
+import android.provider.MediaStore;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.io.File;
+import java.util.Objects;
+
+/**
+ * MediaVolume is a MediaProvider-internal representation of a storage volume.
+ *
+ * Before MediaVolume, volumes inside MediaProvider were represented by their name;
+ * but now that MediaProvider handles volumes on behalf on multiple users, the name of a volume
+ * might no longer be unique. So MediaVolume holds both a name and a user. The user may be
+ * null on volumes without an owner (eg public volumes).
+ *
+ * In addition to that, we keep the path and ID of the volume cached in here as well
+ * for easy access.
+ */
+public final class MediaVolume {
+    /**
+     * Name of the volume.
+     */
+    private final @NonNull String mName;
+
+    /**
+     * User to which the volume belongs to; might be null in case of public volumes.
+     */
+    private final @Nullable UserHandle mUser;
+
+    /**
+     * Path on which the volume is mounted.
+     */
+    private final @Nullable File mPath;
+
+    /**
+     * Unique ID of the volume; eg "external;0"
+     */
+    private final @Nullable String mId;
+
+    public @NonNull String getName() {
+        return mName;
+    }
+
+    public @Nullable UserHandle getUser() {
+        return mUser;
+    }
+
+    public @Nullable File getPath() {
+        return mPath;
+    }
+
+    public @Nullable String getId() {
+        return mId;
+    }
+
+    private MediaVolume (@NonNull String name, UserHandle user, File path, String id) {
+        this.mName = name;
+        this.mUser = user;
+        this.mPath = path;
+        this.mId = id;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) return true;
+        if (obj == null || getClass() != obj.getClass()) return false;
+        MediaVolume that = (MediaVolume) obj;
+        return Objects.equals(mName, that.mName) &&
+                Objects.equals(mUser, that.mUser) &&
+                Objects.equals(mPath, that.mPath) &&
+                Objects.equals(mId, that.mId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mName, mUser, mPath, mId);
+    }
+
+    public boolean isVisibleToUser(UserHandle user) {
+        return mUser == null || user.equals(mUser);
+    }
+
+    @NonNull
+    public static MediaVolume fromStorageVolume(StorageVolume storageVolume) {
+        String name = storageVolume.getMediaStoreVolumeName();
+        UserHandle user = storageVolume.getOwner();
+        File path = storageVolume.getDirectory();
+        String id = storageVolume.getId();
+        return new MediaVolume(name, user, path, id);
+    }
+
+    public static MediaVolume fromInternal() {
+        String name = MediaStore.VOLUME_INTERNAL;
+
+        return new MediaVolume(name, null, null, null);
+    }
+}
diff --git a/src/com/android/providers/media/TranscodeHelper.java b/src/com/android/providers/media/TranscodeHelper.java
index 596db57..e1ffbca 100644
--- a/src/com/android/providers/media/TranscodeHelper.java
+++ b/src/com/android/providers/media/TranscodeHelper.java
@@ -792,7 +792,19 @@
         return isHevc(mimeType) || isHdr10Plus(colorStandard, colorTransfer);
     }
 
-    public boolean supportsTranscode(String path) {
+    public boolean isModernFormat(String filePath) {
+        if (supportsTranscode(filePath)) {
+            Pair<Integer, Long> result = getFileFlagsAndDurationMs(filePath);
+            int fileFlags = result.first;
+            if (fileFlags != 0) {
+                // File is HEVC or HDR
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static boolean supportsTranscode(String path) {
         File file = new File(path);
         String name = file.getName();
         final String cameraRelativePath =
diff --git a/src/com/android/providers/media/VolumeCache.java b/src/com/android/providers/media/VolumeCache.java
new file mode 100644
index 0000000..d94ddfa
--- /dev/null
+++ b/src/com/android/providers/media/VolumeCache.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.media;
+
+import static com.android.providers.media.util.Logging.TAG;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.os.storage.StorageManager;
+import android.os.storage.StorageVolume;
+import android.provider.MediaStore;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Log;
+import android.util.LongSparseArray;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+
+import com.android.providers.media.util.FileUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * The VolumeCache class keeps track of all the volumes that are available,
+ * as well as their scan paths.
+ */
+public class VolumeCache {
+    private final Context mContext;
+
+    private final Object mLock = new Object();
+
+    private final UserManager mUserManager;
+
+    @GuardedBy("mLock")
+    private final ArrayList<MediaVolume> mExternalVolumes = new ArrayList<>();
+
+    @GuardedBy("mLock")
+    private final Map<MediaVolume, Collection<File>> mCachedVolumeScanPaths = new ArrayMap<>();
+
+    @GuardedBy("mLock")
+    private Collection<File> mCachedInternalScanPaths;
+
+    @GuardedBy("mLock")
+    private final LongSparseArray<Context> mUserContexts = new LongSparseArray<>();
+
+    public VolumeCache(Context context) {
+        mContext = context;
+        mUserManager = context.getSystemService(UserManager.class);
+    }
+
+    public @NonNull List<MediaVolume> getExternalVolumes() {
+        synchronized(mLock) {
+            return new ArrayList<>(mExternalVolumes);
+        }
+    }
+
+    public @NonNull Set<String> getExternalVolumeNames() {
+        synchronized (mLock) {
+            ArraySet<String> volNames = new ArraySet<String>();
+            for (MediaVolume vol : mExternalVolumes) {
+                volNames.add(vol.getName());
+            }
+            return volNames;
+        }
+    }
+
+    public @NonNull MediaVolume findVolume(@NonNull String volumeName, @NonNull UserHandle user)
+            throws FileNotFoundException {
+        synchronized (mLock) {
+            for (MediaVolume vol : mExternalVolumes) {
+                if (vol.getName().equals(volumeName) && vol.isVisibleToUser(user)) {
+                    return vol;
+                }
+            }
+        }
+
+        throw new FileNotFoundException("Couldn't find volume with name " + volumeName);
+    }
+
+    public @NonNull File getVolumePath(@NonNull String volumeName, @NonNull UserHandle user)
+            throws FileNotFoundException {
+        synchronized (mLock) {
+            try {
+                MediaVolume volume = findVolume(volumeName, user);
+                return volume.getPath();
+            } catch (FileNotFoundException e) {
+                Log.w(TAG, "getVolumePath for unknown volume: " + volumeName);
+                // Try again by using FileUtils below
+            }
+
+            final Context userContext = getContextForUser(user);
+            return FileUtils.getVolumePath(userContext, volumeName);
+        }
+    }
+
+    public @NonNull Collection<File> getVolumeScanPaths(@NonNull String volumeName,
+            @NonNull UserHandle user) throws FileNotFoundException {
+        synchronized (mLock) {
+            if (MediaStore.VOLUME_INTERNAL.equals(volumeName)) {
+                // Internal is shared by all users
+                return mCachedInternalScanPaths;
+            }
+            try {
+                MediaVolume volume = findVolume(volumeName, user);
+                if (mCachedVolumeScanPaths.containsKey(volume)) {
+                    return mCachedVolumeScanPaths.get(volume);
+                }
+            } catch (FileNotFoundException e) {
+                Log.w(TAG, "Didn't find cached volume scan paths for " + volumeName);
+            }
+
+            // Nothing found above; let's ask directly
+            final Context userContext = getContextForUser(user);
+            final Collection<File> res = FileUtils.getVolumeScanPaths(userContext, volumeName);
+
+            return res;
+        }
+    }
+
+    public @NonNull MediaVolume findVolumeForFile(@NonNull File file) throws FileNotFoundException {
+        synchronized (mLock) {
+            for (MediaVolume volume : mExternalVolumes) {
+                if (FileUtils.contains(volume.getPath(), file)) {
+                    return volume;
+                }
+            }
+        }
+
+        Log.w(TAG, "Didn't find any volume for getVolume(" + file.getPath() + ")");
+        // Nothing found above; let's ask directly
+        final StorageManager sm = mContext.getSystemService(StorageManager.class);
+        final StorageVolume volume = sm.getStorageVolume(file);
+        if (volume == null) {
+            throw new FileNotFoundException("Missing volume for " + file);
+        }
+
+        return MediaVolume.fromStorageVolume(volume);
+    }
+
+    public @NonNull String getVolumeId(@NonNull File file) throws FileNotFoundException {
+        MediaVolume volume = findVolumeForFile(file);
+
+        return volume.getId();
+    }
+
+    private @NonNull Context getContextForUser(UserHandle user) {
+        synchronized (mLock) {
+            Context userContext = mUserContexts.get(user.getIdentifier());
+            if (userContext != null) {
+                return userContext;
+            }
+            try {
+                userContext = mContext.createPackageContextAsUser("system", 0, user);
+                mUserContexts.put(user.getIdentifier(), userContext);
+                return userContext;
+            } catch (PackageManager.NameNotFoundException e) {
+                throw new RuntimeException("Failed to create context for user " + user, e);
+            }
+        }
+    }
+
+    @GuardedBy("mLock")
+    private void updateExternalVolumesForUserLocked(Context userContext) {
+        final StorageManager sm = userContext.getSystemService(StorageManager.class);
+        for (String volumeName : MediaStore.getExternalVolumeNames(userContext)) {
+            try {
+                final Uri uri = MediaStore.Files.getContentUri(volumeName);
+                final StorageVolume storageVolume = sm.getStorageVolume(uri);
+                MediaVolume volume = MediaVolume.fromStorageVolume(storageVolume);
+                mExternalVolumes.add(volume);
+                mCachedVolumeScanPaths.put(volume, FileUtils.getVolumeScanPaths(userContext,
+                            volume.getName()));
+            } catch (IllegalStateException | FileNotFoundException e) {
+                Log.wtf(TAG, "Failed to update volume " + volumeName, e);
+            }
+        }
+    }
+
+    public void update() {
+        synchronized (mLock) {
+            mCachedVolumeScanPaths.clear();
+            try {
+                mCachedInternalScanPaths = FileUtils.getVolumeScanPaths(mContext,
+                        MediaStore.VOLUME_INTERNAL);
+            } catch (FileNotFoundException e) {
+                Log.wtf(TAG, "Failed to update volume " + MediaStore.VOLUME_INTERNAL,e );
+            }
+            mExternalVolumes.clear();
+            for (UserHandle profile : mUserManager.getEnabledProfiles()) {
+                if (profile.equals(mContext.getUser())) {
+                    // Volumes of the user id that MediaProvider runs as
+                    updateExternalVolumesForUserLocked(mContext);
+                } else {
+                    Context userContext = getContextForUser(profile);
+                    if (userContext.getSystemService(UserManager.class).isMediaSharedWithParent()) {
+                        // This profile shares media with its parent - add its volumes, too
+                        updateExternalVolumesForUserLocked(userContext);
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/src/com/android/providers/media/fuse/ExternalStorageServiceImpl.java b/src/com/android/providers/media/fuse/ExternalStorageServiceImpl.java
index 573d3c9..612889d 100644
--- a/src/com/android/providers/media/fuse/ExternalStorageServiceImpl.java
+++ b/src/com/android/providers/media/fuse/ExternalStorageServiceImpl.java
@@ -30,6 +30,7 @@
 import androidx.annotation.Nullable;
 
 import com.android.providers.media.MediaProvider;
+import com.android.providers.media.MediaVolume;
 
 import java.io.File;
 import java.io.IOException;
@@ -79,20 +80,20 @@
         Objects.requireNonNull(vol);
 
         MediaProvider mediaProvider = getMediaProvider();
-        String volumeName = vol.getMediaStoreVolumeName();
 
         switch(vol.getState()) {
             case Environment.MEDIA_MOUNTED:
-                mediaProvider.attachVolume(volumeName, /* validate */ false);
+                mediaProvider.attachVolume(MediaVolume.fromStorageVolume(vol),
+                        /* validate */ false);
                 break;
             case Environment.MEDIA_UNMOUNTED:
             case Environment.MEDIA_EJECTING:
             case Environment.MEDIA_REMOVED:
             case Environment.MEDIA_BAD_REMOVAL:
-                mediaProvider.detachVolume(volumeName);
+                mediaProvider.detachVolume(MediaVolume.fromStorageVolume(vol));
                 break;
             default:
-                Log.i(TAG, "Ignoring volume state for vol:" + volumeName
+                Log.i(TAG, "Ignoring volume state for vol:" + vol.getMediaStoreVolumeName()
                         + ". State: " + vol.getState());
         }
         // Check for invalidation of cached volumes
diff --git a/src/com/android/providers/media/scan/LegacyMediaScanner.java b/src/com/android/providers/media/scan/LegacyMediaScanner.java
index 0a53a0d..d8d3bed 100644
--- a/src/com/android/providers/media/scan/LegacyMediaScanner.java
+++ b/src/com/android/providers/media/scan/LegacyMediaScanner.java
@@ -21,6 +21,8 @@
 
 import androidx.annotation.Nullable;
 
+import com.android.providers.media.MediaVolume;
+
 import java.io.File;
 
 @Deprecated
@@ -52,7 +54,7 @@
     }
 
     @Override
-    public void onDetachVolume(String volumeName) {
+    public void onDetachVolume(MediaVolume volume) {
         throw new UnsupportedOperationException();
     }
 
diff --git a/src/com/android/providers/media/scan/MediaScanner.java b/src/com/android/providers/media/scan/MediaScanner.java
index 1306873..45d2a24 100644
--- a/src/com/android/providers/media/scan/MediaScanner.java
+++ b/src/com/android/providers/media/scan/MediaScanner.java
@@ -26,6 +26,8 @@
 
 import androidx.annotation.Nullable;
 
+import com.android.providers.media.MediaVolume;
+
 import java.io.File;
 
 public interface MediaScanner {
@@ -38,7 +40,7 @@
     public void scanDirectory(File file, int reason);
     public Uri scanFile(File file, int reason);
     public Uri scanFile(File file, int reason, @Nullable String ownerPackage);
-    public void onDetachVolume(String volumeName);
+    public void onDetachVolume(MediaVolume volume);
     public void onIdleScanStopped();
     public void onDirectoryDirty(File file);
 }
diff --git a/src/com/android/providers/media/scan/ModernMediaScanner.java b/src/com/android/providers/media/scan/ModernMediaScanner.java
index 72c313c..9a38945 100644
--- a/src/com/android/providers/media/scan/ModernMediaScanner.java
+++ b/src/com/android/providers/media/scan/ModernMediaScanner.java
@@ -93,6 +93,7 @@
 import androidx.annotation.VisibleForTesting;
 
 import com.android.modules.utils.build.SdkLevel;
+import com.android.providers.media.MediaVolume;
 import com.android.providers.media.util.DatabaseUtils;
 import com.android.providers.media.util.ExifUtils;
 import com.android.providers.media.util.FileUtils;
@@ -270,10 +271,10 @@
     }
 
     @Override
-    public void onDetachVolume(String volumeName) {
+    public void onDetachVolume(MediaVolume volume) {
         synchronized (mActiveScans) {
             for (Scan scan : mActiveScans) {
-                if (volumeName.equals(scan.mVolumeName)) {
+                if (volume.equals(scan.mVolume)) {
                     scan.mSignal.cancel();
                 }
             }
@@ -322,6 +323,7 @@
 
         private final File mRoot;
         private final int mReason;
+        private final MediaVolume mVolume;
         private final String mVolumeName;
         private final Uri mFilesUri;
         private final CancellationSignal mSignal;
@@ -364,7 +366,13 @@
 
             mRoot = root;
             mReason = reason;
-            mVolumeName = FileUtils.getVolumeName(mContext, root);
+
+            if (FileUtils.contains(Environment.getStorageDirectory(), root)) {
+                mVolume = MediaVolume.fromStorageVolume(FileUtils.getStorageVolume(mContext, root));
+            } else {
+                mVolume = MediaVolume.fromInternal();
+            }
+            mVolumeName = mVolume.getName();
             mFilesUri = MediaStore.Files.getContentUri(mVolumeName);
             mSignal = new CancellationSignal();
 
@@ -512,17 +520,26 @@
                     buildSqlSelectionArgs());
             queryArgs.putString(ContentResolver.QUERY_ARG_SQL_SORT_ORDER,
                     FileColumns._ID + " DESC");
-            queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_PENDING, MediaStore.MATCH_EXCLUDE);
+            queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_PENDING, MediaStore.MATCH_INCLUDE);
             queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_TRASHED, MediaStore.MATCH_INCLUDE);
             queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_FAVORITE, MediaStore.MATCH_INCLUDE);
 
             final int[] countPerMediaType = new int[FileColumns.MEDIA_TYPE_COUNT];
             try (Cursor c = mResolver.query(mFilesUri,
-                    new String[] { FileColumns._ID, FileColumns.MEDIA_TYPE },
-                    queryArgs, mSignal)) {
+                    new String[]{FileColumns._ID, FileColumns.MEDIA_TYPE, FileColumns.DATE_EXPIRES,
+                            FileColumns.IS_PENDING}, queryArgs, mSignal)) {
                 while (c.moveToNext()) {
                     final long id = c.getLong(0);
                     if (Arrays.binarySearch(scannedIds, id) < 0) {
+                        final long dateExpire = c.getLong(2);
+                        final boolean isPending = c.getInt(3) == 1;
+                        // Don't delete the pending item which is not expired.
+                        // If the scan is triggered between invoking
+                        // ContentResolver#insert() and ContentResolver#openFileDescriptor(),
+                        // it raises the FileNotFoundException b/166063754.
+                        if (isPending && dateExpire > System.currentTimeMillis() / 1000) {
+                            continue;
+                        }
                         mUnknownIds.add(id);
                         final int mediaType = c.getInt(1);
                         // Avoid ArrayIndexOutOfBounds if more mediaTypes are added,
diff --git a/src/com/android/providers/media/scan/NullMediaScanner.java b/src/com/android/providers/media/scan/NullMediaScanner.java
index 3f84109..7a1a396 100644
--- a/src/com/android/providers/media/scan/NullMediaScanner.java
+++ b/src/com/android/providers/media/scan/NullMediaScanner.java
@@ -23,6 +23,8 @@
 
 import androidx.annotation.Nullable;
 
+import com.android.providers.media.MediaVolume;
+
 import java.io.File;
 
 /**
@@ -61,7 +63,7 @@
     }
 
     @Override
-    public void onDetachVolume(String volumeName) {
+    public void onDetachVolume(MediaVolume volume) {
         // Ignored
     }
 
diff --git a/src/com/android/providers/media/util/FileUtils.java b/src/com/android/providers/media/util/FileUtils.java
index f488340..cf7c23a 100644
--- a/src/com/android/providers/media/util/FileUtils.java
+++ b/src/com/android/providers/media/util/FileUtils.java
@@ -45,9 +45,11 @@
 import android.content.ClipDescription;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
+import android.os.UserHandle;
 import android.os.storage.StorageManager;
 import android.os.storage.StorageVolume;
 import android.provider.MediaStore;
@@ -859,16 +861,39 @@
     }
 
     /**
+     * Return StorageVolume corresponding to the file on Path
+     */
+    public static @NonNull StorageVolume getStorageVolume(@NonNull Context context,
+            @NonNull File path) throws FileNotFoundException {
+        int userId = extractUserId(path.getPath());
+        Context userContext = context;
+        if (userId >= 0 && (context.getUser().getIdentifier() != userId)) {
+            // This volume is for a different user than our context, create a context
+            // for that user to retrieve the correct volume.
+            try {
+                userContext = context.createPackageContextAsUser("system", 0,
+                        UserHandle.of(userId));
+            } catch (PackageManager.NameNotFoundException e) {
+                throw new FileNotFoundException("Can't get package context for user " + userId);
+            }
+        }
+
+        StorageVolume volume = userContext.getSystemService(StorageManager.class)
+                .getStorageVolume(path);
+        if (volume == null) {
+            throw new FileNotFoundException("Can't find volume for " + path.getPath());
+        }
+
+        return volume;
+    }
+
+    /**
      * Return volume name which hosts the given path.
      */
     public static @NonNull String getVolumeName(@NonNull Context context, @NonNull File path)
             throws FileNotFoundException {
         if (contains(Environment.getStorageDirectory(), path)) {
-            StorageVolume volume = context.getSystemService(StorageManager.class)
-                    .getStorageVolume(path);
-            if (volume == null) {
-                throw new FileNotFoundException("Can't find volume for " + path.getPath());
-            }
+            StorageVolume volume = getStorageVolume(context, path);
             return volume.getMediaStoreVolumeName();
         } else {
             return MediaStore.VOLUME_INTERNAL;
@@ -906,6 +931,12 @@
      */
     public static final long DEFAULT_DURATION_TRASHED = 30 * DateUtils.DAY_IN_MILLIS;
 
+    /**
+     * Default duration that expired items should be extended in
+     * {@link #runIdleMaintenance}.
+     */
+    public static final long DEFAULT_DURATION_EXTENDED = 7 * DateUtils.DAY_IN_MILLIS;
+
     public static boolean isDownload(@NonNull String path) {
         return PATTERN_DOWNLOADS_FILE.matcher(path).matches();
     }
@@ -1471,4 +1502,29 @@
 
         return topNoMediaDir;
     }
+
+    /**
+     * Generate the extended absolute path from the expired file path
+     * E.g. the input expiredFilePath is /storage/emulated/0/DCIM/.trashed-1621147340-test.jpg
+     * The returned result is /storage/emulated/0/DCIM/.trashed-1888888888-test.jpg
+     *
+     * @hide
+     */
+    @Nullable
+    public static String getAbsoluteExtendedPath(@NonNull String expiredFilePath,
+            long extendedTime) {
+        final String displayName = extractDisplayName(expiredFilePath);
+
+        final Matcher matcher = PATTERN_EXPIRES_FILE.matcher(displayName);
+        if (matcher.matches()) {
+            final String newDisplayName = String.format(Locale.US, ".%s-%d-%s", matcher.group(1),
+                    extendedTime, matcher.group(3));
+            final int lastSlash = expiredFilePath.lastIndexOf('/');
+            final String newPath = expiredFilePath.substring(0, lastSlash + 1).concat(
+                    newDisplayName);
+            return newPath;
+        }
+
+        return null;
+    }
 }
diff --git a/tests/Android.bp b/tests/Android.bp
index 43fe80f..0cf1a3b 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -9,6 +9,7 @@
         "cts-install-lib",
     ],
     sdk_version: "test_current",
+    target_sdk_version: "30",
     min_sdk_version: "30",
     test_suites: [
         "device-tests",
@@ -27,6 +28,7 @@
         "cts-install-lib",
     ],
     sdk_version: "test_current",
+    target_sdk_version: "30",
     min_sdk_version: "30",
     test_suites: [
         "device-tests",
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 48bb6aa..199f617 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -2,6 +2,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.providers.media.tests">
 
+    <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="30" />
+
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
diff --git a/tests/client/src/com/android/providers/media/client/PerformanceTest.java b/tests/client/src/com/android/providers/media/client/PerformanceTest.java
index c90e4fe..0088514 100644
--- a/tests/client/src/com/android/providers/media/client/PerformanceTest.java
+++ b/tests/client/src/com/android/providers/media/client/PerformanceTest.java
@@ -41,7 +41,6 @@
 
 import com.android.providers.media.tests.utils.Timer;
 
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -60,8 +59,12 @@
 /**
  * Since we're right in the critical path between camera and gallery apps, we
  * need to meet some pretty strict performance deadlines.
+ *
+ * This test is marked as {@code LargeTest} for it to not run in presubmit as it does not make any
+ * assertions, and any performance regressions are caught separately by Crystallball.
  */
 @RunWith(AndroidJUnit4.class)
+@LargeTest
 public class PerformanceTest {
     private static final String TAG = "PerformanceTest";
 
@@ -237,12 +240,10 @@
     }
 
     @Test
-    @Ignore("b/184048881")
     public void testDirOperations_500() throws Exception {
         testDirOperations_size(500);
     }
 
-    @LargeTest
     @Test
     public void testDirOperations_1000() throws Exception {
         testDirOperations_size(1000);
diff --git a/tests/src/com/android/providers/media/DatabaseHelperTest.java b/tests/src/com/android/providers/media/DatabaseHelperTest.java
index 1757ad3..a159fd0 100644
--- a/tests/src/com/android/providers/media/DatabaseHelperTest.java
+++ b/tests/src/com/android/providers/media/DatabaseHelperTest.java
@@ -27,6 +27,7 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import android.Manifest;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
@@ -69,6 +70,8 @@
 
     @Before
     public void setUp() {
+        InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                .adoptShellPermissionIdentity(Manifest.permission.INTERACT_ACROSS_USERS);
         final Context context = InstrumentationRegistry.getTargetContext();
         sIsolatedContext = new IsolatedContext(context, TAG, /*asFuseThread*/ false);
         sIsolatedResolver = sIsolatedContext.getContentResolver();
diff --git a/tests/src/com/android/providers/media/IdleServiceTest.java b/tests/src/com/android/providers/media/IdleServiceTest.java
index b0af885..064a4f8 100644
--- a/tests/src/com/android/providers/media/IdleServiceTest.java
+++ b/tests/src/com/android/providers/media/IdleServiceTest.java
@@ -19,25 +19,35 @@
 import static android.os.Environment.DIRECTORY_MOVIES;
 import static android.os.Environment.DIRECTORY_PICTURES;
 import static android.os.Environment.buildPath;
+import static android.provider.MediaStore.MediaColumns.DATE_EXPIRES;
+
+import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import android.Manifest;
 import android.app.UiAutomation;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.Context;
+import android.database.Cursor;
 import android.net.Uri;
+import android.os.Bundle;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
 import android.provider.MediaStore;
+import android.text.format.DateUtils;
 import android.util.Log;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.providers.media.scan.MediaScannerTest;
+import com.android.providers.media.util.FileUtils;
 
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -48,16 +58,43 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
+import java.util.Locale;
 
 @RunWith(AndroidJUnit4.class)
 public class IdleServiceTest {
     private static final String TAG = MediaProviderTest.TAG;
 
+    private File mDir;
+
+    @Before
+    public void setUp() {
+        final Context context = InstrumentationRegistry.getTargetContext();
+        InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                .adoptShellPermissionIdentity(Manifest.permission.LOG_COMPAT_CHANGE,
+                        Manifest.permission.READ_COMPAT_CHANGE_CONFIG);
+
+        mDir = new File(context.getExternalMediaDirs()[0], "test_" + System.nanoTime());
+        mDir.mkdirs();
+        FileUtils.deleteContents(mDir);
+    }
+
+    @After
+    public void tearDown() {
+        FileUtils.deleteContents(mDir);
+        InstrumentationRegistry.getInstrumentation()
+                .getUiAutomation().dropShellPermissionIdentity();
+    }
+
     @Test
     public void testPruneThumbnails() throws Exception {
         final Context context = InstrumentationRegistry.getTargetContext();
         final ContentResolver resolver = context.getContentResolver();
 
+        // Previous tests (like DatabaseHelperTest) may have left stale
+        // .database_uuid files, do an idle run first to clean them up.
+        runIdleMaintenance(resolver);
+        MediaStore.waitForIdle(resolver);
+
         final File dir = Environment.getExternalStorageDirectory();
         final File mediaDir = context.getExternalMediaDirs()[0];
 
@@ -98,6 +135,76 @@
         assertFalse(exists(d));
     }
 
+    @Test
+    public void testExtendTrashedItemExpiresOverOneWeek() throws Exception {
+        final Context context = InstrumentationRegistry.getTargetContext();
+        final ContentResolver resolver = context.getContentResolver();
+
+        // Create the expired item and scan the file to add it into database
+        final long dateExpires = (System.currentTimeMillis() - 10 * DateUtils.DAY_IN_MILLIS) / 1000;
+        final String expiredFileName = String.format(Locale.US, ".%s-%d-%s",
+                FileUtils.PREFIX_TRASHED, dateExpires, System.nanoTime() + ".jpg");
+        final File file = MediaScannerTest.stage(R.raw.test_image,
+                new File(mDir, expiredFileName));
+        final Uri uri = MediaStore.scanFile(resolver, file);
+
+        MediaStore.waitForIdle(resolver);
+
+        final String[] projection = new String[]{DATE_EXPIRES};
+        final Bundle queryArgs = new Bundle();
+        queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_TRASHED, MediaStore.MATCH_INCLUDE);
+
+        try (Cursor cursor = resolver.query(uri, projection, queryArgs,
+                null /* cancellationSignal */)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        final long expectedExtendedTimestamp =
+                (System.currentTimeMillis() + FileUtils.DEFAULT_DURATION_EXTENDED) / 1000 - 1;
+        runIdleMaintenance(resolver);
+
+        final long dateExpiresAfter;
+        try (Cursor cursor = resolver.query(uri, projection, queryArgs,
+                null /* cancellationSignal */)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+            cursor.moveToFirst();
+            dateExpiresAfter = cursor.getLong(0);
+            assertThat(dateExpiresAfter).isGreaterThan(expectedExtendedTimestamp);
+        }
+    }
+
+    @Test
+    public void testDeleteExpiredTrashedItem() throws Exception {
+        final Context context = InstrumentationRegistry.getTargetContext();
+        final ContentResolver resolver = context.getContentResolver();
+
+        // Create the expired item and scan the file to add it into database
+        final long dateExpires = (System.currentTimeMillis() - 3 * DateUtils.DAY_IN_MILLIS) / 1000;
+        final String expiredFileName = String.format(Locale.US, ".%s-%d-%s",
+                FileUtils.PREFIX_TRASHED, dateExpires, System.nanoTime() + ".jpg");
+        final File file = MediaScannerTest.stage(R.raw.test_image,
+                new File(mDir, expiredFileName));
+        final Uri uri = MediaStore.scanFile(resolver, file);
+
+        MediaStore.waitForIdle(resolver);
+
+        final String[] projection = new String[]{DATE_EXPIRES};
+        final Bundle queryArgs = new Bundle();
+        queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_TRASHED, MediaStore.MATCH_INCLUDE);
+
+        try (Cursor cursor = resolver.query(uri, projection, queryArgs,
+                null /* cancellationSignal */)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        runIdleMaintenance(resolver);
+
+        try (Cursor cursor = resolver.query(uri, projection, queryArgs,
+                null /* cancellationSignal */)) {
+            assertThat(cursor.getCount()).isEqualTo(0);
+        }
+    }
+
     private static void runIdleMaintenance(ContentResolver resolver) {
         final UiAutomation ui = InstrumentationRegistry.getInstrumentation().getUiAutomation();
         ui.adoptShellPermissionIdentity(android.Manifest.permission.DUMP);
diff --git a/tests/src/com/android/providers/media/MediaDocumentsProviderTest.java b/tests/src/com/android/providers/media/MediaDocumentsProviderTest.java
index 2db98b9..f9754e8 100644
--- a/tests/src/com/android/providers/media/MediaDocumentsProviderTest.java
+++ b/tests/src/com/android/providers/media/MediaDocumentsProviderTest.java
@@ -63,7 +63,8 @@
     public void setUp() {
         InstrumentationRegistry.getInstrumentation().getUiAutomation()
                 .adoptShellPermissionIdentity(Manifest.permission.LOG_COMPAT_CHANGE,
-                        Manifest.permission.READ_COMPAT_CHANGE_CONFIG);
+                        Manifest.permission.READ_COMPAT_CHANGE_CONFIG,
+                        Manifest.permission.INTERACT_ACROSS_USERS);
     }
 
     @After
diff --git a/tests/src/com/android/providers/media/MediaProviderForFuseTest.java b/tests/src/com/android/providers/media/MediaProviderForFuseTest.java
index afc57be..7de9834 100644
--- a/tests/src/com/android/providers/media/MediaProviderForFuseTest.java
+++ b/tests/src/com/android/providers/media/MediaProviderForFuseTest.java
@@ -58,7 +58,8 @@
         InstrumentationRegistry.getInstrumentation().getUiAutomation().adoptShellPermissionIdentity(
                 Manifest.permission.LOG_COMPAT_CHANGE,
                 Manifest.permission.READ_COMPAT_CHANGE_CONFIG,
-                Manifest.permission.UPDATE_APP_OPS_STATS);
+                Manifest.permission.UPDATE_APP_OPS_STATS,
+                Manifest.permission.INTERACT_ACROSS_USERS);
 
         final Context context = InstrumentationRegistry.getTargetContext();
         sIsolatedContext = new IsolatedContext(context, "modern", /*asFuseThread*/ true);
diff --git a/tests/src/com/android/providers/media/MediaProviderTest.java b/tests/src/com/android/providers/media/MediaProviderTest.java
index b7e2eb2..ef2c44b 100644
--- a/tests/src/com/android/providers/media/MediaProviderTest.java
+++ b/tests/src/com/android/providers/media/MediaProviderTest.java
@@ -44,6 +44,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Build;
@@ -107,6 +108,7 @@
         InstrumentationRegistry.getInstrumentation().getUiAutomation()
                 .adoptShellPermissionIdentity(Manifest.permission.LOG_COMPAT_CHANGE,
                         Manifest.permission.READ_COMPAT_CHANGE_CONFIG,
+                        Manifest.permission.READ_DEVICE_CONFIG,
                         Manifest.permission.INTERACT_ACROSS_USERS);
 
         final Context context = InstrumentationRegistry.getTargetContext();
@@ -625,6 +627,10 @@
             }
         };
 
+        final ProviderInfo info = sIsolatedContext.getPackageManager()
+                .resolveContentProvider(MediaStore.AUTHORITY, PackageManager.GET_META_DATA);
+        // Attach providerInfo, to make sure mCallingIdentity can be populated
+        provider.attachInfo(sIsolatedContext, info);
         final Uri uri = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
         final ContentValues values = new ContentValues();
 
@@ -1047,6 +1053,10 @@
                 return Build.VERSION_CODES.CUR_DEVELOPMENT;
             }
         };
+        final ProviderInfo info = sIsolatedContext.getPackageManager()
+                .resolveContentProvider(MediaStore.AUTHORITY, PackageManager.GET_META_DATA);
+        // Attach providerInfo, to make sure mCallingIdentity can be populated
+        provider.attachInfo(sIsolatedContext, info);
         provider.ensureFileColumns(uri, values);
 
         assertMimetype(values, "image/png");
diff --git a/tests/src/com/android/providers/media/PermissionActivityTest.java b/tests/src/com/android/providers/media/PermissionActivityTest.java
index ce72d97..e019d65 100644
--- a/tests/src/com/android/providers/media/PermissionActivityTest.java
+++ b/tests/src/com/android/providers/media/PermissionActivityTest.java
@@ -46,6 +46,7 @@
 import android.provider.MediaStore;
 
 import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.providers.media.scan.MediaScannerTest;
@@ -97,6 +98,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 31, codeName = "S")
     public void testShouldShowActionDialog_noRESAndMES_true() throws Exception {
         final String[] enableAppOpsList = {AppOpsManager.permissionToOp(MANAGE_MEDIA)};
         final String[] disableAppOpsList = {
@@ -121,6 +123,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 31, codeName = "S")
     public void testShouldShowActionDialog_noMANAGE_MEDIA_true() throws Exception {
         final String[] enableAppOpsList = {
                 AppOpsManager.permissionToOp(MANAGE_EXTERNAL_STORAGE),
@@ -145,6 +148,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 31, codeName = "S")
     public void testShouldShowActionDialog_hasPermissionWithRES_false() throws Exception {
         final String[] enableAppOpsList = {
                 AppOpsManager.permissionToOp(MANAGE_MEDIA),
@@ -169,6 +173,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 31, codeName = "S")
     public void testShouldShowActionDialog_hasPermissionWithMES_false() throws Exception {
         final String[] enableAppOpsList = {
                 AppOpsManager.permissionToOp(MANAGE_EXTERNAL_STORAGE),
@@ -193,6 +198,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 31, codeName = "S")
     public void testShouldShowActionDialog_writeNoACCESS_MEDIA_LOCATION_true() throws Exception {
         final String[] enableAppOpsList = {
                 AppOpsManager.permissionToOp(MANAGE_EXTERNAL_STORAGE),
@@ -218,6 +224,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 31, codeName = "S")
     public void testShouldShowActionDialog_writeHasACCESS_MEDIA_LOCATION_false() throws Exception {
         final String[] enableAppOpsList = {
                 AppOpsManager.permissionToOp(ACCESS_MEDIA_LOCATION),
diff --git a/tests/src/com/android/providers/media/ResolvePlaylistTest.java b/tests/src/com/android/providers/media/ResolvePlaylistTest.java
index 0bd2850..0f6c50a 100644
--- a/tests/src/com/android/providers/media/ResolvePlaylistTest.java
+++ b/tests/src/com/android/providers/media/ResolvePlaylistTest.java
@@ -58,7 +58,8 @@
         final Context context = InstrumentationRegistry.getTargetContext();
         InstrumentationRegistry.getInstrumentation().getUiAutomation()
                 .adoptShellPermissionIdentity(Manifest.permission.LOG_COMPAT_CHANGE,
-                        Manifest.permission.READ_COMPAT_CHANGE_CONFIG);
+                        Manifest.permission.READ_COMPAT_CHANGE_CONFIG,
+                        Manifest.permission.INTERACT_ACROSS_USERS);
 
         mDir = new File(context.getExternalMediaDirs()[0], "test_" + System.nanoTime());
         mDir.mkdirs();
diff --git a/tests/src/com/android/providers/media/TranscodeHelperTest.java b/tests/src/com/android/providers/media/TranscodeHelperTest.java
index 20d0f9d..0c2dc59 100644
--- a/tests/src/com/android/providers/media/TranscodeHelperTest.java
+++ b/tests/src/com/android/providers/media/TranscodeHelperTest.java
@@ -27,6 +27,7 @@
 import android.provider.MediaStore;
 
 import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.runner.AndroidJUnit4;
 
 import org.junit.Test;
@@ -37,6 +38,7 @@
 import java.util.Random;
 
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 31, codeName = "S")
 public class TranscodeHelperTest {
     private static final String SOME_VALID_FILE_PATH =
             "/storage/emulated/0/" + Environment.DIRECTORY_DCIM + "/Camera/some_filename.mp4";
diff --git a/tests/src/com/android/providers/media/scan/LegacyMediaScannerTest.java b/tests/src/com/android/providers/media/scan/LegacyMediaScannerTest.java
index af13fb8..cf9cb39 100644
--- a/tests/src/com/android/providers/media/scan/LegacyMediaScannerTest.java
+++ b/tests/src/com/android/providers/media/scan/LegacyMediaScannerTest.java
@@ -54,7 +54,7 @@
         } catch (UnsupportedOperationException expected) {
         }
         try {
-            scanner.onDetachVolume(MediaStore.VOLUME_EXTERNAL_PRIMARY);
+            scanner.onDetachVolume(null);
             fail();
         } catch (UnsupportedOperationException expected) {
         }
diff --git a/tests/src/com/android/providers/media/scan/MediaScannerTest.java b/tests/src/com/android/providers/media/scan/MediaScannerTest.java
index 67d118d..98cbdcc 100644
--- a/tests/src/com/android/providers/media/scan/MediaScannerTest.java
+++ b/tests/src/com/android/providers/media/scan/MediaScannerTest.java
@@ -22,6 +22,7 @@
 
 import static org.junit.Assert.assertEquals;
 
+import android.Manifest;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.ContextWrapper;
@@ -143,6 +144,8 @@
     @Before
     public void setUp() {
         final Context context = InstrumentationRegistry.getTargetContext();
+        InstrumentationRegistry.getInstrumentation().getUiAutomation().adoptShellPermissionIdentity(
+                Manifest.permission.INTERACT_ACROSS_USERS);
 
         mLegacy = new LegacyMediaScanner(
                 new IsolatedContext(context, "legacy", /*asFuseThread*/ false));
diff --git a/tests/src/com/android/providers/media/scan/ModernMediaScannerTest.java b/tests/src/com/android/providers/media/scan/ModernMediaScannerTest.java
index 9c9c6b7..cc355d0 100644
--- a/tests/src/com/android/providers/media/scan/ModernMediaScannerTest.java
+++ b/tests/src/com/android/providers/media/scan/ModernMediaScannerTest.java
@@ -19,7 +19,6 @@
 import static com.android.providers.media.scan.MediaScanner.REASON_UNKNOWN;
 import static com.android.providers.media.scan.MediaScannerTest.stage;
 import static com.android.providers.media.scan.ModernMediaScanner.MAX_EXCLUDE_DIRS;
-import static com.android.providers.media.scan.ModernMediaScanner.shouldScanPathAndIsPathHidden;
 import static com.android.providers.media.scan.ModernMediaScanner.isFileAlbumArt;
 import static com.android.providers.media.scan.ModernMediaScanner.parseOptional;
 import static com.android.providers.media.scan.ModernMediaScanner.parseOptionalDate;
@@ -34,6 +33,7 @@
 import static com.android.providers.media.scan.ModernMediaScanner.parseOptionalVideoResolution;
 import static com.android.providers.media.scan.ModernMediaScanner.parseOptionalYear;
 import static com.android.providers.media.scan.ModernMediaScanner.shouldScanDirectory;
+import static com.android.providers.media.scan.ModernMediaScanner.shouldScanPathAndIsPathHidden;
 import static com.android.providers.media.util.FileUtils.isDirectoryHidden;
 import static com.android.providers.media.util.FileUtils.isFileHidden;
 
@@ -58,16 +58,18 @@
 import android.media.ExifInterface;
 import android.media.MediaMetadataRetriever;
 import android.net.Uri;
+import android.os.Bundle;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
 import android.provider.MediaStore;
 import android.provider.MediaStore.Audio.AudioColumns;
-import android.provider.MediaStore.Files.FileColumns;
 import android.provider.MediaStore.MediaColumns;
+import android.text.format.DateUtils;
 import android.util.Log;
 import android.util.Pair;
 
 import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.providers.media.R;
@@ -88,6 +90,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InterruptedIOException;
+import java.util.Locale;
 import java.util.Optional;
 
 @RunWith(AndroidJUnit4.class)
@@ -112,7 +115,8 @@
         final Context context = InstrumentationRegistry.getTargetContext();
         InstrumentationRegistry.getInstrumentation().getUiAutomation()
                 .adoptShellPermissionIdentity(Manifest.permission.LOG_COMPAT_CHANGE,
-                        Manifest.permission.READ_COMPAT_CHANGE_CONFIG);
+                        Manifest.permission.READ_COMPAT_CHANGE_CONFIG,
+                        Manifest.permission.INTERACT_ACROSS_USERS);
 
         mDir = new File(context.getExternalMediaDirs()[0], "test_" + System.nanoTime());
         mDir.mkdirs();
@@ -798,6 +802,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 31, codeName = "S")
     public void testScan_audio_recording() throws Exception {
         final File music = new File(mDir, "Recordings");
         final File audio = new File(music, "audio.mp3");
@@ -937,6 +942,209 @@
         }
     }
 
+    @Test
+    public void testScan_deleteStaleRowWithExpiredPendingFile() throws Exception {
+        final String displayName = "audio.mp3";
+        final long dateExpires = (System.currentTimeMillis() - 5 * DateUtils.DAY_IN_MILLIS) / 1000;
+        final String expiredName = String.format(
+                Locale.US, ".%s-%d-%s", FileUtils.PREFIX_PENDING, dateExpires, displayName);
+        final File audio = new File(mDir, expiredName);
+        stage(R.raw.test_audio, audio);
+
+        // files should exist
+        assertThat(audio.exists()).isTrue();
+
+        // scan file, row is added
+        mModern.scanFile(audio, REASON_UNKNOWN);
+        final Bundle queryArgs = new Bundle();
+        queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_PENDING, MediaStore.MATCH_INCLUDE);
+
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        // Delete the pending file to make the row is stale
+        executeShellCommand("rm " + audio.getAbsolutePath());
+        assertThat(audio.exists()).isFalse();
+
+        // the row still exists
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        mModern.scanFile(audio, REASON_UNKNOWN);
+
+        // ScanFile above deleted stale expired pending row, hence we shouldn't see
+        // the pending row in query result
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(0);
+        }
+    }
+
+    @Test
+    public void testScan_keepStaleRowWithNonExpiredPendingFile() throws Exception {
+        final String displayName = "audio.mp3";
+        final long dateExpires = (System.currentTimeMillis() + 2 * DateUtils.DAY_IN_MILLIS) / 1000;
+        final String expiredName = String.format(
+                Locale.US, ".%s-%d-%s", FileUtils.PREFIX_PENDING, dateExpires, displayName);
+        final File audio = new File(mDir, expiredName);
+        stage(R.raw.test_audio, audio);
+
+        // file should exist
+        assertThat(audio.exists()).isTrue();
+
+        // scan file, row is added
+        mModern.scanFile(audio, REASON_UNKNOWN);
+        final Bundle queryArgs = new Bundle();
+        queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_PENDING, MediaStore.MATCH_INCLUDE);
+
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        // Delete the pending file to make the row is stale
+        executeShellCommand("rm " + audio.getAbsolutePath());
+        assertThat(audio.exists()).isFalse();
+
+        // the row still exists
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        mModern.scanFile(audio, REASON_UNKNOWN);
+
+        // ScanFile above didn't delete stale pending row which is not expired, hence
+        // we still see the pending row in query result
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+    }
+
+    @Test
+    public void testScan_deleteStaleRowWithExpiredTrashedFile() throws Exception {
+        final String displayName = "audio.mp3";
+        final long dateExpires = (System.currentTimeMillis() - 5 * DateUtils.DAY_IN_MILLIS) / 1000;
+        final String expiredName = String.format(
+                Locale.US, ".%s-%d-%s", FileUtils.PREFIX_TRASHED, dateExpires, displayName);
+        final File audio = new File(mDir, expiredName);
+        stage(R.raw.test_audio, audio);
+
+        // file should exist
+        assertThat(audio.exists()).isTrue();
+
+        // scan file, row is added
+        mModern.scanFile(audio, REASON_UNKNOWN);
+        final Bundle queryArgs = new Bundle();
+        queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_TRASHED, MediaStore.MATCH_INCLUDE);
+
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        // Delete the trashed file to make the row is stale
+        executeShellCommand("rm " + audio.getAbsolutePath());
+        assertThat(audio.exists()).isFalse();
+
+        // the row still exists
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        mModern.scanFile(audio, REASON_UNKNOWN);
+
+        // ScanFile above deleted stale expired trashed row, hence we shouldn't see
+        // the trashed row in query result
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(0);
+        }
+    }
+
+    @Test
+    public void testScan_deleteStaleRowWithNonExpiredTrashedFile() throws Exception {
+        final String displayName = "audio.mp3";
+        final long dateExpires = (System.currentTimeMillis() + 2 * DateUtils.DAY_IN_MILLIS) / 1000;
+        final String expiredName = String.format(
+                Locale.US, ".%s-%d-%s", FileUtils.PREFIX_TRASHED, dateExpires, displayName);
+        final File audio = new File(mDir, expiredName);
+        stage(R.raw.test_audio, audio);
+
+        // file should exist
+        assertThat(audio.exists()).isTrue();
+
+        // scan file, row is added
+        mModern.scanFile(audio, REASON_UNKNOWN);
+        final Bundle queryArgs = new Bundle();
+        queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_TRASHED, MediaStore.MATCH_INCLUDE);
+
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        // Delete the trashed file to make the row is stale
+        executeShellCommand("rm " + audio.getAbsolutePath());
+        assertThat(audio.exists()).isFalse();
+
+        // the row still exists
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        mModern.scanFile(audio, REASON_UNKNOWN);
+
+        // ScanFile above deleted stale trashed row that is not expired, hence we
+        // shouldn't see the trashed row in query result
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, queryArgs, null)) {
+            assertThat(cursor.getCount()).isEqualTo(0);
+        }
+    }
+
+    @Test
+    public void testScan_deleteStaleRow() throws Exception {
+        final String displayName = "audio.mp3";
+        final File audio = new File(mDir, displayName);
+        stage(R.raw.test_audio, audio);
+
+        // file should exist
+        assertThat(audio.exists()).isTrue();
+
+        // scan file, row is added
+        mModern.scanFile(audio, REASON_UNKNOWN);
+
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, null, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        // Delete the file to make the row is stale
+        executeShellCommand("rm " + audio.getAbsolutePath());
+        assertThat(audio.exists()).isFalse();
+
+        // the row still exists
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, null, null)) {
+            assertThat(cursor.getCount()).isEqualTo(1);
+        }
+
+        mModern.scanFile(audio, REASON_UNKNOWN);
+
+        // ScanFile above deleted stale row, hence we shouldn't see the row in query result
+        try (Cursor cursor = mIsolatedResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                null, null, null)) {
+            assertThat(cursor.getCount()).isEqualTo(0);
+        }
+    }
 
     /**
      * Executes a shell command.
diff --git a/tests/src/com/android/providers/media/scan/NullMediaScannerTest.java b/tests/src/com/android/providers/media/scan/NullMediaScannerTest.java
index 44528ba..063f1b7 100644
--- a/tests/src/com/android/providers/media/scan/NullMediaScannerTest.java
+++ b/tests/src/com/android/providers/media/scan/NullMediaScannerTest.java
@@ -41,6 +41,6 @@
         scanner.scanFile(new File("/dev/null"), MediaScanner.REASON_UNKNOWN,
                     InstrumentationRegistry.getContext().getPackageName());
 
-        scanner.onDetachVolume(MediaStore.VOLUME_EXTERNAL_PRIMARY);
+        scanner.onDetachVolume(null);
     }
 }
diff --git a/tests/src/com/android/providers/media/util/FileUtilsTest.java b/tests/src/com/android/providers/media/util/FileUtilsTest.java
index 2e85421..abb5e7f 100644
--- a/tests/src/com/android/providers/media/util/FileUtilsTest.java
+++ b/tests/src/com/android/providers/media/util/FileUtilsTest.java
@@ -496,6 +496,13 @@
     }
 
     @Test
+    public void testGetAbsoluteExtendedPath() throws Exception {
+        assertEquals("/storage/emulated/0/DCIM/.trashed-1888888888-test.jpg",
+                FileUtils.getAbsoluteExtendedPath(
+                        "/storage/emulated/0/DCIM/.trashed-1621147340-test.jpg", 1888888888));
+    }
+
+    @Test
     public void testExtractVolumePath() throws Exception {
         assertEquals("/storage/emulated/0/",
                 extractVolumePath("/storage/emulated/0/foo.jpg"));
diff --git a/tests/src/com/android/providers/media/util/PermissionUtilsTest.java b/tests/src/com/android/providers/media/util/PermissionUtilsTest.java
index da89b5c..7facf05 100644
--- a/tests/src/com/android/providers/media/util/PermissionUtilsTest.java
+++ b/tests/src/com/android/providers/media/util/PermissionUtilsTest.java
@@ -65,6 +65,7 @@
 import android.content.Context;
 import android.content.Intent;
 
+import androidx.test.filters.SdkSuppress;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.cts.install.lib.TestApp;
@@ -273,6 +274,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 31, codeName = "S")
     public void testManageMediaPermissionsOnTestApp() throws Exception {
         final String packageName = TEST_APP_WITH_STORAGE_PERMS.getPackageName();
         final int testAppUid = getContext().getPackageManager().getPackageUid(packageName, 0);
diff --git a/tests/test_app/LegacyTestApp.xml b/tests/test_app/LegacyTestApp.xml
index f73143b..4fe9761 100644
--- a/tests/test_app/LegacyTestApp.xml
+++ b/tests/test_app/LegacyTestApp.xml
@@ -20,6 +20,8 @@
           android:versionCode="1"
           android:versionName="1.0">
 
+    <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="28" />
+
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 
     <application android:label="LegacyTestApp"
diff --git a/tests/test_app/TestAppWithStoragePerms.xml b/tests/test_app/TestAppWithStoragePerms.xml
index c37b025..5910280 100644
--- a/tests/test_app/TestAppWithStoragePerms.xml
+++ b/tests/test_app/TestAppWithStoragePerms.xml
@@ -20,6 +20,8 @@
           android:versionCode="1"
           android:versionName="1.0">
 
+    <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="30" />
+
     <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>
     <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.MANAGE_MEDIA"/>
diff --git a/tests/test_app/TestAppWithoutPerms.xml b/tests/test_app/TestAppWithoutPerms.xml
index 875d2c0..9708129 100644
--- a/tests/test_app/TestAppWithoutPerms.xml
+++ b/tests/test_app/TestAppWithoutPerms.xml
@@ -20,6 +20,8 @@
           android:versionCode="1"
           android:versionName="1.0">
 
+    <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="30" />
+
     <application android:label="TestAppWithoutPerms">
         <activity android:name="com.android.providers.media.util.TestAppActivity"
                   android:exported="true">