Merge "Allow video files to be inserted in Pictures"
diff --git a/Android.bp b/Android.bp
index 5dfb012..49863ed 100644
--- a/Android.bp
+++ b/Android.bp
@@ -11,6 +11,7 @@
 
     libs: [
         "unsupportedappusage",
+        "app-compat-annotations",
     ],
 
     jni_libs: [
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ecd5943..ff7299c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -19,6 +19,11 @@
     <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.USE_RESERVED_DISK" />
     <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+
+    <!-- Permissions required for reading and logging compat changes -->
+    <uses-permission android:name="android.permission.LOG_COMPAT_CHANGE"/>
+    <uses-permission android:name="android.permission.READ_COMPAT_CHANGE_CONFIG"/>
 
     <application
             android:name="com.android.providers.media.MediaApplication"
@@ -96,9 +101,24 @@
         </service>
 
         <activity
-            android:name="com.android.providers.media.PermissionActivity"
-            android:theme="@style/PickerDialogTheme"
-            android:exported="false"
-            android:excludeFromRecents="true" />
+                android:name="com.android.providers.media.PermissionActivity"
+                android:theme="@style/PickerDialogTheme"
+                android:exported="false"
+                android:excludeFromRecents="true" />
+
+        <activity
+                android:name="com.android.providers.media.CacheClearingActivity"
+                android:exported="true"
+                android:theme="@style/CacheClearingAlertDialogTheme"
+                android:finishOnCloseSystemDialogs="true"
+                android:launchMode="singleTop"
+                android:excludeFromRecents="true"
+                android:visibleToInstantApps="true"
+                android:priority="100" >
+            <intent-filter>
+                <action android:name="android.os.storage.action.CLEAR_APP_CACHE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
     </application>
 </manifest>
diff --git a/apex/Android.bp b/apex/Android.bp
index a6aaae2..c792c72 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -3,6 +3,7 @@
     defaults: ["com.android.mediaprovider-defaults"],
     manifest: "apex_manifest.json",
     apps: ["MediaProvider"],
+    prebuilts: ["media-provider-platform-compat-config"],
 }
 
 apex_defaults {
diff --git a/jni/FuseDaemon.cpp b/jni/FuseDaemon.cpp
index 1c10335..282a088 100644
--- a/jni/FuseDaemon.cpp
+++ b/jni/FuseDaemon.cpp
@@ -853,7 +853,15 @@
         return;
     }
 
-    const int fd = open(path.c_str(), fi->flags);
+    // With the writeback cache enabled, FUSE may generate READ requests even for files that
+    // were opened O_WRONLY; so make sure we open it O_RDWR instead.
+    int open_flags = fi->flags;
+    if (open_flags & O_WRONLY) {
+        open_flags &= ~O_WRONLY;
+        open_flags |= O_RDWR;
+    }
+
+    const int fd = open(path.c_str(), open_flags);
     if (fd < 0) {
         fuse_reply_err(req, errno);
         return;
@@ -897,7 +905,7 @@
         TRACE_FUSE(fuse) << "Using cache for " << path;
     }
 
-    handle* h = new handle(path, fd, ri.release(), !fi->direct_io);
+    handle* h = new handle(path, fd, ri.release(), !fi->direct_io, fi->flags & O_CREAT);
     node->AddHandle(h);
 
     fi->fh = ptr_to_id(h);
@@ -1104,8 +1112,10 @@
                      << "0" << std::oct << fi->flags << " " << h << "(" << h->fd << ")";
 
     fuse->fadviser.Close(h->fd);
-    // TODO(b/145737191): Figure out if we need to scan files on close, and how to do it properly
     if (node) {
+        if (h->is_new_file) {
+            fuse->mp->ScanFile(h->path);
+        }
         node->DestroyHandle(h);
     }
 
@@ -1360,8 +1370,16 @@
         return;
     }
 
+    // With the writeback cache enabled, FUSE may generate READ requests even for files that
+    // were opened O_WRONLY; so make sure we open it O_RDWR instead.
+    int open_flags = fi->flags;
+    if (open_flags & O_WRONLY) {
+        open_flags &= ~O_WRONLY;
+        open_flags |= O_RDWR;
+    }
+
     mode = (mode & (~0777)) | 0664;
