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"));