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