-    int fd = open(child_path.c_str(), fi->flags, mode);
+    int fd = open(child_path.c_str(), open_flags, mode);
     if (fd < 0) {
         int error_code = errno;
         // We've already inserted the file into the MP database before the
@@ -1375,7 +1393,8 @@
     // This prevents crashing during reads but can be a security hole if a malicious app opens an fd
     // to the file before all the EXIF content is written. We could special case reads before the
     // first close after a file has just been created.
-    handle* h = new handle(child_path, fd, new RedactionInfo(), true /* cached */);
+    handle* h = new handle(child_path, fd, new RedactionInfo(), /*cached*/ true,
+                           /*is_new_file*/ true);
     fi->fh = ptr_to_id(h);
     fi->keep_cache = 1;
 
diff --git a/jni/node-inl.h b/jni/node-inl.h
index 4b688f1..76d1ba9 100644
--- a/jni/node-inl.h
+++ b/jni/node-inl.h
@@ -34,8 +34,9 @@
 namespace fuse {
 
 struct handle {
-    explicit handle(const std::string& path, int fd, const RedactionInfo* ri, bool cached)
-        : path(path), fd(fd), ri(ri), cached(cached) {
+    explicit handle(const std::string& path, int fd, const RedactionInfo* ri, bool cached,
+                    bool is_new_file)
+        : path(path), fd(fd), ri(ri), cached(cached), is_new_file(is_new_file) {
         CHECK(ri != nullptr);
     }
 
@@ -43,6 +44,7 @@
     const int fd;
     const std::unique_ptr<const RedactionInfo> ri;
     const bool cached;
+    const bool is_new_file;
 
     ~handle() { close(fd); }
 };
diff --git a/jni/node_test.cpp b/jni/node_test.cpp
index ba876a0..3ead90b 100644
--- a/jni/node_test.cpp
+++ b/jni/node_test.cpp
@@ -209,7 +209,8 @@
 TEST_F(NodeTest, AddDestroyHandle) {
     unique_node_ptr node = CreateNode(nullptr, "/path");
 
-    handle* h = new handle("/path", -1, new mediaprovider::fuse::RedactionInfo, true /* cached */);
+    handle* h = new handle("/path", -1, new mediaprovider::fuse::RedactionInfo, true /* cached */,
+                           true /* is_new_file */);
     node->AddHandle(h);
     ASSERT_TRUE(node->HasCachedHandle());
 
@@ -220,7 +221,7 @@
     // the node in question.
     EXPECT_DEATH(node->DestroyHandle(h), "");
     EXPECT_DEATH(node->DestroyHandle(nullptr), "");
-    std::unique_ptr<handle> h2(
-            new handle("/path2", -1, new mediaprovider::fuse::RedactionInfo, true /* cached */));
+    std::unique_ptr<handle> h2(new handle("/path2", -1, new mediaprovider::fuse::RedactionInfo,
+                                          true /* cached */, true /* is_new_file */));
     EXPECT_DEATH(node->DestroyHandle(h2.get()), "");
 }
diff --git a/legacy/Android.bp b/legacy/Android.bp
index 65725ef..203ee5a 100644
--- a/legacy/Android.bp
+++ b/legacy/Android.bp
@@ -9,6 +9,8 @@
         "guava",
     ],
 
+    libs: ["app-compat-annotations"],
+
     srcs: [
         "src/**/*.aidl",
         "src/**/*.java",
diff --git a/res/layout/cache_clearing_dialog.xml b/res/layout/cache_clearing_dialog.xml
new file mode 100644
index 0000000..f5e9bde
--- /dev/null
+++ b/res/layout/cache_clearing_dialog.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2020, The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:theme="@style/CacheClearingAlertDialogTheme"
+        android:paddingStart="?android:attr/dialogPreferredPadding"
+        android:paddingEnd="?android:attr/dialogPreferredPadding"
+        android:orientation="vertical">
+    <TextView
+        android:id="@+id/dialog_title"
+        android:gravity="center"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingTop="15dp"
+        android:textSize="20sp"
+        android:textColor="?android:attr/textColorPrimary"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Title" />
+</LinearLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 5f83fd1..3978c89 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> bykomende items</item>
       <item quantity="one">Plus <xliff:g id="COUNT_0">^1</xliff:g> bykomende item</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Maak programkas skoon met <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> wil \'n paar tydelike lêers uitvee. As jy aanvaar, kan dit battery- of datagebruik verhoog."</string>
+    <string name="allow" msgid="8885707816848569619">"Laat toe"</string>
+    <string name="deny" msgid="6040983710442068936">"Weier"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Laat <xliff:g id="APP_NAME_1">^1</xliff:g> toe om <xliff:g id="COUNT">^2</xliff:g> klanklêers te verander?</item>
       <item quantity="one">Laat <xliff:g id="APP_NAME_0">^1</xliff:g> toe om hierdie klanklêer te verander?</item>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 44dbb78..c017397 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="one">እንዲሁም <xliff:g id="COUNT_1">^1</xliff:g> ተጨማሪ ንጥሎች</item>
       <item quantity="other">እንዲሁም <xliff:g id="COUNT_1">^1</xliff:g> ተጨማሪ ንጥሎች</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"የ<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> የመተግበሪያ መሸጎጫ ይጽዳ?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> አንዳንድ ጊዜያዊ ፋይሎችን ማጽዳት ይፈልጋል። መቀበል የባትሪ ወይም የውሂብ አጠቃቀምን ሊጨምር ይችላል።"</string>
+    <string name="allow" msgid="8885707816848569619">"ፍቀድ"</string>
+    <string name="deny" msgid="6040983710442068936">"ከልክል"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one"><xliff:g id="APP_NAME_1">^1</xliff:g> <xliff:g id="COUNT">^2</xliff:g> ኦዲዮ ፋይሎችን እንዲለውጥ ይፈቀድ?</item>
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> <xliff:g id="COUNT">^2</xliff:g> ኦዲዮ ፋይሎችን እንዲለውጥ ይፈቀድ?</item>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 2b2853b..86b3ec8 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -38,6 +38,14 @@
       <item quantity="other">و<xliff:g id="COUNT_1">^1</xliff:g> عنصر إضافي</item>
       <item quantity="one">وعنصر إضافي واحد (<xliff:g id="COUNT_0">^1</xliff:g>)</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="zero">هل تريد السماح لتطبيق <xliff:g id="APP_NAME_1">^1</xliff:g> بتغيير<xliff:g id="COUNT">^2</xliff:g> ملف صوت؟</item>
       <item quantity="two">هل تريد السماح لتطبيق <xliff:g id="APP_NAME_1">^1</xliff:g> بتغيير ملفَي صوت (<xliff:g id="COUNT">^2</xliff:g>)؟</item>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 2a72836..7141216 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">আৰু <xliff:g id="COUNT_1">^1</xliff:g> টা অতিৰিক্ত বস্তু</item>
       <item quantity="other">আৰু <xliff:g id="COUNT_1">^1</xliff:g> টা অতিৰিক্ত বস্তু</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one"><xliff:g id="APP_NAME_1">^1</xliff:g>ক <xliff:g id="COUNT">^2</xliff:g> টা অডিঅ’ ফাইল সলনি কৰিবলৈ দিবনে?</item>
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g>ক <xliff:g id="COUNT">^2</xliff:g> টা অডিঅ’ ফাইল সলনি কৰিবলৈ দিবনে?</item>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index ab86310..9956d93 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Üstəgəl <xliff:g id="COUNT_1">^1</xliff:g> əlavə element</item>
       <item quantity="one">Üstəgəl <xliff:g id="COUNT_0">^1</xliff:g> əlavə element</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> <xliff:g id="COUNT">^2</xliff:g> audio faylı dəyişsin?</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g> bu audio faylını dəyişsin?</item>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 50c5f2b..4110e83 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -35,6 +35,10 @@
       <item quantity="few">I još <xliff:g id="COUNT_1">^1</xliff:g> stavke</item>
       <item quantity="other">I još <xliff:g id="COUNT_1">^1</xliff:g> stavki</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Želite da obrišete keš aplikacije uz <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> želi da obriše neke privremene datoteke. Prihvatanje može da poveća potrošnju baterije ili podataka."</string>
+    <string name="allow" msgid="8885707816848569619">"Dozvoli"</string>
+    <string name="deny" msgid="6040983710442068936">"Odbij"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Želite li da dozvolite da <xliff:g id="APP_NAME_1">^1</xliff:g> promeni <xliff:g id="COUNT">^2</xliff:g> audio datoteku?</item>
       <item quantity="few">Želite li da dozvolite da <xliff:g id="APP_NAME_1">^1</xliff:g> promeni <xliff:g id="COUNT">^2</xliff:g> audio datoteke?</item>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 7d8a655..dcc2212 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -36,6 +36,14 @@
       <item quantity="many">Плюс <xliff:g id="COUNT_1">^1</xliff:g> дадатковых элементаў</item>
       <item quantity="other">Плюс <xliff:g id="COUNT_1">^1</xliff:g> дадатковага элемента</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Дазволіць праграме \"<xliff:g id="APP_NAME_1">^1</xliff:g>\" змяніць <xliff:g id="COUNT">^2</xliff:g> аўдыяфайл?</item>
       <item quantity="few">Дазволіць праграме \"<xliff:g id="APP_NAME_1">^1</xliff:g>\" змяніць <xliff:g id="COUNT">^2</xliff:g> аўдыяфайлы?</item>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 94fa033..c3a5fdd 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">И още <xliff:g id="COUNT_1">^1</xliff:g> допълнителни елемента</item>
       <item quantity="one">И още <xliff:g id="COUNT_0">^1</xliff:g> допълнителен елемент</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Разрешавате ли на <xliff:g id="APP_NAME_1">^1</xliff:g> да промени <xliff:g id="COUNT">^2</xliff:g> аудиофайла?</item>
       <item quantity="one">Разрешавате ли на <xliff:g id="APP_NAME_0">^1</xliff:g> да промени този аудиофайл?</item>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index e4f04a7..b30a06e 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">এছাড়াও <xliff:g id="COUNT_1">^1</xliff:g>টি অতিরিক্ত আইটেম</item>
       <item quantity="other">এছাড়াও <xliff:g id="COUNT_1">^1</xliff:g>টি অতিরিক্ত আইটেম</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one"><xliff:g id="APP_NAME_1">^1</xliff:g> অ্যাপটিকে <xliff:g id="COUNT">^2</xliff:g>টি অডিও ফাইল পরিবর্তন করার অনুমতি দিতে চান?</item>
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> অ্যাপটিকে <xliff:g id="COUNT">^2</xliff:g>টি অডিও ফাইল পরিবর্তন করার অনুমতি দিতে চান?</item>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 2d1212d..f4c6e06 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -35,6 +35,14 @@
       <item quantity="few">Još <xliff:g id="COUNT_1">^1</xliff:g> dodatne stavke</item>
       <item quantity="other">Još <xliff:g id="COUNT_1">^1</xliff:g> dodatnih stavki</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Dozvoliti da <xliff:g id="APP_NAME_1">^1</xliff:g> promijeni <xliff:g id="COUNT">^2</xliff:g> audio fajl?</item>
       <item quantity="few">Dozvoliti da <xliff:g id="APP_NAME_1">^1</xliff:g> promijeni <xliff:g id="COUNT">^2</xliff:g> audio fajla?</item>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 8c1766a..bd86598 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other"><xliff:g id="COUNT_1">^1</xliff:g> elements addicionals més</item>
       <item quantity="one"><xliff:g id="COUNT_0">^1</xliff:g> element addicional més</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Vols permetre que <xliff:g id="APP_NAME_1">^1</xliff:g> modifiqui <xliff:g id="COUNT">^2</xliff:g> fitxers d\'àudio?</item>
       <item quantity="one">Vols permetre que <xliff:g id="APP_NAME_0">^1</xliff:g> modifiqui aquest fitxer d\'àudio?</item>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index ee00e32..6cff580 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -36,6 +36,14 @@
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> dalších položek</item>
       <item quantity="one">Plus <xliff:g id="COUNT_0">^1</xliff:g> další položka</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="few">Nechat aplikaci <xliff:g id="APP_NAME_1">^1</xliff:g> změnit <xliff:g id="COUNT">^2</xliff:g> zvukové soubory?</item>
       <item quantity="many">Nechat aplikaci <xliff:g id="APP_NAME_1">^1</xliff:g> změnit <xliff:g id="COUNT">^2</xliff:g> zvukového souboru?</item>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index d716366..ad185d7 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">Plus <xliff:g id="COUNT_1">^1</xliff:g> andet element</item>
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> andre elementer</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Vil du give <xliff:g id="APP_NAME_1">^1</xliff:g> tilladelse til at ændre <xliff:g id="COUNT">^2</xliff:g> lydfil?</item>
       <item quantity="other">Vil du give <xliff:g id="APP_NAME_1">^1</xliff:g> tilladelse til at ændre <xliff:g id="COUNT">^2</xliff:g> lydfiler?</item>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 2b0140b..7f23dcb 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other"><xliff:g id="COUNT_1">^1</xliff:g> weitere Elemente</item>
       <item quantity="one"><xliff:g id="COUNT_0">^1</xliff:g> weiteres Element</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="COUNT">^2</xliff:g> Audiodateien von <xliff:g id="APP_NAME_1">^1</xliff:g> ändern lassen?</item>
       <item quantity="one">Diese Audiodatei von <xliff:g id="APP_NAME_0">^1</xliff:g> ändern lassen?</item>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 1fa790c..c00e7c9 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Συν <xliff:g id="COUNT_1">^1</xliff:g> επιπλέον στοιχεία</item>
       <item quantity="one">Συν <xliff:g id="COUNT_0">^1</xliff:g> επιπλέον στοιχείο</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Να επιτραπεί στην εφαρμογή <xliff:g id="APP_NAME_1">^1</xliff:g> η αλλαγή <xliff:g id="COUNT">^2</xliff:g> αρχείων ήχου;</item>
       <item quantity="one">Να επιτραπεί στην εφαρμογή <xliff:g id="APP_NAME_0">^1</xliff:g> η αλλαγή αυτού του αρχείου ήχου;</item>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index aeae90e..5bf96c8 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> additional items</item>
       <item quantity="one">Plus <xliff:g id="COUNT_0">^1</xliff:g> additional item</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Clear app cache with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> would like to clear some temporary files. Accepting may increase battery or data use."</string>
+    <string name="allow" msgid="8885707816848569619">"Allow"</string>
+    <string name="deny" msgid="6040983710442068936">"Deny"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Let <xliff:g id="APP_NAME_1">^1</xliff:g> change <xliff:g id="COUNT">^2</xliff:g> audio files?</item>
       <item quantity="one">Let <xliff:g id="APP_NAME_0">^1</xliff:g> change this audio file?</item>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index aeae90e..5bf96c8 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> additional items</item>
       <item quantity="one">Plus <xliff:g id="COUNT_0">^1</xliff:g> additional item</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Clear app cache with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> would like to clear some temporary files. Accepting may increase battery or data use."</string>
+    <string name="allow" msgid="8885707816848569619">"Allow"</string>
+    <string name="deny" msgid="6040983710442068936">"Deny"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Let <xliff:g id="APP_NAME_1">^1</xliff:g> change <xliff:g id="COUNT">^2</xliff:g> audio files?</item>
       <item quantity="one">Let <xliff:g id="APP_NAME_0">^1</xliff:g> change this audio file?</item>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index aeae90e..5bf96c8 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> additional items</item>
       <item quantity="one">Plus <xliff:g id="COUNT_0">^1</xliff:g> additional item</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Clear app cache with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> would like to clear some temporary files. Accepting may increase battery or data use."</string>
+    <string name="allow" msgid="8885707816848569619">"Allow"</string>
+    <string name="deny" msgid="6040983710442068936">"Deny"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Let <xliff:g id="APP_NAME_1">^1</xliff:g> change <xliff:g id="COUNT">^2</xliff:g> audio files?</item>
       <item quantity="one">Let <xliff:g id="APP_NAME_0">^1</xliff:g> change this audio file?</item>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index aeae90e..5bf96c8 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> additional items</item>
       <item quantity="one">Plus <xliff:g id="COUNT_0">^1</xliff:g> additional item</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Clear app cache with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> would like to clear some temporary files. Accepting may increase battery or data use."</string>
+    <string name="allow" msgid="8885707816848569619">"Allow"</string>
+    <string name="deny" msgid="6040983710442068936">"Deny"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Let <xliff:g id="APP_NAME_1">^1</xliff:g> change <xliff:g id="COUNT">^2</xliff:g> audio files?</item>
       <item quantity="one">Let <xliff:g id="APP_NAME_0">^1</xliff:g> change this audio file?</item>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index f4be72d..bd973e9 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‎Plus ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">^1</xliff:g>‎‏‎‎‏‏‏‎ additional items‎‏‎‎‏‎</item>
       <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‎Plus ‎‏‎‎‏‏‎<xliff:g id="COUNT_0">^1</xliff:g>‎‏‎‎‏‏‏‎ additional item‎‏‎‎‏‎</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‎‎‎‎‎‏‏‎‎‎‎‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‎‎‏‏‎‎‎‏‎‎‏‎‏‏‎Clear app cache with ‎‏‎‎‏‏‎<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>‎‏‎‎‏‏‏‎ would like to clear some temporary files. Accepting may increase battery or data use.‎‏‎‎‏‎"</string>
+    <string name="allow" msgid="8885707816848569619">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎Allow‎‏‎‎‏‎"</string>
+    <string name="deny" msgid="6040983710442068936">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‎‏‏‎‏‏‏‏‎‎‏‎‎‎‎Deny‎‏‎‎‏‎"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎Let ‎‏‎‎‏‏‎<xliff:g id="APP_NAME_1">^1</xliff:g>‎‏‎‎‏‏‏‎ change ‎‏‎‎‏‏‎<xliff:g id="COUNT">^2</xliff:g>‎‏‎‎‏‏‏‎ audio files?‎‏‎‎‏‎</item>
       <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎Let ‎‏‎‎‏‏‎<xliff:g id="APP_NAME_0">^1</xliff:g>‎‏‎‎‏‏‏‎ change this audio file?‎‏‎‎‏‎</item>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index e96da7c..71d8652 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other"><xliff:g id="COUNT_1">^1</xliff:g> elementos adicionales</item>
       <item quantity="one"><xliff:g id="COUNT_0">^1</xliff:g> elemento adicional</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">¿Quieres permitir que <xliff:g id="APP_NAME_1">^1</xliff:g> cambie <xliff:g id="COUNT">^2</xliff:g> archivos de audio?</item>
       <item quantity="one">¿Quieres permitir que <xliff:g id="APP_NAME_0">^1</xliff:g> cambie este archivo de audio?</item>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index ccc33ba..b559c23 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Y <xliff:g id="COUNT_1">^1</xliff:g> elementos más</item>
       <item quantity="one">Y <xliff:g id="COUNT_0">^1</xliff:g> elemento más</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">¿Quieres permitir que <xliff:g id="APP_NAME_1">^1</xliff:g> cambie <xliff:g id="COUNT">^2</xliff:g> archivos de audio?</item>
       <item quantity="one">¿Quieres permitir que <xliff:g id="APP_NAME_0">^1</xliff:g> cambie este archivo de audio?</item>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 309b53f..4c1921e 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Veel <xliff:g id="COUNT_1">^1</xliff:g> lisaüksust</item>
       <item quantity="one">Veel <xliff:g id="COUNT_0">^1</xliff:g> lisaüksus</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Kas lubada rakendusel <xliff:g id="APP_NAME_1">^1</xliff:g> <xliff:g id="COUNT">^2</xliff:g> helifaili muuta?</item>
       <item quantity="one">Kas lubada rakendusel <xliff:g id="APP_NAME_0">^1</xliff:g> seda helifaili muuta?</item>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index c36bc39..5f08bcd 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Eta beste <xliff:g id="COUNT_1">^1</xliff:g> elementu</item>
       <item quantity="one">Eta beste <xliff:g id="COUNT_0">^1</xliff:g> elementu</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="COUNT">^2</xliff:g> audio-fitxategi aldatzen utzi nahi diozu <xliff:g id="APP_NAME_1">^1</xliff:g> aplikazioari?</item>
       <item quantity="one">Audio-fitxategi hau aldatzen utzi nahi diozu <xliff:g id="APP_NAME_0">^1</xliff:g> aplikazioari?</item>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 371675d..d002a45 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">به‌علاوه <xliff:g id="COUNT_1">^1</xliff:g> مورد دیگر</item>
       <item quantity="other">به‌علاوه <xliff:g id="COUNT_1">^1</xliff:g> مورد دیگر</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">به <xliff:g id="APP_NAME_1">^1</xliff:g> اجازه می‌دهید <xliff:g id="COUNT">^2</xliff:g> فایل صوتی را تغییر دهد؟</item>
       <item quantity="other">به <xliff:g id="APP_NAME_1">^1</xliff:g> اجازه می‌دهید <xliff:g id="COUNT">^2</xliff:g> فایل صوتی را تغییر دهد؟</item>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index dee237e..2d2a2bc 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Ja <xliff:g id="COUNT_1">^1</xliff:g> muuta asiaa</item>
       <item quantity="one">Ja <xliff:g id="COUNT_0">^1</xliff:g> muu asia</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Saako <xliff:g id="APP_NAME_1">^1</xliff:g> muokata <xliff:g id="COUNT">^2</xliff:g> audiotiedostoa?</item>
       <item quantity="one">Saako <xliff:g id="APP_NAME_0">^1</xliff:g> muokata tätä audiotiedostoa?</item>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index a57dfcb..e056c0c 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">Plus <xliff:g id="COUNT_1">^1</xliff:g> élément supplémentaire</item>
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> éléments supplémentaires</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Autoriser <xliff:g id="APP_NAME_1">^1</xliff:g> à modifier <xliff:g id="COUNT">^2</xliff:g> fichier audio?</item>
       <item quantity="other">Autoriser <xliff:g id="APP_NAME_1">^1</xliff:g> à modifier <xliff:g id="COUNT">^2</xliff:g> fichiers audio?</item>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index e9f5ed5..a60a92d 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">Plus <xliff:g id="COUNT_1">^1</xliff:g> autre élément</item>
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> autres éléments</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Autoriser <xliff:g id="APP_NAME_1">^1</xliff:g> à modifier <xliff:g id="COUNT">^2</xliff:g> fichier audio ?</item>
       <item quantity="other">Autoriser <xliff:g id="APP_NAME_1">^1</xliff:g> à modifier <xliff:g id="COUNT">^2</xliff:g> fichiers audio ?</item>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index cde584d..8020588 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">E <xliff:g id="COUNT_1">^1</xliff:g> elementos adicionais</item>
       <item quantity="one">E <xliff:g id="COUNT_0">^1</xliff:g> elemento adicional</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Queres permitir que <xliff:g id="APP_NAME_1">^1</xliff:g> cambie <xliff:g id="COUNT">^2</xliff:g> ficheiros de audio?</item>
       <item quantity="one">Queres permitir que <xliff:g id="APP_NAME_0">^1</xliff:g> cambie este ficheiro de audio?</item>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 59e674d..a48e282 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">ઉપરાંત <xliff:g id="COUNT_1">^1</xliff:g> વધારાની આઇટમ</item>
       <item quantity="other">ઉપરાંત <xliff:g id="COUNT_1">^1</xliff:g> વધારાની આઇટમ</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one"><xliff:g id="APP_NAME_1">^1</xliff:g>ને <xliff:g id="COUNT">^2</xliff:g> ઑડિયો ફાઇલમાં ફેરફાર કરવાની મંજૂરી આપીએ?</item>
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g>ને <xliff:g id="COUNT">^2</xliff:g> ઑડિયો ફાઇલમાં ફેરફાર કરવાની મંજૂરી આપીએ?</item>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 95e855a..341bf54 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">अन्य <xliff:g id="COUNT_1">^1</xliff:g> आइटम</item>
       <item quantity="other">अन्य <xliff:g id="COUNT_1">^1</xliff:g> आइटम</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one"><xliff:g id="APP_NAME_1">^1</xliff:g> को <xliff:g id="COUNT">^2</xliff:g> ऑडियो फ़ाइलों को बदलने की अनुमति दें?</item>
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> को <xliff:g id="COUNT">^2</xliff:g> ऑडियो फ़ाइलों को बदलने की अनुमति दें?</item>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index c43e640..317839d 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -35,6 +35,14 @@
       <item quantity="few">Plus sljedeći broj dodatnih stavki: <xliff:g id="COUNT_1">^1</xliff:g></item>
       <item quantity="other">Plus sljedeći broj dodatnih stavki: <xliff:g id="COUNT_1">^1</xliff:g></item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Dopustiti aplikaciji <xliff:g id="APP_NAME_1">^1</xliff:g> promjenu sljedećeg broja audiodatoteka: <xliff:g id="COUNT">^2</xliff:g>?</item>
       <item quantity="few">Dopustiti aplikaciji <xliff:g id="APP_NAME_1">^1</xliff:g> promjenu sljedećeg broja audiodatoteka: <xliff:g id="COUNT">^2</xliff:g>?</item>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 376bfe9..45a2082 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">És további <xliff:g id="COUNT_1">^1</xliff:g> elem</item>
       <item quantity="one">És további <xliff:g id="COUNT_0">^1</xliff:g> elem</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Engedélyezi a(z) <xliff:g id="APP_NAME_1">^1</xliff:g> alkalmazás számára ennek a(z) <xliff:g id="COUNT">^2</xliff:g> hangfájlnak a módosítását?</item>
       <item quantity="one">Engedélyezi a(z) <xliff:g id="APP_NAME_0">^1</xliff:g> alkalmazás számára ennek a hangfájlnak a módosítását?</item>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index e885d48..6cc2148 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="one">Ու ևս <xliff:g id="COUNT_1">^1</xliff:g> լրացուցիչ տարր</item>
       <item quantity="other">Ու ևս <xliff:g id="COUNT_1">^1</xliff:g> լրացուցիչ տարր</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Մաքրե՞լ հավելվածի քեշը <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> հավելվածի օգնությամբ"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> հավելվածին անհրաժեշտ է մաքրել որոշ ժամանակավոր ֆայլեր։ Թույլատրելու դեպքում մարտկոցի կամ բջջային ինտերնետի ծախսը կարող է մեծանալ։"</string>
+    <string name="allow" msgid="8885707816848569619">"Թույլատրել"</string>
+    <string name="deny" msgid="6040983710442068936">"Մերժել"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Թույլատրե\"լ <xliff:g id="APP_NAME_1">^1</xliff:g> հավելվածին փոխել <xliff:g id="COUNT">^2</xliff:g> աուդիո ֆայլ</item>
       <item quantity="other">Թույլատրե\"լ <xliff:g id="APP_NAME_1">^1</xliff:g> հավելվածին փոխել <xliff:g id="COUNT">^2</xliff:g> աուդիո ֆայլ</item>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 92b2c09..05705a6 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> item tambahan</item>
       <item quantity="one">Plus <xliff:g id="COUNT_0">^1</xliff:g> item tambahan</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Hapus cache aplikasi dengan <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ingin menghapus beberapa file sementara. Jika diizinkan, penggunaan baterai atau data dapat meningkat."</string>
+    <string name="allow" msgid="8885707816848569619">"Izinkan"</string>
+    <string name="deny" msgid="6040983710442068936">"Tolak"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Izinkan <xliff:g id="APP_NAME_1">^1</xliff:g> mengubah <xliff:g id="COUNT">^2</xliff:g> file audio?</item>
       <item quantity="one">Izinkan <xliff:g id="APP_NAME_0">^1</xliff:g> mengubah file audio ini?</item>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 46bc97c..2ac0b25 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">Auk <xliff:g id="COUNT_1">^1</xliff:g> atriðis til viðbótar</item>
       <item quantity="other">Auk <xliff:g id="COUNT_1">^1</xliff:g> atriða til viðbótar</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Leyfa <xliff:g id="APP_NAME_1">^1</xliff:g> að breyta <xliff:g id="COUNT">^2</xliff:g> hljóðskrá?</item>
       <item quantity="other">Leyfa <xliff:g id="APP_NAME_1">^1</xliff:g> að breyta <xliff:g id="COUNT">^2</xliff:g> hljóðskrám?</item>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 3f0bc91..bb9f68b 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Più altri <xliff:g id="COUNT_1">^1</xliff:g> elementi</item>
       <item quantity="one">Più <xliff:g id="COUNT_0">^1</xliff:g> altro elemento</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Vuoi consentire all\'app <xliff:g id="APP_NAME_1">^1</xliff:g> di modificare <xliff:g id="COUNT">^2</xliff:g> file audio?</item>
       <item quantity="one">Vuoi consentire all\'app <xliff:g id="APP_NAME_0">^1</xliff:g> di modificare questo file audio?</item>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 9115200..f1ce7cf 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -36,6 +36,14 @@
       <item quantity="other">ועוד <xliff:g id="COUNT_1">^1</xliff:g> פריטים נוספים</item>
       <item quantity="one">ועוד פריט אחד נוסף (<xliff:g id="COUNT_0">^1</xliff:g>)</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="two">לאפשר לאפליקציה <xliff:g id="APP_NAME_1">^1</xliff:g> לשנות <xliff:g id="COUNT">^2</xliff:g> קובצי אודיו?</item>
       <item quantity="many">לאפשר לאפליקציה <xliff:g id="APP_NAME_1">^1</xliff:g> לשנות <xliff:g id="COUNT">^2</xliff:g> קובצי אודיו?</item>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index c763f6b..cd72f53 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">他 <xliff:g id="COUNT_1">^1</xliff:g> 件の項目</item>
       <item quantity="one">他 <xliff:g id="COUNT_0">^1</xliff:g> 件の項目</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>でアプリのキャッシュを削除しますか?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>が一部の一時ファイルを削除する権限を求めています。許可すると、電池やデータの使用量が増加することがあります。"</string>
+    <string name="allow" msgid="8885707816848569619">"許可"</string>
+    <string name="deny" msgid="6040983710442068936">"許可しない"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="COUNT">^2</xliff:g> 件の音声ファイルの変更を <xliff:g id="APP_NAME_1">^1</xliff:g> に許可しますか?</item>
       <item quantity="one">この音声ファイルの変更を <xliff:g id="APP_NAME_0">^1</xliff:g> に許可しますか?</item>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 7d2bae8..c74d862 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">და კიდევ <xliff:g id="COUNT_1">^1</xliff:g> დამატებითი ერთეული</item>
       <item quantity="one">და კიდევ <xliff:g id="COUNT_0">^1</xliff:g> დამატებითი ერთეული</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">აძლევთ უფლებას <xliff:g id="APP_NAME_1">^1</xliff:g>-ს, შეცვალოს <xliff:g id="COUNT">^2</xliff:g> აუდიოფაილი?</item>
       <item quantity="one">აძლევთ უფლებას <xliff:g id="APP_NAME_0">^1</xliff:g>-ს, შეცვალოს ეს აუდიოფაილი?</item>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 97808b0..dae5bbc 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Тағы <xliff:g id="COUNT_1">^1</xliff:g> элемент</item>
       <item quantity="one">Тағы <xliff:g id="COUNT_0">^1</xliff:g> элемент</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> қолданбасына <xliff:g id="COUNT">^2</xliff:g> аудиофайлды өзгертуге рұқсат етесіз бе?</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g> қолданбасына осы аудиофайлды өзгертуге рұқсат етесіз бе?</item>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 990df6b..336e0a2 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">បូករួម​ទាំង​ធាតុ <xliff:g id="COUNT_1">^1</xliff:g> បន្ថែម​ទៀត</item>
       <item quantity="one">បូករួម​ទាំង​ធាតុ <xliff:g id="COUNT_0">^1</xliff:g> បន្ថែម​ទៀត</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">អនុញ្ញាត​ឱ្យ <xliff:g id="APP_NAME_1">^1</xliff:g> ប្ដូរ​ឯកសារ​សំឡេង <xliff:g id="COUNT">^2</xliff:g> ឬ​?</item>
       <item quantity="one">អនុញ្ញាត​ឱ្យ <xliff:g id="APP_NAME_0">^1</xliff:g> ប្ដូរ​ឯកសារ​សំឡេង​នេះ​ឬ​?</item>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 13db74e..570d8ee 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">ಜೊತೆಗೆ <xliff:g id="COUNT_1">^1</xliff:g> ಹೆಚ್ಚುವರಿ ಐಟಂಗಳು</item>
       <item quantity="other">ಜೊತೆಗೆ <xliff:g id="COUNT_1">^1</xliff:g> ಹೆಚ್ಚುವರಿ ಐಟಂಗಳು</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">ಈ <xliff:g id="COUNT">^2</xliff:g> ಆಡಿಯೋ ಫೈಲ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಲು <xliff:g id="APP_NAME_1">^1</xliff:g> ಗೆ ಅನುಮತಿಸುವುದೇ?</item>
       <item quantity="other">ಈ <xliff:g id="COUNT">^2</xliff:g> ಆಡಿಯೋ ಫೈಲ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಲು <xliff:g id="APP_NAME_1">^1</xliff:g> ಗೆ ಅನುಮತಿಸುವುದೇ?</item>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 08d1d1e..1618e26 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">그 외 항목 <xliff:g id="COUNT_1">^1</xliff:g>개</item>
       <item quantity="one">그 외 항목 <xliff:g id="COUNT_0">^1</xliff:g>개</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g>에서 오디오 파일 <xliff:g id="COUNT">^2</xliff:g>개를 변경하도록 허용하시겠습니까?</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g>에서 이 오디오 파일을 변경하도록 허용하시겠습니까?</item>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 704159e..246240a 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Дагы <xliff:g id="COUNT_1">^1</xliff:g> нерсе</item>
       <item quantity="one">Дагы <xliff:g id="COUNT_0">^1</xliff:g> нерсе</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> бул <xliff:g id="COUNT">^2</xliff:g> аудио файлды өзгөртсүнбү?</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g> бул аудио файлды өзгөртсүнбү?</item>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 956b2b5..8233821 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">ຮວມ <xliff:g id="COUNT_1">^1</xliff:g> ລາຍການເພີ່ມເຕີມ</item>
       <item quantity="one">ຮວມ <xliff:g id="COUNT_0">^1</xliff:g> ລາຍການເພີ່ມເຕີມ</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"ລ້າງແຄສແອັບກັບ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ບໍ?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ຕ້ອງການລ້າງໄຟລ໌ຊົ່ວຄາວບາງຢ່າງອອກ. ການຍອມຮັບອາດເພີ່ມການໃຊ້ແບັດເຕີຣີ ຫຼື ອິນເຕີເນັດ."</string>
+    <string name="allow" msgid="8885707816848569619">"ອະນຸຍາດ"</string>
+    <string name="deny" msgid="6040983710442068936">"ປະຕິເສດ"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">ໃຫ້ <xliff:g id="APP_NAME_1">^1</xliff:g> ປ່ຽນ <xliff:g id="COUNT">^2</xliff:g> ໄຟລ໌ສຽງບໍ?</item>
       <item quantity="one">ໃຫ້ <xliff:g id="APP_NAME_0">^1</xliff:g> ປ່ຽນໄຟລ໌ສຽງນີ້ບໍ?</item>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 56bcee7..a60450d 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -36,6 +36,10 @@
       <item quantity="many">Dar <xliff:g id="COUNT_1">^1</xliff:g> papildomo elemento</item>
       <item quantity="other">Dar <xliff:g id="COUNT_1">^1</xliff:g> papildomų elementų</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Išvalyti programos talpyklą naudojant programą „<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>“?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"Programa „<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>“ nori išvalyti kai kuriuos laikinus failus. Jei sutiksite, gali būti sunaudojama daugiau akumuliatoriaus energijos ar duomenų."</string>
+    <string name="allow" msgid="8885707816848569619">"Leisti"</string>
+    <string name="deny" msgid="6040983710442068936">"Atmesti"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Leisti programai „<xliff:g id="APP_NAME_1">^1</xliff:g>“ keisti <xliff:g id="COUNT">^2</xliff:g> garso failą?</item>
       <item quantity="few">Leisti programai „<xliff:g id="APP_NAME_1">^1</xliff:g>“ keisti <xliff:g id="COUNT">^2</xliff:g> garso failus?</item>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 22bc209..e9694e7 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -35,6 +35,14 @@
       <item quantity="one">Un vēl <xliff:g id="COUNT_1">^1</xliff:g> vienums</item>
       <item quantity="other">Un vēl <xliff:g id="COUNT_1">^1</xliff:g> vienumi</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="zero">Vai atļaujat lietotnei <xliff:g id="APP_NAME_1">^1</xliff:g> mainīt <xliff:g id="COUNT">^2</xliff:g> audio failus?</item>
       <item quantity="one">Vai atļaujat lietotnei <xliff:g id="APP_NAME_1">^1</xliff:g> mainīt <xliff:g id="COUNT">^2</xliff:g> audio failu?</item>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 7f9f663..c7fc283 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="one">Плус <xliff:g id="COUNT_1">^1</xliff:g> дополнителна ставка</item>
       <item quantity="other">Плус <xliff:g id="COUNT_1">^1</xliff:g> дополнителни ставки</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Да се исчисти кешот на апликацијата со <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> сака да избрише некои привремени датотеки. Ако прифатите, може да се зголеми користењето на батеријата или податоците."</string>
+    <string name="allow" msgid="8885707816848569619">"Дозволи"</string>
+    <string name="deny" msgid="6040983710442068936">"Одбиј"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Да се дозволи <xliff:g id="APP_NAME_1">^1</xliff:g> да измени <xliff:g id="COUNT">^2</xliff:g> аудиодатотека?</item>
       <item quantity="other">Да се дозволи <xliff:g id="APP_NAME_1">^1</xliff:g> да измени <xliff:g id="COUNT">^2</xliff:g> аудиодатотеки?</item>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index f6dde41..37f5858 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other"><xliff:g id="COUNT_1">^1</xliff:g> അധിക ഇനങ്ങൾ കൂടി</item>
       <item quantity="one"><xliff:g id="COUNT_0">^1</xliff:g> അധിക ഇനം കൂടി</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="COUNT">^2</xliff:g> ഓഡിയോ ഫയലുകൾ മാറ്റാൻ <xliff:g id="APP_NAME_1">^1</xliff:g> എന്നതിനെ അനുവദിക്കണോ?</item>
       <item quantity="one">ഈ ഓഡിയോ ഫയൽ മാറ്റാൻ <xliff:g id="APP_NAME_0">^1</xliff:g> എന്നതിനെ അനുവദിക്കണോ?</item>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index a4d604b..12062c7 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Нэмээд нэмэлт <xliff:g id="COUNT_1">^1</xliff:g> зүйл</item>
       <item quantity="one">Нэмээд нэмэлт <xliff:g id="COUNT_0">^1</xliff:g> зүйл</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g>-д <xliff:g id="COUNT">^2</xliff:g> аудио файл өөрчлөхийг зөвшөөрөх үү?</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g>-д энэ аудио файлыг өөрчлөхийг зөвшөөрөх үү?</item>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 148851a..a2b8fab 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">आणखी <xliff:g id="COUNT_1">^1</xliff:g> अतिरिक्त आयटम</item>
       <item quantity="one">आणखी <xliff:g id="COUNT_0">^1</xliff:g> अतिरिक्त आयटम</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> ला <xliff:g id="COUNT">^2</xliff:g> ऑडिओ फाइल बदलण्याची परवानगी द्यायची आहे का?</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g> ला ही ऑडिओ फाइल बदलण्याची परवानगी द्यायची आहे का?</item>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 30be6ae..f1cbbf9 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Serta <xliff:g id="COUNT_1">^1</xliff:g> item tambahan</item>
       <item quantity="one">Serta <xliff:g id="COUNT_0">^1</xliff:g> item tambahan</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Benarkan <xliff:g id="APP_NAME_1">^1</xliff:g> menukar <xliff:g id="COUNT">^2</xliff:g> fail audio?</item>
       <item quantity="one">Benarkan <xliff:g id="APP_NAME_0">^1</xliff:g> menukar fail audio ini?</item>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index feb2681..5c9aeb6 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">ထပ်ပေါင်းအရာ <xliff:g id="COUNT_1">^1</xliff:g> ခု အပါအဝင်</item>
       <item quantity="one">ထပ်ပေါင်းအရာ <xliff:g id="COUNT_0">^1</xliff:g> ခု အပါအဝင်</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> အား အသံဖိုင် <xliff:g id="COUNT">^2</xliff:g> ခုကို ပြောင်းလဲခွင့်ပြုမလား။</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g> အား ဤအသံဖိုင်ကို ပြောင်းလဲခွင့်ပြုမလား။</item>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 8ba05f3..be052c1 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Pluss <xliff:g id="COUNT_1">^1</xliff:g> elementer til</item>
       <item quantity="one">Pluss <xliff:g id="COUNT_0">^1</xliff:g> element til</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Vil du la <xliff:g id="APP_NAME_1">^1</xliff:g> endre <xliff:g id="COUNT">^2</xliff:g> lydfiler?</item>
       <item quantity="one">Vil du la <xliff:g id="APP_NAME_0">^1</xliff:g> endre denne lydfilen?</item>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 7f3be89..8e17b57 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">थप <xliff:g id="COUNT_1">^1</xliff:g> वटा अतिरिक्त वस्तु</item>
       <item quantity="one">थप <xliff:g id="COUNT_0">^1</xliff:g> अतिरिक्त वस्तु</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> लाई <xliff:g id="COUNT">^2</xliff:g> वटा अडियो फाइल परिवर्तन गर्न दिने हो?</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g> लाई यो अडियो फाइल परिवर्तन गर्न दिने हो?</item>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index e9a0b86..c3b26eb 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">Plus <xliff:g id="COUNT_1">^1</xliff:g> extra items</item>
       <item quantity="one">Plus <xliff:g id="COUNT_0">^1</xliff:g> extra item</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"App-cache wissen met <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> wil een aantal tijdelijke bestanden wissen. Als je akkoord gaat, kan het batterij- of datagebruik toenemen."</string>
+    <string name="allow" msgid="8885707816848569619">"Toestaan"</string>
+    <string name="deny" msgid="6040983710442068936">"Weigeren"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Toestaan dat <xliff:g id="APP_NAME_1">^1</xliff:g> <xliff:g id="COUNT">^2</xliff:g> audiobestanden wijzigt?</item>
       <item quantity="one">Toestaan dat <xliff:g id="APP_NAME_0">^1</xliff:g> dit audiobestand wijzigt?</item>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 49caac5..a43dc1a 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">ଅଧିକ <xliff:g id="COUNT_1">^1</xliff:g>ଟି ଅତିରିକ୍ତ ଆଇଟମ୍</item>
       <item quantity="one">ଅଧିକ <xliff:g id="COUNT_0">^1</xliff:g>ଟି ଅତିରିକ୍ତ ଆଇଟମ୍</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="COUNT">^2</xliff:g>ଟି ଅଡିଓ ଫାଇଲ୍‌କୁ ବଦଳେଇବା ପାଇଁ <xliff:g id="APP_NAME_1">^1</xliff:g>କୁ ଅନୁମତି ଦେବେ?</item>
       <item quantity="one">ଏହି ଅଡିଓ ଫାଇଲ୍‌କୁ ବଦଳେଇବା ପାଇଁ <xliff:g id="APP_NAME_0">^1</xliff:g>କୁ ଅନୁମତି ଦେବେ?</item>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 8d68686..23a36f6 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">ਇਸ ਤੋਂ ਇਲਾਵਾ <xliff:g id="COUNT_1">^1</xliff:g> ਵਾਧੂ ਆਈਟਮ</item>
       <item quantity="other">ਇਸ ਤੋਂ ਇਲਾਵਾ <xliff:g id="COUNT_1">^1</xliff:g> ਵਾਧੂ ਆਈਟਮਾਂ</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">ਕੀ <xliff:g id="APP_NAME_1">^1</xliff:g> ਨੂੰ <xliff:g id="COUNT">^2</xliff:g> ਆਡੀਓ ਫ਼ਾਈਲ ਨੂੰ ਬਦਲਣ ਦੇਣਾ ਹੈ?</item>
       <item quantity="other">ਕੀ <xliff:g id="APP_NAME_1">^1</xliff:g> ਨੂੰ <xliff:g id="COUNT">^2</xliff:g> ਆਡੀਓ ਫ਼ਾਈਲਾਂ ਨੂੰ ਬਦਲਣ ਦੇਣਾ ਹੈ?</item>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 8444f66..ceda3c2 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -36,6 +36,14 @@
       <item quantity="other">I <xliff:g id="COUNT_1">^1</xliff:g> dodatkowego elementu</item>
       <item quantity="one">I <xliff:g id="COUNT_0">^1</xliff:g> dodatkowy element</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="few">Zezwolić aplikacji <xliff:g id="APP_NAME_1">^1</xliff:g> na zmienianie <xliff:g id="COUNT">^2</xliff:g> plików audio?</item>
       <item quantity="many">Zezwolić aplikacji <xliff:g id="APP_NAME_1">^1</xliff:g> na zmienianie <xliff:g id="COUNT">^2</xliff:g> plików audio?</item>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index c8f530d..efc6c0b 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">Mais <xliff:g id="COUNT_1">^1</xliff:g> item extra</item>
       <item quantity="other">Mais <xliff:g id="COUNT_1">^1</xliff:g> itens extras</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Permitir que o app <xliff:g id="APP_NAME_1">^1</xliff:g> mude <xliff:g id="COUNT">^2</xliff:g> arquivo de áudio?</item>
       <item quantity="other">Permitir que o app <xliff:g id="APP_NAME_1">^1</xliff:g> mude <xliff:g id="COUNT">^2</xliff:g> arquivos de áudio?</item>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 52b45b8..9bedb45 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">E <xliff:g id="COUNT_1">^1</xliff:g> itens adicionais</item>
       <item quantity="one">E <xliff:g id="COUNT_0">^1</xliff:g> item adicional</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Pretende permitir que a aplicação <xliff:g id="APP_NAME_1">^1</xliff:g> altere <xliff:g id="COUNT">^2</xliff:g> ficheiros de áudio?</item>
       <item quantity="one">Pretende permitir que a aplicação <xliff:g id="APP_NAME_0">^1</xliff:g> altere este ficheiro de áudio?</item>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index c8f530d..efc6c0b 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">Mais <xliff:g id="COUNT_1">^1</xliff:g> item extra</item>
       <item quantity="other">Mais <xliff:g id="COUNT_1">^1</xliff:g> itens extras</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Permitir que o app <xliff:g id="APP_NAME_1">^1</xliff:g> mude <xliff:g id="COUNT">^2</xliff:g> arquivo de áudio?</item>
       <item quantity="other">Permitir que o app <xliff:g id="APP_NAME_1">^1</xliff:g> mude <xliff:g id="COUNT">^2</xliff:g> arquivos de áudio?</item>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 3aab7e8..0c3fc33 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -35,6 +35,14 @@
       <item quantity="other">Și încă <xliff:g id="COUNT_1">^1</xliff:g> de elemente</item>
       <item quantity="one">Și încă <xliff:g id="COUNT_0">^1</xliff:g> element</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="few">Lăsați <xliff:g id="APP_NAME_1">^1</xliff:g> să modifice <xliff:g id="COUNT">^2</xliff:g> fișiere audio?</item>
       <item quantity="other">Lăsați <xliff:g id="APP_NAME_1">^1</xliff:g> să modifice <xliff:g id="COUNT">^2</xliff:g> de fișiere audio?</item>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 2404564..6dfd99e 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -36,6 +36,14 @@
       <item quantity="many">и ещё <xliff:g id="COUNT_1">^1</xliff:g> объектов</item>
       <item quantity="other">и ещё <xliff:g id="COUNT_1">^1</xliff:g> объекта</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Разрешить приложению \"<xliff:g id="APP_NAME_1">^1</xliff:g>\" изменить <xliff:g id="COUNT">^2</xliff:g> аудиофайл?</item>
       <item quantity="few">Разрешить приложению \"<xliff:g id="APP_NAME_1">^1</xliff:g>\" изменить <xliff:g id="COUNT">^2</xliff:g> аудиофайла?</item>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 717a6af..f526e25 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">සහ අමතර අයිතම <xliff:g id="COUNT_1">^1</xliff:g></item>
       <item quantity="other">සහ අමතර අයිතම <xliff:g id="COUNT_1">^1</xliff:g></item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one"><xliff:g id="APP_NAME_1">^1</xliff:g>ට ඕඩියෝ ගොනු <xliff:g id="COUNT">^2</xliff:g> වෙනස් කිරීමට ඉඩ දෙන්නද?</item>
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g>ට ඕඩියෝ ගොනු <xliff:g id="COUNT">^2</xliff:g> වෙනස් කිරීමට ඉඩ දෙන්නද?</item>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index ecac4ef..a00d747 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -36,6 +36,14 @@
       <item quantity="other">A <xliff:g id="COUNT_1">^1</xliff:g> ďalších položiek</item>
       <item quantity="one">A <xliff:g id="COUNT_0">^1</xliff:g> ďalšia položka</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="few">Chcete povoliť aplikácii <xliff:g id="APP_NAME_1">^1</xliff:g> zmeniť <xliff:g id="COUNT">^2</xliff:g> zvukové súbory?</item>
       <item quantity="many">Let <xliff:g id="APP_NAME_1">^1</xliff:g> change <xliff:g id="COUNT">^2</xliff:g> audio files?</item>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 4fdc103..b53576a 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -36,6 +36,14 @@
       <item quantity="few">In še <xliff:g id="COUNT_1">^1</xliff:g> dodatni elementi</item>
       <item quantity="other">In še <xliff:g id="COUNT_1">^1</xliff:g> dodatnih elementov</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Želite dovoliti, da aplikacija <xliff:g id="APP_NAME_1">^1</xliff:g> spremeni <xliff:g id="COUNT">^2</xliff:g> zvočno datoteko?</item>
       <item quantity="two">Želite dovoliti, da aplikacija <xliff:g id="APP_NAME_1">^1</xliff:g> spremeni <xliff:g id="COUNT">^2</xliff:g> zvočni datoteki?</item>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 2af7cc4..a284613 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Dhe <xliff:g id="COUNT_1">^1</xliff:g> artikuj të tjerë</item>
       <item quantity="one">Dhe <xliff:g id="COUNT_0">^1</xliff:g> artikull tjetër</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Të lejohet që <xliff:g id="APP_NAME_1">^1</xliff:g> t\'i ndryshojë <xliff:g id="COUNT">^2</xliff:g> skedarë audio?</item>
       <item quantity="one">Të lejohet që <xliff:g id="APP_NAME_0">^1</xliff:g> ta ndryshojë këtë skedar audio?</item>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 00e0ec7..b6da163 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -35,6 +35,10 @@
       <item quantity="few">И још <xliff:g id="COUNT_1">^1</xliff:g> ставке</item>
       <item quantity="other">И још <xliff:g id="COUNT_1">^1</xliff:g> ставки</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Желите да обришете кеш апликације уз <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> жели да обрише неке привремене датотеке. Прихватање може да повећа потрошњу батерије или података."</string>
+    <string name="allow" msgid="8885707816848569619">"Дозволи"</string>
+    <string name="deny" msgid="6040983710442068936">"Одбиј"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Желите ли да дозволите да <xliff:g id="APP_NAME_1">^1</xliff:g> промени <xliff:g id="COUNT">^2</xliff:g> аудио датотеку?</item>
       <item quantity="few">Желите ли да дозволите да <xliff:g id="APP_NAME_1">^1</xliff:g> промени <xliff:g id="COUNT">^2</xliff:g> аудио датотеке?</item>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 3804934..4fe1978 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">och <xliff:g id="COUNT_1">^1</xliff:g> objekt till</item>
       <item quantity="one">och <xliff:g id="COUNT_0">^1</xliff:g> objekt till</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Vill du tillåta att <xliff:g id="APP_NAME_1">^1</xliff:g> ändrar <xliff:g id="COUNT">^2</xliff:g> ljudfilerna?</item>
       <item quantity="one">Vill du tillåta att <xliff:g id="APP_NAME_0">^1</xliff:g> ändrar ljudfilen?</item>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 089152d..7ab06df 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">Pamoja na vipengee <xliff:g id="COUNT_1">^1</xliff:g> zaidi</item>
       <item quantity="one">Pamoja na kipengee <xliff:g id="COUNT_0">^1</xliff:g> zaidi</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Ungependa kufuta akiba ya programu ukitumia <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ingependa kufuta baadhi ya faili za muda. Hatua ya kukubali inaweza kuongeza matumizi ya data au betri."</string>
+    <string name="allow" msgid="8885707816848569619">"Ruhusu"</string>
+    <string name="deny" msgid="6040983710442068936">"Kataa"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Ungependa kuruhusu <xliff:g id="APP_NAME_1">^1</xliff:g> ibadilishe faili hizi <xliff:g id="COUNT">^2</xliff:g> za sauti?</item>
       <item quantity="one">Ungependa kuruhusu <xliff:g id="APP_NAME_0">^1</xliff:g> ibadilishe faili hii ya sauti?</item>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 47d0607..85e2394 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">அத்துடன் கூடுதலாக <xliff:g id="COUNT_1">^1</xliff:g></item>
       <item quantity="one">அத்துடன் கூடுதலாக <xliff:g id="COUNT_0">^1</xliff:g></item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="COUNT">^2</xliff:g> ஆடியோ ஃபைல்களை மாற்ற <xliff:g id="APP_NAME_1">^1</xliff:g> ஆப்ஸை அனுமதிக்கவா?</item>
       <item quantity="one">இந்த ஆடியோ ஃபைலை மாற்ற <xliff:g id="APP_NAME_0">^1</xliff:g> ஆப்ஸை அனுமதிக்கவா?</item>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 234c399..3966ef8 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">దానితో పాటు, <xliff:g id="COUNT_1">^1</xliff:g> అదనపు అంశాలు</item>
       <item quantity="one">దానితో పాటు, <xliff:g id="COUNT_0">^1</xliff:g> అదనపు అంశం</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> <xliff:g id="COUNT">^2</xliff:g> ఆడియో ఫైల్‌లను మార్చడానికి అనుమతిస్తారా?</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g> ఈ ఆడియో ఫైల్‌ను మార్చడానికి అనుమతిస్తారా?</item>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index cf50b0d..098ce0a 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">และอีก <xliff:g id="COUNT_1">^1</xliff:g> รายการ</item>
       <item quantity="one">และอีก <xliff:g id="COUNT_0">^1</xliff:g> รายการ</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">ให้ <xliff:g id="APP_NAME_1">^1</xliff:g> เปลี่ยนแปลงไฟล์เสียง <xliff:g id="COUNT">^2</xliff:g> ไฟล์ไหม</item>
       <item quantity="one">ให้ <xliff:g id="APP_NAME_0">^1</xliff:g> เปลี่ยนแปลงไฟล์เสียงนี้ไหม</item>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 9fe0e2f..b00baa6 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">At <xliff:g id="COUNT_1">^1</xliff:g> pang item</item>
       <item quantity="other">At <xliff:g id="COUNT_1">^1</xliff:g> pang item</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Payagan ang <xliff:g id="APP_NAME_1">^1</xliff:g> na baguhin ang <xliff:g id="COUNT">^2</xliff:g> audio file?</item>
       <item quantity="other">Payagan ang <xliff:g id="APP_NAME_1">^1</xliff:g> na baguhin ang <xliff:g id="COUNT">^2</xliff:g> na audio file?</item>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index b07fa60..5d70cc4 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Ayrıca <xliff:g id="COUNT_1">^1</xliff:g> ek öğe</item>
       <item quantity="one">Ayrıca <xliff:g id="COUNT_0">^1</xliff:g> ek öğe</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> uygulaması <xliff:g id="COUNT">^2</xliff:g> ses dosyasını değiştirsin mi?</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g> uygulaması bu ses dosyasını değiştirsin mi?</item>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 1bc2712..7504e5e 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -36,6 +36,14 @@
       <item quantity="many">Ще <xliff:g id="COUNT_1">^1</xliff:g> додаткових елементів</item>
       <item quantity="other">Ще <xliff:g id="COUNT_1">^1</xliff:g> додаткового елемента</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Дозволити додатку <xliff:g id="APP_NAME_1">^1</xliff:g> змінити <xliff:g id="COUNT">^2</xliff:g> аудіофайл?</item>
       <item quantity="few">Дозволити додатку <xliff:g id="APP_NAME_1">^1</xliff:g> змінити <xliff:g id="COUNT">^2</xliff:g> аудіофайли?</item>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 6de399a..55d528d 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">مزید <xliff:g id="COUNT_1">^1</xliff:g> اضافی آئٹمز</item>
       <item quantity="one">مزید <xliff:g id="COUNT_0">^1</xliff:g> اضافی آئٹم</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> کے <xliff:g id="COUNT">^2</xliff:g> آڈیو فائلز کو تبدیل کرنے دیں؟</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g> کے اس آڈیو فائل کو تبدیل کرنے دیں؟</item>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index ca9891d..fd605b8 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">Yana <xliff:g id="COUNT_1">^1</xliff:g> ta qoʻshimcha element</item>
       <item quantity="one">Yana <xliff:g id="COUNT_0">^1</xliff:g> ta qoʻshimcha element</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"Ilova keshi <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> orqali tozalansinmi?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ayrim vaqtincha fayllarni tozalamoqchi. Ruxsat berilsa, batareya yoki trafik sarfi tejaladi."</string>
+    <string name="allow" msgid="8885707816848569619">"Ruxsat berish"</string>
+    <string name="deny" msgid="6040983710442068936">"Rad etish"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other"><xliff:g id="APP_NAME_1">^1</xliff:g> <xliff:g id="COUNT">^2</xliff:g> ta audio faylni oʻzgartirsinmi?</item>
       <item quantity="one"><xliff:g id="APP_NAME_0">^1</xliff:g> bu audio faylni oʻzgartirsinmi?</item>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index ad66f54..b0c1524 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">Và <xliff:g id="COUNT_1">^1</xliff:g> mục khác</item>
       <item quantity="one">Và <xliff:g id="COUNT_0">^1</xliff:g> mục khác</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">Cho phép <xliff:g id="APP_NAME_1">^1</xliff:g> thay đổi <xliff:g id="COUNT">^2</xliff:g> tệp âm thanh?</item>
       <item quantity="one">Cho phép <xliff:g id="APP_NAME_0">^1</xliff:g> thay đổi tệp âm thanh này?</item>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index c1f3e0f..80e824a 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="other">还有 <xliff:g id="COUNT_1">^1</xliff:g> 项</item>
       <item quantity="one">还有 <xliff:g id="COUNT_0">^1</xliff:g> 项</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">要允许<xliff:g id="APP_NAME_1">^1</xliff:g>更改这 <xliff:g id="COUNT">^2</xliff:g> 个音频文件吗?</item>
       <item quantity="one">要允许<xliff:g id="APP_NAME_0">^1</xliff:g>更改这个音频文件吗?</item>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 035ce74..4c89acd 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">以及另外 <xliff:g id="COUNT_1">^1</xliff:g> 個項目</item>
       <item quantity="one">以及另外 <xliff:g id="COUNT_0">^1</xliff:g> 個項目</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"是否要清除「<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>」的應用程式快取?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"「<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>」要求清除部分臨時檔案。如接受要求,電池或數據用量可能會增加。"</string>
+    <string name="allow" msgid="8885707816848569619">"允許"</string>
+    <string name="deny" msgid="6040983710442068936">"拒絕"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">要允許「<xliff:g id="APP_NAME_1">^1</xliff:g>」變更 <xliff:g id="COUNT">^2</xliff:g> 個音訊檔案嗎?</item>
       <item quantity="one">要允許「<xliff:g id="APP_NAME_0">^1</xliff:g>」變更此音訊檔案嗎?</item>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 9028703..945371c 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -34,6 +34,10 @@
       <item quantity="other">還有另外 <xliff:g id="COUNT_1">^1</xliff:g> 個項目</item>
       <item quantity="one">還有另外 <xliff:g id="COUNT_0">^1</xliff:g> 個項目</item>
     </plurals>
+    <string name="cache_clearing_dialog_title" msgid="543177167845854283">"要使用「<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>」清除應用程式快取嗎?"</string>
+    <string name="cache_clearing_dialog_text" msgid="425995541409682360">"「<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>」想要清除某些暫存檔案。如果你授予權限,可能會增加耗電量或數據用量。"</string>
+    <string name="allow" msgid="8885707816848569619">"允許"</string>
+    <string name="deny" msgid="6040983710442068936">"拒絕"</string>
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="other">要允許「<xliff:g id="APP_NAME_1">^1</xliff:g>」變更 <xliff:g id="COUNT">^2</xliff:g> 個音訊檔案嗎?</item>
       <item quantity="one">要允許「<xliff:g id="APP_NAME_0">^1</xliff:g>」變更這個音訊檔案嗎?</item>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 64947cd..e7ebb87 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -34,6 +34,14 @@
       <item quantity="one">Kanye no-<xliff:g id="COUNT_1">^1</xliff:g> izinto ezingeziwe</item>
       <item quantity="other">Kanye no-<xliff:g id="COUNT_1">^1</xliff:g> izinto ezingeziwe</item>
     </plurals>
+    <!-- no translation found for cache_clearing_dialog_title (543177167845854283) -->
+    <skip />
+    <!-- no translation found for cache_clearing_dialog_text (425995541409682360) -->
+    <skip />
+    <!-- no translation found for allow (8885707816848569619) -->
+    <skip />
+    <!-- no translation found for deny (6040983710442068936) -->
+    <skip />
     <plurals name="permission_write_audio" formatted="false" msgid="3539998638571517689">
       <item quantity="one">Vumela i-<xliff:g id="APP_NAME_1">^1</xliff:g> ukushintsha amafayela omsindo angu-<xliff:g id="COUNT">^2</xliff:g>?</item>
       <item quantity="other">Vumela i-<xliff:g id="APP_NAME_1">^1</xliff:g> ukushintsha amafayela omsindo angu-<xliff:g id="COUNT">^2</xliff:g>?</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0c35d75..04cab66 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -60,6 +60,18 @@
         <item quantity="other">Plus <xliff:g id="count" example="42">^1</xliff:g> additional items</item>
     </plurals>
 
+    <!-- Cache clearing permission dialog warning title. [CHAR LIMIT=NONE] -->
+    <string name="cache_clearing_dialog_title">Clear app cache with <xliff:g id="app_seeking_permission" example="File manager">%s</xliff:g>?</string>
+
+    <!-- Cache clearing permission dialog warning text. [CHAR LIMIT=NONE] -->
+    <string name="cache_clearing_dialog_text"><xliff:g id="app_seeking_permission" example="File manager">%s</xliff:g> would like to clear some temporary files. Accepting may increase battery or data use.</string>
+
+    <!-- Allow dialog action text. [CHAR LIMIT=30] -->
+    <string name="allow">Allow</string>
+
+    <!-- Deny dialog action text. [CHAR LIMIT=30] -->
+    <string name="deny">Deny</string>
+
     <!-- ========================= BEGIN AUTO-GENERATED BY gen_strings.py ========================= -->
 
     <!-- ========================= WRITE STRINGS ========================= -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index d22d9c4..1e866cb 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -19,4 +19,17 @@
     <style name="PickerDialogTheme" parent="@*android:style/Theme.DeviceDefault.Settings.Dialog">
     </style>
 
+    <style name="AlertDialogTheme"
+      parent="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert" />
+
+    <style name="CacheClearingAlertDialogTheme">
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:backgroundDimEnabled">true</item>
+        <item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
+    </style>
+
 </resources>
diff --git a/src/com/android/providers/media/CacheClearingActivity.java b/src/com/android/providers/media/CacheClearingActivity.java
new file mode 100644
index 0000000..f35f8d0
--- /dev/null
+++ b/src/com/android/providers/media/CacheClearingActivity.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.media;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.graphics.Typeface;
+import android.os.Bundle;
+import android.text.BidiFormatter;
+import android.text.SpannableString;
+import android.text.TextPaint;
+import android.text.TextUtils;
+import android.text.style.StyleSpan;
+import android.util.Log;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.TextView;
+
+import com.android.providers.media.util.BackgroundThread;
+
+public class CacheClearingActivity extends Activity implements DialogInterface.OnClickListener {
+    private static final String TAG = "CacheClearingActivity";
+    private static final float MAX_APP_NAME_SIZE_PX = 500f;
+    private static final float TEXT_SIZE = 42f;
+
+    private AlertDialog mDialog;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        final String packageName = getCallingPackage();
+        setResult(RESULT_CANCELED);
+
+        if (packageName == null) {
+            finish();
+            return;
+        }
+
+        final PackageManager packageManager = getPackageManager();
+        final ApplicationInfo aInfo;
+        try {
+            aInfo = packageManager.getApplicationInfo(packageName, 0);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "unable to look up package name", e);
+            finish();
+            return;
+        }
+
+        if (!MediaProvider.hasPermissionToClearCaches(this, aInfo)) {
+            Log.i(TAG, "Calling package " + packageName + " has no permission clear app caches");
+            finish();
+            return;
+        }
+
+        final TextPaint paint = new TextPaint();
+        paint.setTextSize(TEXT_SIZE);
+
+        // If the label contains new line characters it may push the security
+        // message below the fold of the dialog. Labels shouldn't have new line
+        // characters anyways, so we just delete all of the newlines (if there are any).
+        final String label = aInfo.loadSafeLabel(packageManager, MAX_APP_NAME_SIZE_PX,
+                TextUtils.SAFE_STRING_FLAG_SINGLE_LINE).toString();
+
+        final String unsanitizedAppName = TextUtils.ellipsize(label,
+                paint, MAX_APP_NAME_SIZE_PX, TextUtils.TruncateAt.END).toString();
+        final String appName = BidiFormatter.getInstance().unicodeWrap(unsanitizedAppName);
+
+        final String actionText = getString(R.string.cache_clearing_dialog_text, appName);
+        final SpannableString message = new SpannableString(actionText);
+
+        int appNameIndex = actionText.indexOf(appName);
+        if (appNameIndex >= 0) {
+            message.setSpan(new StyleSpan(Typeface.BOLD),
+                    appNameIndex, appNameIndex + appName.length(), 0);
+        }
+        final CharSequence dialogTitle = getString(R.string.cache_clearing_dialog_title, appName);
+
+        final View dialogTitleView = View.inflate(this, R.layout.cache_clearing_dialog, null);
+        final TextView titleText = dialogTitleView.findViewById(R.id.dialog_title);
+        titleText.setText(dialogTitle);
+
+        mDialog = new AlertDialog.Builder(this)
+                .setCustomTitle(dialogTitleView)
+                .setMessage(message)
+                .setPositiveButton(R.string.allow, this)
+                .setNegativeButton(R.string.deny, this)
+                .create();
+
+        mDialog.create();
+        mDialog.getButton(DialogInterface.BUTTON_POSITIVE).setFilterTouchesWhenObscured(true);
+
+        final Window w = mDialog.getWindow();
+        w.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
+        w.addSystemFlags(WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+        mDialog.show();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (mDialog != null) {
+            mDialog.dismiss();
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        try {
+            if (which == AlertDialog.BUTTON_POSITIVE) {
+                BackgroundThread.getExecutor().execute(this::clearAppCache);
+                setResult(RESULT_OK);
+            }
+        } finally {
+            if (mDialog != null) {
+                mDialog.dismiss();
+            }
+            finish();
+        }
+    }
+
+    private void clearAppCache() {
+        MediaProvider.clearAppCacheDirectories();
+    }
+}
diff --git a/src/com/android/providers/media/DatabaseHelper.java b/src/com/android/providers/media/DatabaseHelper.java
index 77592eb..4943d6b 100644
--- a/src/com/android/providers/media/DatabaseHelper.java
+++ b/src/com/android/providers/media/DatabaseHelper.java
@@ -335,7 +335,7 @@
          * {@link ContentResolver#notifyChange}, but are instead being collected
          * due to this ongoing transaction.
          */
-        public final List<Uri> notifyChanges = new ArrayList<>();
+        public final Set<Uri> notifyChanges = new ArraySet<>();
     }
 
     public void beginTransaction() {
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index d09b509..023d723 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -65,6 +65,7 @@
 import static com.android.providers.media.util.FileUtils.isDownload;
 import static com.android.providers.media.util.Logging.LOGV;
 import static com.android.providers.media.util.Logging.TAG;
+import static com.android.providers.media.util.PermissionUtils.checkPermissionManageExternalStorage;
 
 import android.app.AppOpsManager;
 import android.app.AppOpsManager.OnOpActiveChangedListener;
@@ -72,6 +73,9 @@
 import android.app.PendingIntent;
 import android.app.RecoverableSecurityException;
 import android.app.RemoteAction;
+import android.app.compat.CompatChanges;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledAfter;
 import android.content.BroadcastReceiver;
 import android.content.ClipData;
 import android.content.ClipDescription;
@@ -88,6 +92,7 @@
 import android.content.OperationApplicationException;
 import android.content.SharedPreferences;
 import android.content.UriMatcher;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInstaller.SessionInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -186,7 +191,6 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -223,6 +227,15 @@
     private static final String PROP_FUSE = "persist.sys.fuse";
 
     /**
+     * App Compatibility flag that indicates whether the app is in scoped storage or not.
+     *
+     * SCOPED_STORAGE is the Change Name and 132649864 the Change ID. Using the buganizer issue ID
+     * as the Change ID for uniqueness as documented here go/compat-framework.
+     */
+    @ChangeId
+    private static final long SCOPED_STORAGE = 132649864L;
+
+    /**
      * These directory names aren't declared in Environment as final variables, and so we need to
      * have the same values in separate final variables in order to have them considered constant
      * expressions.
@@ -808,6 +821,39 @@
         scanFile(new File(file), REASON_DEMAND);
     }
 
+    /**
+     * Returns true if the app denoted by the given {@code uid} and {@code packageName} is allowed
+     * to clear other apps' cache directories.
+     */
+    static boolean hasPermissionToClearCaches(Context context, ApplicationInfo ai) {
+        return checkPermissionManageExternalStorage(context, /*pid*/-1, ai.uid, ai.packageName);
+    }
+
+    /**
+     * Clears all app's external cache directories, i.e. for each app we delete
+     * /sdcard/Android/data/app/cache/* but we keep the directory itself.
+     *
+     * <p>This method doesn't perform any checks, so make sure that the calling package is allowed
+     * to clear cache directories by calling {@link #hasPermissionToClearCaches} first.
+     */
+    static void clearAppCacheDirectories() {
+        Log.i(TAG, "Clearing cache for all apps on");
+        final File rootDataDir = FileUtils.buildPath(Environment.getExternalStorageDirectory(),
+                DIRECTORY_ANDROID, "data");
+        for (File appDataDir : rootDataDir.listFiles()) {
+            try {
+                final File appCacheDir = new File(appDataDir, "cache");
+                if (appCacheDir.isDirectory()) {
+                    FileUtils.deleteContents(appCacheDir);
+                }
+            } catch (Exception e) {
+                // We want to avoid crashing MediaProvider at all costs, so we handle all "generic"
+                // exceptions here.
+                Log.e(TAG, "Couldn't delete all app cache dirs!", e);
+            }
+        }
+    }
+
     @VisibleForTesting
     void computeAudioLocalizedValues(ContentValues values) {
         try {
@@ -3908,27 +3954,62 @@
         public abstract Bitmap getThumbnailBitmap(Uri uri, CancellationSignal signal)
                 throws IOException;
 
-        public File ensureThumbnail(Uri uri, CancellationSignal signal) throws IOException {
+        public ParcelFileDescriptor ensureThumbnail(Uri uri, CancellationSignal signal)
+                throws IOException {
+            // First attempt to fast-path by opening the thumbnail; if it
+            // doesn't exist we fall through to create it below
             final File thumbFile = getThumbnailFile(uri);
+            try {
+                return ParcelFileDescriptor.open(thumbFile,
+                        ParcelFileDescriptor.MODE_READ_ONLY);
+            } catch (FileNotFoundException ignored) {
+            }
+
             final File thumbDir = thumbFile.getParentFile();
             thumbDir.mkdirs();
-            if (!thumbFile.exists()) {
-                // When multiple threads race for the same thumbnail, the second
-                // thread could return a file with a thumbnail still in
-                // progress. We could add heavy per-ID locking to mitigate this
-                // rare race condition, but it's simpler to have both threads
-                // generate the same thumbnail using temporary files and rename
-                // them into place once finished.
-                final File thumbTempFile = File.createTempFile("thumb", null, thumbDir);
+
+            // When multiple threads race for the same thumbnail, the second
+            // thread could return a file with a thumbnail still in
+            // progress. We could add heavy per-ID locking to mitigate this
+            // rare race condition, but it's simpler to have both threads
+            // generate the same thumbnail using temporary files and rename
+            // them into place once finished.
+            final File thumbTempFile = File.createTempFile("thumb", null, thumbDir);
+
+            ParcelFileDescriptor thumbWrite = null;
+            ParcelFileDescriptor thumbRead = null;
+            try {
+                // Open our temporary file twice: once for local writing, and
+                // once for remote reading. Both FDs point at the same
+                // underlying inode on disk, so they're stable across renames
+                // to avoid race conditions between threads.
+                thumbWrite = ParcelFileDescriptor.open(thumbTempFile,
+                        ParcelFileDescriptor.MODE_WRITE_ONLY | ParcelFileDescriptor.MODE_CREATE);
+                thumbRead = ParcelFileDescriptor.open(thumbTempFile,
+                        ParcelFileDescriptor.MODE_READ_ONLY);
+
                 final Bitmap thumbnail = getThumbnailBitmap(uri, signal);
-                try (OutputStream out = new FileOutputStream(thumbTempFile)) {
-                    thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, out);
+                thumbnail.compress(Bitmap.CompressFormat.JPEG, 90,
+                        new FileOutputStream(thumbWrite.getFileDescriptor()));
+
+                try {
+                    // Use direct syscall for better failure logs
+                    Os.rename(thumbTempFile.getAbsolutePath(), thumbFile.getAbsolutePath());
+                } catch (ErrnoException e) {
+                    e.rethrowAsIOException();
                 }
-                if (!thumbTempFile.renameTo(thumbFile)) {
-                    thumbTempFile.delete();
-                }
+
+                // Everything above went peachy, so return a duplicate of our
+                // already-opened read FD to keep our finally logic below simple
+                return thumbRead.dup();
+
+            } finally {
+                // Regardless of success or failure, try cleaning up any
+                // remaining temporary file and close all our local FDs
+                FileUtils.closeQuietly(thumbWrite);
+                FileUtils.closeQuietly(thumbRead);
+                thumbTempFile.delete();
             }
-            return thumbFile;
         }
 
         public void invalidateThumbnail(Uri uri) throws IOException {
@@ -4469,30 +4550,25 @@
                 final long albumId = Long.parseLong(uri.getPathSegments().get(3));
                 final Uri targetUri = ContentUris
                         .withAppendedId(Audio.Albums.getContentUri(volumeName), albumId);
-                return ParcelFileDescriptor.open(ensureThumbnail(targetUri, signal),
-                        ParcelFileDescriptor.MODE_READ_ONLY);
-
+                return ensureThumbnail(targetUri, signal);
             }
             case AUDIO_ALBUMART_FILE_ID: {
                 final long audioId = Long.parseLong(uri.getPathSegments().get(3));
                 final Uri targetUri = ContentUris
                         .withAppendedId(Audio.Media.getContentUri(volumeName), audioId);
-                return ParcelFileDescriptor.open(ensureThumbnail(targetUri, signal),
-                        ParcelFileDescriptor.MODE_READ_ONLY);
+                return ensureThumbnail(targetUri, signal);
             }
             case VIDEO_MEDIA_ID_THUMBNAIL: {
                 final long videoId = Long.parseLong(uri.getPathSegments().get(3));
                 final Uri targetUri = ContentUris
                         .withAppendedId(Video.Media.getContentUri(volumeName), videoId);
-                return ParcelFileDescriptor.open(ensureThumbnail(targetUri, signal),
-                        ParcelFileDescriptor.MODE_READ_ONLY);
+                return ensureThumbnail(targetUri, signal);
             }
             case IMAGES_MEDIA_ID_THUMBNAIL: {
                 final long imageId = Long.parseLong(uri.getPathSegments().get(3));
                 final Uri targetUri = ContentUris
                         .withAppendedId(Images.Media.getContentUri(volumeName), imageId);
-                return ParcelFileDescriptor.open(ensureThumbnail(targetUri, signal),
-                        ParcelFileDescriptor.MODE_READ_ONLY);
+                return ensureThumbnail(targetUri, signal);
             }
         }
 
@@ -4521,10 +4597,8 @@
         final boolean wantsThumb = (opts != null) && opts.containsKey(ContentResolver.EXTRA_SIZE)
                 && (mimeTypeFilter != null) && mimeTypeFilter.startsWith("image/");
         if (wantsThumb) {
-            final File thumbFile = ensureThumbnail(uri, signal);
-            return new AssetFileDescriptor(
-                    ParcelFileDescriptor.open(thumbFile, ParcelFileDescriptor.MODE_READ_ONLY),
-                    0, AssetFileDescriptor.UNKNOWN_LENGTH);
+            final ParcelFileDescriptor pfd = ensureThumbnail(uri, signal);
+            return new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UNKNOWN_LENGTH);
         }
 
         // Worst case, return the underlying file
@@ -4532,14 +4606,14 @@
                 AssetFileDescriptor.UNKNOWN_LENGTH);
     }
 
-    private File ensureThumbnail(Uri uri, CancellationSignal signal) throws FileNotFoundException {
+    private ParcelFileDescriptor ensureThumbnail(Uri uri, CancellationSignal signal)
+            throws FileNotFoundException {
         final boolean allowHidden = isCallingPackageAllowedHidden();
         final int match = matchUri(uri, allowHidden);
 
         Trace.beginSection("ensureThumbnail");
         final LocalCallingIdentity token = clearLocalCallingIdentity();
         try {
-            final File thumbFile;
             switch (match) {
                 case AUDIO_ALBUMS_ID: {
                     final String volumeName = MediaStore.getVolumeName(uri);
@@ -4905,9 +4979,21 @@
      * </ul>
      */
     private boolean shouldBypassFuseRestrictions(boolean forWrite, String filePath) {
+        String packageName =  mCallingIdentity.get().getPackageName();
+        int uid = mCallingIdentity.get().uid;
+        boolean isScopedStorageCompatFlagEnabled;
+
+        final long token = Binder.clearCallingIdentity();
+        try {
+            isScopedStorageCompatFlagEnabled = CompatChanges.isChangeEnabled(SCOPED_STORAGE,
+                    packageName, UserHandle.getUserHandleForUid(uid));
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+
         boolean isRequestingLegacyStorage = forWrite ? isCallingPackageLegacyWrite()
                 : isCallingPackageLegacyRead();
-        if (isRequestingLegacyStorage) {
+        if (isRequestingLegacyStorage || !isScopedStorageCompatFlagEnabled) {
             return true;
         }
 
@@ -5569,6 +5655,11 @@
             return true;
         }
 
+        // Apps that have permission to manage external storage can work with all files
+        if (mCallingIdentity.get().hasPermission(PERMISSION_MANAGE_EXTERNAL_STORAGE)) {
+            return true;
+        }
+
         // Check if caller is known to be owner of this item, to speed up
         // performance of our permission checks
         final int table = matchUri(uri, true);
diff --git a/src/com/android/providers/media/scan/ModernMediaScanner.java b/src/com/android/providers/media/scan/ModernMediaScanner.java
index 116d0e7..4e8318f 100644
--- a/src/com/android/providers/media/scan/ModernMediaScanner.java
+++ b/src/com/android/providers/media/scan/ModernMediaScanner.java
@@ -337,6 +337,7 @@
                 }
                 try {
                     Files.walkFileTree(mRoot.toPath(), this);
+                    applyPending();
                 } catch (IOException e) {
                     // This should never happen, so yell loudly
                     throw new IllegalStateException(e);
@@ -346,7 +347,6 @@
                     }
                     Trace.endSection();
                 }
-                applyPending();
             }
         }
 
@@ -1052,7 +1052,7 @@
     }
 
     private static @NonNull <T> Optional<T> parseOptionalOrZero(@Nullable T value) {
-        if (value instanceof String && ((String) value).equals("0")) {
+        if (value instanceof String && isZero((String) value)) {
             return Optional.empty();
         } else if (value instanceof Number && ((Number) value).intValue() == 0) {
             return Optional.empty();
@@ -1276,6 +1276,18 @@
         return (path.size() == 4) && path.get(1).equals("audio") && path.get(2).equals("playlists");
     }
 
+    static boolean isZero(@NonNull String value) {
+        if (value.length() == 0) {
+            return false;
+        }
+        for (int i = 0; i < value.length(); i++) {
+            if (value.charAt(i) != '0') {
+                return false;
+            }
+        }
+        return true;
+    }
+
     static void logTroubleScanning(File file, Exception e) {
         if (LOGW) Log.w(TAG, "Trouble scanning " + file + ": " + e);
     }
diff --git a/src/com/android/providers/media/scan/PlaylistResolver.java b/src/com/android/providers/media/scan/PlaylistResolver.java
index 83488e1..e9b6168 100644
--- a/src/com/android/providers/media/scan/PlaylistResolver.java
+++ b/src/com/android/providers/media/scan/PlaylistResolver.java
@@ -179,6 +179,7 @@
             @NonNull ContentResolver resolver, @NonNull Uri uri, int itemIndex, File itemFile)
             throws IOException {
         final Uri audioUri = MediaStore.Audio.Media.getContentUri(MediaStore.getVolumeName(uri));
+        itemFile = new File(itemFile.getAbsolutePath().replace('\\', '/'));
         try (Cursor cursor = resolver.query(audioUri,
                 new String[] { MediaColumns._ID }, MediaColumns.DATA + "=?",
                 new String[] { itemFile.getCanonicalPath() }, null)) {
diff --git a/src/com/android/providers/media/util/MimeUtils.java b/src/com/android/providers/media/util/MimeUtils.java
index 6dd029a..2bc18db 100644
--- a/src/com/android/providers/media/util/MimeUtils.java
+++ b/src/com/android/providers/media/util/MimeUtils.java
@@ -148,23 +148,23 @@
             return true;
         }
 
-        switch (mimeType) {
+        switch (mimeType.toLowerCase(Locale.ROOT)) {
             case "application/epub+zip":
             case "application/msword":
             case "application/pdf":
             case "application/rtf":
             case "application/vnd.ms-excel":
-            case "application/vnd.ms-excel.addin.macroEnabled.12":
-            case "application/vnd.ms-excel.sheet.binary.macroEnabled.12":
-            case "application/vnd.ms-excel.sheet.macroEnabled.12":
-            case "application/vnd.ms-excel.template.macroEnabled.12":
+            case "application/vnd.ms-excel.addin.macroenabled.12":
+            case "application/vnd.ms-excel.sheet.binary.macroenabled.12":
+            case "application/vnd.ms-excel.sheet.macroenabled.12":
+            case "application/vnd.ms-excel.template.macroenabled.12":
             case "application/vnd.ms-powerpoint":
-            case "application/vnd.ms-powerpoint.addin.macroEnabled.12":
-            case "application/vnd.ms-powerpoint.presentation.macroEnabled.12":
-            case "application/vnd.ms-powerpoint.slideshow.macroEnabled.12":
-            case "application/vnd.ms-powerpoint.template.macroEnabled.12":
-            case "application/vnd.ms-word.document.macroEnabled.12":
-            case "application/vnd.ms-word.template.macroEnabled.12":
+            case "application/vnd.ms-powerpoint.addin.macroenabled.12":
+            case "application/vnd.ms-powerpoint.presentation.macroenabled.12":
+            case "application/vnd.ms-powerpoint.slideshow.macroenabled.12":
+            case "application/vnd.ms-powerpoint.template.macroenabled.12":
+            case "application/vnd.ms-word.document.macroenabled.12":
+            case "application/vnd.ms-word.template.macroenabled.12":
             case "application/vnd.oasis.opendocument.chart":
             case "application/vnd.oasis.opendocument.database":
             case "application/vnd.oasis.opendocument.formula":
diff --git a/tests/jni/FuseDaemonTest/AndroidManifest.xml b/tests/jni/FuseDaemonTest/AndroidManifest.xml
index 4d97911..cdae039 100644
--- a/tests/jni/FuseDaemonTest/AndroidManifest.xml
+++ b/tests/jni/FuseDaemonTest/AndroidManifest.xml
@@ -17,13 +17,13 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.tests.fused" >
 
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
     <application>
         <receiver android:name="com.android.cts.install.lib.LocalIntentSender"
                   android:exported="true" />
         <uses-library android:name="android.test.runner" />
     </application>
 
-
     <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
                      android:targetPackage="com.android.tests.fused"
                      android:label="Tests for file path access when FuseDaemon is active"/>
diff --git a/tests/jni/FuseDaemonTest/host/src/com/android/tests/fused/host/FuseDaemonHostTest.java b/tests/jni/FuseDaemonTest/host/src/com/android/tests/fused/host/FuseDaemonHostTest.java
index 4fba34b..b3ee227 100644
--- a/tests/jni/FuseDaemonTest/host/src/com/android/tests/fused/host/FuseDaemonHostTest.java
+++ b/tests/jni/FuseDaemonTest/host/src/com/android/tests/fused/host/FuseDaemonHostTest.java
@@ -223,4 +223,9 @@
     public void testCanCreateHiddenFile() throws Exception {
         runDeviceTest("testCanCreateHiddenFile");
     }
+
+    @Test
+    public void testManageExternalStorageQueryOtherAppsFile() throws Exception {
+        runDeviceTest("testManageExternalStorageQueryOtherAppsFile");
+    }
 }
diff --git a/tests/jni/FuseDaemonTest/legacy/src/com/android/tests/fused/legacy/LegacyFileAccessTest.java b/tests/jni/FuseDaemonTest/legacy/src/com/android/tests/fused/legacy/LegacyFileAccessTest.java
index 1b09f5e..2f897de 100644
--- a/tests/jni/FuseDaemonTest/legacy/src/com/android/tests/fused/legacy/LegacyFileAccessTest.java
+++ b/tests/jni/FuseDaemonTest/legacy/src/com/android/tests/fused/legacy/LegacyFileAccessTest.java
@@ -18,12 +18,13 @@
 
 import static com.android.tests.fused.lib.TestUtils.pollForExternalStorageState;
 
+import static com.android.tests.fused.lib.TestUtils.pollForPermission;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.fail;
 
 import android.Manifest;
-import android.content.pm.PackageManager;
 import android.os.Environment;
 import android.system.ErrnoException;
 import android.system.Os;
@@ -56,9 +57,6 @@
 
     private static final String TAG = "LegacyFileAccessTest";
 
-    private static final long POLLING_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(10);
-    private static final long POLLING_SLEEP_MILLIS = 100;
-
     @Before
     public void setUp() throws Exception {
         pollForExternalStorageState();
@@ -396,20 +394,4 @@
         assertThat(oldPath.exists()).isFalse();
         assertThat(newPath.exists()).isTrue();
     }
-
-    private boolean isPermissionGranted(String perm) {
-        return InstrumentationRegistry.getContext().checkCallingOrSelfPermission(perm)
-                == PackageManager.PERMISSION_GRANTED;
-    }
-
-    private void pollForPermission(String perm, boolean granted) throws Exception {
-        for (int i = 0; i < POLLING_TIMEOUT_MILLIS / POLLING_SLEEP_MILLIS; i++) {
-            if (granted == isPermissionGranted(perm)) {
-                return;
-            }
-            Thread.sleep(POLLING_SLEEP_MILLIS);
-        }
-        fail("Timed out while waiting for permission " + perm + " to be "
-                + (granted ? "granted" : "revoked"));
-    }
 }
diff --git a/tests/jni/FuseDaemonTest/libs/FuseDaemonTestLib/src/com/android/tests/fused/lib/TestUtils.java b/tests/jni/FuseDaemonTest/libs/FuseDaemonTestLib/src/com/android/tests/fused/lib/TestUtils.java
index e564915..d451ece 100644
--- a/tests/jni/FuseDaemonTest/libs/FuseDaemonTestLib/src/com/android/tests/fused/lib/TestUtils.java
+++ b/tests/jni/FuseDaemonTest/libs/FuseDaemonTestLib/src/com/android/tests/fused/lib/TestUtils.java
@@ -36,11 +36,13 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
 import android.provider.MediaStore;
+import android.system.Os;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
@@ -76,7 +78,6 @@
     private static final long POLLING_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(10);
     private static final long POLLING_SLEEP_MILLIS = 100;
 
-
     private static final UiAutomation sUiAutomation = InstrumentationRegistry.getInstrumentation()
             .getUiAutomation();
 
@@ -396,6 +397,43 @@
         fail("Timed out while waiting for ExternalStorageState to be MEDIA_MOUNTED");
     }
 
+    public static void pollForPermission(String perm, boolean granted) throws Exception {
+        for (int i = 0; i < POLLING_TIMEOUT_MILLIS / POLLING_SLEEP_MILLIS; i++) {
+            if (granted == checkPermissionAndAppOp(perm)) {
+                return;
+            }
+            Thread.sleep(POLLING_SLEEP_MILLIS);
+        }
+        fail("Timed out while waiting for permission " + perm + " to be "
+                + (granted ? "granted" : "revoked"));
+    }
+
+    /**
+     * Checks if the given {@code permission} is granted and corresponding AppOp is MODE_ALLOWED.
+     */
+    private static boolean checkPermissionAndAppOp(String permission) {
+        final int pid  = Os.getpid();
+        final int uid = Os.getuid();
+        final Context context = getContext();
+        final String packageName = context.getPackageName();
+        if (context.checkPermission(permission, pid, uid) != PackageManager.PERMISSION_GRANTED) {
+            return false;
+        }
+
+        final String op = AppOpsManager.permissionToOp(permission);
+        // No AppOp associated with the given permission, skip AppOp check.
+        if (op == null) return true;
+
+        final AppOpsManager appOps = context.getSystemService(AppOpsManager.class);
+        try {
+            appOps.checkPackage(uid, packageName);
+        } catch (SecurityException e) {
+            return false;
+        }
+
+        return appOps.unsafeCheckOpNoThrow(op, uid, packageName) == AppOpsManager.MODE_ALLOWED;
+    }
+
     /**
      * <p>This method drops shell permission identity.
      */
diff --git a/tests/jni/FuseDaemonTest/src/com/android/tests/fused/FilePathAccessTest.java b/tests/jni/FuseDaemonTest/src/com/android/tests/fused/FilePathAccessTest.java
index 5a86201..d9b0fe6 100644
--- a/tests/jni/FuseDaemonTest/src/com/android/tests/fused/FilePathAccessTest.java
+++ b/tests/jni/FuseDaemonTest/src/com/android/tests/fused/FilePathAccessTest.java
@@ -39,6 +39,7 @@
 import static com.android.tests.fused.lib.TestUtils.getContentResolver;
 import static com.android.tests.fused.lib.TestUtils.getFileMimeTypeFromDatabase;
 import static com.android.tests.fused.lib.TestUtils.getFileRowIdFromDatabase;
+import static com.android.tests.fused.lib.TestUtils.getFileUri;
 import static com.android.tests.fused.lib.TestUtils.installApp;
 import static com.android.tests.fused.lib.TestUtils.listAs;
 import static com.android.tests.fused.lib.TestUtils.openWithMediaProvider;
@@ -59,6 +60,7 @@
 import android.app.AppOpsManager;
 import android.content.ContentResolver;
 import android.database.Cursor;
+import android.net.Uri;
 import android.os.Environment;
 import android.os.FileUtils;
 import android.os.ParcelFileDescriptor;
@@ -129,7 +131,6 @@
             "com.android.tests.fused.testapp.A", 1, false, "TestAppA.apk");
     private static final TestApp TEST_APP_B  = new TestApp("TestAppB",
             "com.android.tests.fused.testapp.B", 1, false, "TestAppB.apk");
-
     private static final String[] SYSTEM_GALERY_APPOPS = { AppOpsManager.OPSTR_WRITE_MEDIA_IMAGES,
             AppOpsManager.OPSTR_WRITE_MEDIA_VIDEO };
 
@@ -284,6 +285,20 @@
 
             final byte[] expected = (STR_DATA1 + STR_DATA2).getBytes();
             assertFileContent(imageFile, expected);
+
+            // Closing the file after writing will not trigger a MediaScan. Call scanFile to update
+            // file's entry in MediaProvider's database.
+            assertThat(MediaStore.scanFile(getContentResolver(), imageFile)).isNotNull();
+
+            // Ensure that the scan was completed and the file's size was updated.
+            try (final Cursor c = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
+                            /* projection */new String[] {MediaColumns.SIZE},
+                            selection, selectionArgs, null)) {
+                assertThat(c.getCount()).isEqualTo(1);
+                c.moveToFirst();
+                assertThat(c.getInt(c.getColumnIndex(MediaColumns.SIZE)))
+                        .isEqualTo(BYTES_DATA1.length + BYTES_DATA2.length);
+            }
         } finally {
             imageFile.delete();
         }
@@ -617,7 +632,6 @@
      */
     @Test
     public void testListFilesFromExternalMediaDirectory() throws Exception {
-        final String packageName = THIS_PACKAGE_NAME;
         final File videoFile = new File(EXTERNAL_MEDIA_DIR, VIDEO_FILE_NAME);
         final String videoFileName = videoFile.getName();
 
@@ -629,29 +643,17 @@
 
             // App should see its directory and other app's external media directories with media
             // files.
-            // TODO(b/145757667): Uncomment this when we start indexing Android/media files.
-            // assertThat(ReaddirTestHelper.readDirectory(ANDROID_MEDIA_DIR)).contains(packageName);
             assertThat(ReaddirTestHelper.readDirectory(EXTERNAL_MEDIA_DIR))
                     .containsExactly(videoFileName);
 
             // Install TEST_APP_A with READ_EXTERNAL_STORAGE permission.
             // TEST_APP_A with storage permission should see other app's external media directory.
-
-            // TODO(b/145757667): Uncomment this when we start indexing Android/media files.
-            //  For context, this used to work when we used to scan files after closing them, but
-            //  now, since we don't, videoFileName is not indexed by MediaProvider, which means
-            //  that Android/media/<pkg-name> is empty and so MediaProvider can't see it.
-            //  We also can't use ContentResolver#insert since MediaProvider doesn't allow videos
-            //  under primary directory Android.
-//            installApp(TEST_APP_A, true);
-//            assertThat(listDirectoryEntriesFromTestApp(TEST_APP_A, ANDROID_MEDIA_DIR.getPath()))
-//                    .contains(packageName);
-//            assertThat(listDirectoryEntriesFromTestApp(TEST_APP_A, EXTERNAL_MEDIA_DIR.getPath()))
-//                    .containsExactly(videoFileName);
+            installApp(TEST_APP_A, true);
+            // Apps can't list files in other app's external media directory.
+            assertThat(listAs(TEST_APP_A, ANDROID_MEDIA_DIR.getPath())).isEmpty();
+            assertThat(listAs(TEST_APP_A, EXTERNAL_MEDIA_DIR.getPath())).isEmpty();
         } finally {
             videoFile.delete();
-              // TODO(b/145757667): Uncomment this when we start indexing Android/media files.
-//            uninstallAppNoThrow(TEST_APP_A);
         }
     }
 
@@ -671,9 +673,12 @@
             installApp(TEST_APP_A, true);
             assertThat(listAs(TEST_APP_A, DCIM_DIR.getPath())).doesNotContain(NONMEDIA_FILE_NAME);
 
-            // TEST_APP_A with storage permission should see video file in Music directory.
+
             executeShellCommand("touch " + videoFile.getAbsolutePath());
-            assertThat(MediaStore.scanFile(getContentResolver(), videoFile)).isNotNull();
+            // ScanFile doesn't insert an empty media file to database. Write some data to ensure
+            // file is inserted into database.
+            executeShellCommand("echo " + STR_DATA1 + " > " + videoFile.getAbsolutePath());
+            // TEST_APP_A with storage permission should see video file in Music directory.
             assertThat(listAs(TEST_APP_A, MUSIC_DIR.getPath())).contains(VIDEO_FILE_NAME);
         } finally {
             executeShellCommand("rm " + pdfFile.getAbsolutePath());
@@ -903,14 +908,11 @@
             assertThat(otherAppImageFile.delete()).isTrue();
             assertThat(otherAppImageFile.exists()).isFalse();
 
-            // Put the file back in its place and let TEST_APP_A delete it
-            assertThat(otherAppImageFile.createNewFile()).isTrue();
-
             // Can create an image anywhere
             assertCanCreateFile(topLevelImageFile);
             assertCanCreateFile(imageInAnObviouslyWrongPlace);
         } finally {
-            deleteFileAs(TEST_APP_A, otherAppImageFile.getPath());
+            otherAppImageFile.delete();
             uninstallApp(TEST_APP_A);
             denyAppOpsToUid(Process.myUid(), SYSTEM_GALERY_APPOPS);
         }
@@ -1320,10 +1322,10 @@
             assertThat(otherAppImage.createNewFile()).isTrue();
             assertThat(otherAppMusic.createNewFile()).isTrue();
         } finally {
+            otherAppPdf.delete();
+            otherAppImage.delete();
+            otherAppMusic.delete();
             dropShellPermissionIdentity();
-            deleteFileAs(TEST_APP_A, otherAppPdf.getPath());
-            deleteFileAs(TEST_APP_A, otherAppImage.getPath());
-            deleteFileAs(TEST_APP_A, otherAppMusic.getPath());
             uninstallApp(TEST_APP_A);
         }
     }
@@ -1373,17 +1375,65 @@
 
             // Rename file back to it's original name so that the test app can clean it up
             assertThat(musicFile.renameTo(otherAppPdf)).isTrue();
+            assertThat(deleteFileAs(TEST_APP_A, otherAppPdf.getPath())).isTrue();
         } finally {
             pdf.delete();
             pdfInObviouslyWrongPlace.delete();
             topLevelPdf.delete();
             musicFile.delete();
             dropShellPermissionIdentity();
-            deleteFileAs(TEST_APP_A, otherAppPdf.getPath());
+            otherAppPdf.delete();
             uninstallApp(TEST_APP_A);
         }
     }
 
+    @Test
+    public void testManageExternalStorageQueryOtherAppsFile() throws Exception {
+        final File otherAppPdf = new File(DOWNLOAD_DIR, "other" + NONMEDIA_FILE_NAME);
+        final File otherAppImg = new File(DCIM_DIR, "other" + IMAGE_FILE_NAME);
+        final File otherAppMusic = new File(MUSIC_DIR, "other" + MUSIC_FILE_NAME);
+        try {
+            installApp(TEST_APP_A, false);
+            assertCreateFilesAs(TEST_APP_A, otherAppImg, otherAppMusic, otherAppPdf);
+
+            // Once we have permission to manage external storage, we can query for other apps'
+            // files and open them for read and write
+            adoptShellPermissionIdentity(Manifest.permission.MANAGE_EXTERNAL_STORAGE);
+
+            assertCanQueryAndOpenFile(otherAppPdf, "rw");
+            assertCanQueryAndOpenFile(otherAppImg, "rw");
+            assertCanQueryAndOpenFile(otherAppMusic, "rw");
+        } finally {
+            dropShellPermissionIdentity();
+            deleteFilesAs(TEST_APP_A, otherAppImg, otherAppMusic, otherAppPdf);
+            uninstallApp(TEST_APP_A);
+        }
+    }
+
+    private static void assertCreateFilesAs(TestApp testApp, File... files) throws Exception {
+        for (File file : files) {
+            assertThat(createFileAs(testApp, file.getPath())).isTrue();
+        }
+    }
+
+    private static void deleteFilesAs(TestApp testApp, File... files) throws Exception {
+        for (File file : files) {
+            deleteFileAs(testApp, file.getPath());
+        }
+    }
+
+    private static void assertCanQueryAndOpenFile(File file, String mode) throws IOException {
+        // This call performs the query
+        final Uri fileUri = getFileUri(file);
+        // The query succeeds iff it didn't return null
+        assertThat(fileUri).isNotNull();
+        // Now we assert that we can open the file through ContentResolver
+        try (final ParcelFileDescriptor pfd =
+                     getContentResolver().openFileDescriptor(fileUri, mode)) {
+            assertThat(pfd).isNotNull();
+        }
+    }
+
     /**
      * Assert that the last read in: read - write - read using {@code readFd} and {@code writeFd}
      * see the last write. {@code readFd} and {@code writeFd} are fds pointing to the same
diff --git a/tests/res/raw/test_m3u.m3u b/tests/res/raw/test_m3u.m3u
index 0ba6e4c..be9142a 100644
--- a/tests/res/raw/test_m3u.m3u
+++ b/tests/res/raw/test_m3u.m3u
@@ -8,3 +8,9 @@
 
 #EXTINF:321,Example Artist - Example title
 003.mp3
+
+#Example to test windows style file path
+..\Music\004.mp3
+
+#Example to test case-sensitive
+../music/005.mp3
diff --git a/tests/res/raw/test_pls.pls b/tests/res/raw/test_pls.pls
index 8ce5eea..3f0c01b 100644
--- a/tests/res/raw/test_pls.pls
+++ b/tests/res/raw/test_pls.pls
@@ -10,5 +10,11 @@
 Title2=Just some local audio that is 2mins long
 Length2=120
 
-NumberOfEntries=3
+File4=..\Music\004.mp3
+Title4=Window style file path
+
+File5=../music/005.mp3
+Title5=case insensitive
+
+NumberOfEntries=5
 Version=2
diff --git a/tests/res/raw/test_wpl.wpl b/tests/res/raw/test_wpl.wpl
index 8f821ad..016ef6d 100644
--- a/tests/res/raw/test_wpl.wpl
+++ b/tests/res/raw/test_wpl.wpl
@@ -4,7 +4,7 @@
         <meta name="Generator" content="Microsoft Windows Media Player -- 11.0.5721.5145"/>
         <meta name="AverageRating" content="33"/>
         <meta name="TotalDuration" content="1102"/>
-        <meta name="ItemCount" content="3"/>
+        <meta name="ItemCount" content="5"/>
         <author/>
         <title>Bach Organ Works</title>
     </head>
@@ -13,6 +13,8 @@
             <media src="001.mp3"/>
             <media src="../Music/002.mp3"/>
             <media src="003.mp3" tid="{35B39D45-94D8-40E1-8FC2-9F6714191E47}"/>
+            <media src="..\Music\004.mp3"/>
+            <media src="../music/005.mp3"/>
         </seq>
     </body>
 </smil>
diff --git a/tests/src/com/android/providers/media/scan/ModernMediaScannerTest.java b/tests/src/com/android/providers/media/scan/ModernMediaScannerTest.java
index 781f22a..1bbcb45 100644
--- a/tests/src/com/android/providers/media/scan/ModernMediaScannerTest.java
+++ b/tests/src/com/android/providers/media/scan/ModernMediaScannerTest.java
@@ -229,6 +229,19 @@
     }
 
     @Test
+    public void testIsZero() throws Exception {
+        assertFalse(ModernMediaScanner.isZero(""));
+        assertFalse(ModernMediaScanner.isZero("meow"));
+        assertFalse(ModernMediaScanner.isZero("1"));
+        assertFalse(ModernMediaScanner.isZero("01"));
+        assertFalse(ModernMediaScanner.isZero("010"));
+
+        assertTrue(ModernMediaScanner.isZero("0"));
+        assertTrue(ModernMediaScanner.isZero("00"));
+        assertTrue(ModernMediaScanner.isZero("000"));
+    }
+
+    @Test
     public void testPlaylistM3u() throws Exception {
         doPlaylist(R.raw.test_m3u, "test.m3u");
     }
@@ -249,6 +262,8 @@
         stage(R.raw.test_audio, new File(music, "001.mp3"));
         stage(R.raw.test_audio, new File(music, "002.mp3"));
         stage(R.raw.test_audio, new File(music, "003.mp3"));
+        stage(R.raw.test_audio, new File(music, "004.mp3"));
+        stage(R.raw.test_audio, new File(music, "005.mp3"));
         stage(res, new File(music, name));
 
         mModern.scanDirectory(mDir, REASON_UNKNOWN);
@@ -268,13 +283,17 @@
         try (Cursor cursor = mIsolatedResolver.query(membersUri, new String[] {
                 MediaColumns.DISPLAY_NAME
         }, null, null, MediaStore.Audio.Playlists.Members.PLAY_ORDER + " ASC")) {
-            assertEquals(3, cursor.getCount());
+            assertEquals(5, cursor.getCount());
             cursor.moveToNext();
             assertEquals("001.mp3", cursor.getString(0));
             cursor.moveToNext();
             assertEquals("002.mp3", cursor.getString(0));
             cursor.moveToNext();
             assertEquals("003.mp3", cursor.getString(0));
+            cursor.moveToNext();
+            assertEquals("004.mp3", cursor.getString(0));
+            cursor.moveToNext();
+            assertEquals("005.mp3", cursor.getString(0));
         }
 
         // Delete one of the media files and rescan
@@ -285,7 +304,7 @@
         try (Cursor cursor = mIsolatedResolver.query(membersUri, new String[] {
                 MediaColumns.DISPLAY_NAME
         }, null, null, MediaStore.Audio.Playlists.Members.PLAY_ORDER + " ASC")) {
-            assertEquals(2, cursor.getCount());
+            assertEquals(4, cursor.getCount());
             cursor.moveToNext();
             assertEquals("001.mp3", cursor.getString(0));
             cursor.moveToNext();
diff --git a/tests/src/com/android/providers/media/util/MimeUtilsTest.java b/tests/src/com/android/providers/media/util/MimeUtilsTest.java
index e014582..ab2b9d7 100644
--- a/tests/src/com/android/providers/media/util/MimeUtilsTest.java
+++ b/tests/src/com/android/providers/media/util/MimeUtilsTest.java
@@ -17,6 +17,8 @@
 package com.android.providers.media.util;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import android.content.ClipDescription;
 import android.mtp.MtpConstants;
@@ -75,6 +77,19 @@
     }
 
     @Test
+    public void testIsDocumentMimeType() throws Exception {
+        assertTrue(MimeUtils.isDocumentMimeType(
+                "application/vnd.ms-excel.addin.macroEnabled.12"));
+        assertTrue(MimeUtils.isDocumentMimeType(
+                "application/vnd.ms-powerpoint.addin.macroEnabled.12"));
+        assertTrue(MimeUtils.isDocumentMimeType(
+                "application/vnd.ms-word.document.macroEnabled.12"));
+
+        assertFalse(MimeUtils.isDocumentMimeType(
+                "application/zip"));
+    }
+
+    @Test
     public void testResolveFormatCode() throws Exception {
         assertEquals(MtpConstants.FORMAT_UNDEFINED_AUDIO,
                 MimeUtils.resolveFormatCode("audio/mpeg"));