summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/values-cs/strings.xml13
-rw-r--r--res/values-da/strings.xml13
-rw-r--r--res/values-de/strings.xml15
-rw-r--r--res/values-el/strings.xml13
-rw-r--r--res/values-es-rUS/strings.xml13
-rw-r--r--res/values-es/strings.xml13
-rw-r--r--res/values-fr/strings.xml13
-rw-r--r--res/values-it/strings.xml13
-rw-r--r--res/values-ja/strings.xml13
-rw-r--r--res/values-ko/strings.xml13
-rw-r--r--res/values-nb/strings.xml13
-rw-r--r--res/values-nl/strings.xml13
-rw-r--r--res/values-pl/strings.xml13
-rw-r--r--res/values-pt-rPT/strings.xml13
-rw-r--r--res/values-pt/strings.xml13
-rw-r--r--res/values-ru/strings.xml13
-rw-r--r--res/values-sv/strings.xml13
-rw-r--r--res/values-tr/strings.xml13
-rw-r--r--res/values-zh-rCN/strings.xml13
-rw-r--r--res/values-zh-rTW/strings.xml13
-rw-r--r--res/values/strings.xml4
-rw-r--r--src/com/android/providers/downloads/DownloadFileInfo.java34
-rw-r--r--src/com/android/providers/downloads/DownloadInfo.java140
-rw-r--r--src/com/android/providers/downloads/DownloadNotification.java10
-rw-r--r--src/com/android/providers/downloads/DownloadProvider.java3
-rw-r--r--src/com/android/providers/downloads/DownloadService.java14
-rw-r--r--src/com/android/providers/downloads/DownloadThread.java206
-rw-r--r--src/com/android/providers/downloads/Helpers.java87
-rw-r--r--tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java2
-rw-r--r--tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java6
-rw-r--r--ui/AndroidManifest.xml3
-rw-r--r--ui/res/values-cs/strings.xml51
-rw-r--r--ui/res/values-da/strings.xml51
-rw-r--r--ui/res/values-de/strings.xml51
-rw-r--r--ui/res/values-el/strings.xml51
-rw-r--r--ui/res/values-es-rUS/strings.xml51
-rw-r--r--ui/res/values-es/strings.xml51
-rw-r--r--ui/res/values-fr/strings.xml51
-rw-r--r--ui/res/values-it/strings.xml51
-rw-r--r--ui/res/values-ja/strings.xml51
-rw-r--r--ui/res/values-ko/strings.xml51
-rw-r--r--ui/res/values-nb/strings.xml51
-rw-r--r--ui/res/values-nl/strings.xml51
-rw-r--r--ui/res/values-pl/strings.xml51
-rw-r--r--ui/res/values-pt-rPT/strings.xml51
-rw-r--r--ui/res/values-pt/strings.xml51
-rw-r--r--ui/res/values-ru/strings.xml51
-rw-r--r--ui/res/values-sv/strings.xml51
-rw-r--r--ui/res/values-tr/strings.xml51
-rw-r--r--ui/res/values-zh-rCN/strings.xml51
-rw-r--r--ui/res/values-zh-rTW/strings.xml51
-rw-r--r--ui/res/values/strings.xml6
-rw-r--r--ui/src/com/android/providers/downloads/ui/DownloadAdapter.java12
-rw-r--r--ui/src/com/android/providers/downloads/ui/DownloadList.java60
54 files changed, 1430 insertions, 439 deletions
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 69a62f25..3d31670e 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Umožňuje aplikaci přístup k pokročilým funkcím správce stahování. Škodlivé aplikace toho mohou využít a narušit stahování nebo získat přístup k důvěrným informacím."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Odeslat oznámení o stahování."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Umožní aplikaci odeslat oznámení o dokončení stahování. Škodlivé aplikace mohou pomocí tohoto nastavení zmást jiné aplikace, které stahují soubory."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Zobrazení všech položek stažených na kartu SD"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Zobrazení všech položek stažených na kartu SD"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Zobrazení všech položek stažených na kartu SD"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Umožňuje aplikaci zobrazit všechny položky stažené na kartu SD bez ohledu na to, která aplikace je stáhla."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Rezervovat místo v mezipaměti stahování"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Umožňuje aplikaci stáhnout soubory do mezipaměti stahování, kterou nelze automaticky smazat, pokud správce stahování potřebuje více místa."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" a ještě <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Stahování bylo dokončeno"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Stažení se nezdařilo."</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Velké, vyžaduje Wi-Fi"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Velké, vyžaduje Wi-Fi"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index e6ef176a..b1b18b59 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Tillader, at programmet får adgang til de avancerede funktioner i downloadadministratoren. Ondsindede programmer kan bruge dette til at afbryde downloads og få adgang til personlige oplysninger."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Send downloadmeddelelser."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Tillader, at programmet sender meddelelser om afsluttede downloads. Ondsindede programmer kan bruge dette til at forvirre andre programmer, der downloader filer."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Se alle downloads til SD-kort"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Se alle downloads til SD-kort"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Se alle downloads til SD-kort"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Gør det muligt for programmet at se alle downloads til SD-kortet, uanset hvilket program, der downloadede dem."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Reserver plads i downloadcache"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Programmet kan downloade filer til downloadcachen, som ikke automatisk kan slettes, når downloadmanageren har brug for mere plads."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" og <xliff:g id="NUMBER">%d</xliff:g> mere"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Download afsluttet"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Download mislykkedes"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Wi-Fi kræves pga. str."</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Wi-Fi kræves pga. str."</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index f0784b62..401f07c1 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -23,10 +23,11 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Der Anwendung wird ermöglicht, auf die erweiterten Funktionen des Download-Managers zuzugreifen. Schädliche Anwendungen können so Downloads unterbrechen und auf persönliche Daten zugreifen."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Benachrichtigungen zu Ladevorgängen senden"</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Ermöglicht es der Anwendung, Benachrichtigungen zu abgeschlossenen Ladevorgängen zu senden. Diese Funktion kann von bösartigen Anwendungen dazu verwendet werden, den Ladevorgang anderer Anwendungen zu stören."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Alle Downloads an SD-Karte anzeigen"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Alle Downloads an SD-Karte anzeigen"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Alle Downloads an SD-Karte anzeigen"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Ermöglicht der Anwendung, alle Downloads an die SD-Karte anzuzeigen, unabhängig davon, von welcher Anwendung sie heruntergeladen wurden."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Speicherplatz im Download-Cache freigeben"</string>
- <string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Dateien können in den Download-Cache, der nicht automatisch gelöscht werden kann, heruntergeladen werden, wenn der Download-Manager mehr Speicherplatz benötigt."</string>
+ <string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Ermöglicht das Herunterladen von Dateien in den Download-Cache, die nicht automatisch gelöscht werden können, wenn der Download-Manager mehr Speicher benötigt."</string>
<!-- outdated translation 3650349274034807567 --> <string name="permlab_downloadWithoutNotification" msgid="8837971946078327262">"Download-Manager ohne Benachrichtigung verwenden"</string>
<string name="permdesc_downloadWithoutNotification" msgid="5174806530123417020">"Ermöglicht der Anwendung, Dateien über den Download-Manager herunterzuladen, ohne dass dem Nutzer Benachrichtigungen angezeigt werden."</string>
<!-- no translation found for permlab_accessAllDownloads (2436240495424393717) -->
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" und <xliff:g id="NUMBER">%d</xliff:g> weitere"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Ladevorgang abgeschlossen"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Fehler beim Ladevorgang"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Größe erfordert WLAN"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Größe erfordert WLAN"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index bfb67e9a..39f40eb4 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Επιτρέπει στην εφαρμογή την πρόσβαση στις σύνθετες λειτουργίες των προγραμμάτων διαχείρισης λήψεων. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να διακόψουν λήψεις και για να αποκτήσουν πρόσβαση σε προσωπικές πληροφορίες."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Αποστολή ειδοποιήσεων λήψης."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Επιτρέπει στην εφαρμογή να στέλνει ειδοποιήσεις σχετικά με τις ολοκληρωμένες λήψεις. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να μπερδέψουν άλλες εφαρμογές που πραγματοποιούν λήψεις αρχείων."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Εμφάνιση όλων των λήψεων στην κάρτα SD"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Εμφάνιση όλων των λήψεων στην κάρτα SD"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Εμφάνιση όλων των λήψεων στην κάρτα SD"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Επιτρέπει στην εφαρμογή την εμφάνιση όλων των λήψεων στην κάρτα SD, ανεξάρτητα από την εφαρμογή που πραγματοποίησε τις λήψεις τους."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Διατηρήστε χώρο στην προσωρινή μνήμη λήψης"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Επιτρέπει στην εφαρμογή τη λήψη αρχείων στην προσωρινή μνήμη λήψης, η οποία δεν είναι δυνατό να διαγραφεί αυτόματα όταν παρουσιαστεί έλλειψη χώρου στον διαχειριστή λήψης."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" και <xliff:g id="NUMBER">%d</xliff:g> ακόμα"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Ολοκλήρωση λήψης"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Ανεπιτυχής λήψη"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Απαιτ. wifi λόγω μεγέθ."</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Απαιτ. wifi λόγω μεγέθ."</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 77b87196..cff40f34 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Permite a la aplicación acceder a las funciones avanzadas del administrador de descarga. Las aplicaciones maliciosas pueden utilizarlo para interrumpir las descargas y acceder a información privada."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Enviar notificaciones de descarga."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Permite a la aplicación enviar notificaciones acerca de las descargas completadas. Las aplicaciones maliciosas pueden utilizarlo para confundir a otras aplicaciones que descargan archivos."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Ver todas las descargas de la tarjeta SD"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Ver todas las descargas de la tarjeta SD"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Ver todas las descargas de la tarjeta SD"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Permite que la aplicación vea todas las descargas de la tarjeta SD, independientemente de qué aplicación las descargó."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Reservar espacio en el caché de descarga"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Permite que la aplicación descargue archivos al caché de descarga que no puede borrarse automáticamente cuando el administrador de descarga necesita más espacio."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" y <xliff:g id="NUMBER">%d</xliff:g> más"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Descarga completa"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"La descarga no se ha realizado correctamente"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Necesita wifi por el tamaño"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Necesita wifi por el tamaño"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index c3452b6f..5d07838a 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Permite que la aplicación acceda a las funciones avanzadas del administrador de descargas. Las aplicaciones malintencionadas pueden utilizar este permiso para provocar daños en las descargas y acceder a información privada."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Envío de notificaciones de descarga"</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Permite que la aplicación envíe notificaciones sobre descargas completadas. Las aplicaciones malintencionadas pueden utilizar este permiso para confundir a otras aplicaciones que descarguen archivos."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Ver todas las descargas en tarjeta SD"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Ver todas las descargas en tarjeta SD"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Ver todas las descargas en tarjeta SD"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Permite que la aplicación vea todas las descargas en la tarjeta SD, independientemente de la aplicación que las haya descargado."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Reservar espacio en caché de descargas"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Permite que la aplicación descargue archivos en la caché de descargas que no se pueden eliminar de forma automática cuando falta espacio en el administrador de descargas."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" y <xliff:g id="NUMBER">%d</xliff:g> más"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Descarga completada"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Descarga incorrecta"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"WiFi necesario por tamaño"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"WiFi necesario por tamaño"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 03ca45ec..39278719 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Permet à l\'application d\'accéder aux fonctions avancées du gestionnaire de téléchargements. Des applications malveillantes peuvent utiliser cette option pour perturber les téléchargements et accéder à des informations personnelles."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Envoyer des notifications de téléchargement."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Permet à l\'application d\'envoyer des notifications concernant les téléchargements effectués. Les applications malveillantes peuvent s\'en servir pour tromper les autres applications de téléchargement de fichiers."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Voir tous les téléchargements effectués sur la carte SD"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Voir tous les téléchargements effectués sur la carte SD"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Voir tous les téléchargements effectués sur la carte SD"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Permet à l\'application d\'afficher tous les téléchargements effectués sur la carte SD, quelle que soit l\'application de téléchargement utilisée."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Réserver un espace dans le cache de téléchargement"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Autorise l\'application à télécharger des fichiers dans le cache de téléchargement et empêche leur effacement automatique par le gestionnaire de téléchargement."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" et <xliff:g id="NUMBER">%d</xliff:g> autres"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Téléchargement terminé."</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Échec du téléchargement"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Wi-Fi requis (taille)"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Wi-Fi requis (taille)"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 04a9654d..4ced9a56 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Consente l\'accesso dell\'applicazione alle funzioni avanzate di gestione dei download. Le applicazioni dannose possono sfruttare questa possibilità per interrompere download e accedere a informazioni riservate."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Inviare notifiche di download."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Consente l\'invio da parte dell\'applicazione di notifiche relative ai download completati. Le applicazioni dannose possono sfruttare questa possibilità per \"confondere\" altre applicazioni usate per scaricare file."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Visualizza tutti i download sulla scheda SD"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Visualizza tutti i download sulla scheda SD"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Visualizza tutti i download sulla scheda SD"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Consente all\'applicazione di visualizzare tutti i download sulla scheda SD, indipendentemente dall\'applicazione che li ha scaricati."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Conserva spazio nella cache dei download"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Consente all\'applicazione di scaricare nella cache i file che non possono essere eliminati automaticamente quando a gestione dei download serve più spazio."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" e <xliff:g id="NUMBER">%d</xliff:g> altri"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Download completato"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Download non riuscito"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Dim. elev. Serve Wi-Fi"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Dim. elev. Serve Wi-Fi"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 3fa18e08..9e98a762 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"ダウンロードマネージャーの高度な機能にアプリケーションからアクセスできるようにします。これにより、悪意のあるアプリケーションがダウンロードに深刻な影響を与えたり個人情報にアクセスしたりできるようになります。"</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"ダウンロード通知を送信します。"</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"ダウンロード完了の通知の送信をアプリケーションに許可します。悪意のあるアプリケーションがファイルをダウンロードする他のアプリケーションの処理を妨害する恐れがあります。"</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"SDカードへのダウンロードをすべて参照する"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"SDカードへのダウンロードをすべて参照する"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"SDカードへのダウンロードをすべて参照する"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"どのアプリケーションでダウンロードされたかにかかわらず、SDカードにダウンロードされたすべてのファイルの参照をアプリケーションに許可します。"</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"ダウンロードキャッシュの領域を予約"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"ダウンロードマネージャーで領域が不足しているときに、自動的に削除できないダウンロードキャッシュへのファイルのダウンロードをアプリケーションに許可します。"</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" その他<xliff:g id="NUMBER">%d</xliff:g>件"</string>
<string name="notification_download_complete" msgid="840713937779273632">"ダウンロード完了"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"ダウンロードに失敗しました"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Wi-Fiが必要なサイズです"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Wi-Fiが必要なサイズです"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 1b83ab34..8bee8595 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"애플리케이션이 다운로드 관리자의 고급 기능에 액세스할 수 있도록 허용합니다. 이 경우 악성 애플리케이션이 다운로드를 중단시키고 개인 정보에 액세스할 수 있습니다."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"다운로드 알림을 전송합니다."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"애플리케이션이 완료된 다운로드에 대한 알림을 보낼 수 있도록 허용합니다. 이 경우 악성 애플리케이션이 파일을 다운로드하는 다른 애플리케이션에 혼란을 야기할 할 수 있습니다."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"SD 카드에 다운로드한 모든 항목 보기"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"SD 카드에 다운로드한 모든 항목 보기"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"SD 카드에 다운로드한 모든 항목 보기"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"어떤 애플리케이션을 사용하여 다운로드했는지에 관계없이 SD 카드에 다운로드한 모든 항목을 애플리케이션에 표시합니다."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"다운로드 캐시에 공간 보유"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"다운로드 관리자가 추가 공간이 필요한 경우 애플리케이션이 자동으로 삭제되지 않는 다운로드 캐시에 파일을 다운로드하도록 허용합니다."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" 외 <xliff:g id="NUMBER">%d</xliff:g>개"</string>
<string name="notification_download_complete" msgid="840713937779273632">"다운로드 완료"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"다운로드 실패"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"대용량. Wifi 필요"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"대용량. Wifi 필요"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 02edeadd..7b5e293d 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Gir programmet tilgang til avanserte funksjoner i nedlastingsprogrammene. Skadelige programmer kan bruke dette til å forstyrre nedlastninger og gi tilgang til privat informasjon."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Sende nedlastingsvarslinger"</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Lar applikasjonen sende varslinger om ferdige nedlastinger. Ondsinnede applikasjoner kan bruke dette for å forvirre andre applikasjoner som laster ned filer."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Vis alle nedlastinger til minnekort"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Vis alle nedlastinger til minnekort"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Vis alle nedlastinger til minnekort"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Programmet viser alle nedlastinger til minnekort, uavhengig av hvilket program som lastet dem ned."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Reserver lagringsplass i nedlastingsbufferen"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Gir programmet mulighet til å laste ned filer til nedlastingsbufferen, slik at de ikke slettes automatisk når nedlastingsbehandlingen trenger mer lagringsplass."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" og <xliff:g id="NUMBER">%d</xliff:g> til"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Ferdig nedlasting"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Mislykket nedlasting"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Må ha WiFi pga. str."</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Må ha WiFi pga. str."</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 5d4ccf9d..256dd680 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Hiermee krijgt de toepassing toegang tot de geavanceerde functies van de downloadbeheerder. Schadelijke toepassingen kunnen hiermee downloads onderbreken en toegang krijgen tot uw privégegevens."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Downloadmeldingen verzenden."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Hiermee ontvangt u een melding zodra een download is voltooid. Kwaadwillende toepassingen kunnen hiervan gebruikmaken om andere toepassingen die bestanden downloaden, in de war te brengen."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Alle downloads naar SD-kaart weergeven"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Alle downloads naar SD-kaart weergeven"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Alle downloads naar SD-kaart weergeven"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Staat de toepassing toe alle downloads naar de SD-kaart weer te geven, ongeacht op welke toepassing de download is uitgevoerd."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Ruimte in de downloadcache reserveren"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Hiermee kan de toepassing bestanden downloaden naar de downloadcache die niet automatisch kunnen worden verwijderd wanneer downloadbeheer meer ruimte nodig heeft."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" en nog <xliff:g id="NUMBER">%d</xliff:g> meer"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Downloaden is voltooid"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Downloaden is mislukt."</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Wi-Fi nodig door grootte"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Wi-Fi nodig door grootte"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 5ae85131..ff8abdc9 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Zezwala aplikacji na uzyskiwanie dostępu do zaawansowanych funkcji menedżera pobierania. Złośliwe aplikacje mogą wykorzystać tę możliwość w celu zakłócenia pobierania i uzyskania dostępu do informacji prywatnych."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Wysyłanie powiadomień o pobraniu."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Umożliwia programowi wysyłanie powiadomień o ukończeniu pobierania. Szkodliwe programy mogą korzystać z tego uprawnienia, aby zakłócić działanie innych programów pobierających pliki."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Sprawdzanie wszystkich plików pobranych na kartę SD"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Sprawdzanie wszystkich plików pobranych na kartę SD"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Sprawdzanie wszystkich plików pobranych na kartę SD"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Zezwala aplikacji na sprawdzanie wszystkich plików pobranych na kartę SD niezależnie od tego, która aplikacja je pobrała."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Zarezerwuj miejsce w pamięci podręcznej pobierania"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Zezwala aplikacji na pobieranie plików do pamięci podręcznej, której nie można automatycznie usunąć, gdy menedżer pobierania wymaga więcej miejsca."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" i inne (<xliff:g id="NUMBER">%d</xliff:g>)"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Pobieranie zakończone."</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Pobieranie nie powiodło się"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Za duży plik – użyj Wi-Fi"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Za duży plik – użyj Wi-Fi"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 251ed785..cd9b2fc2 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Permite que a aplicação aceda às funções avançadas do gestor de transferências. As aplicações maliciosas podem utilizar esta permissão para interromper transferências e aceder a informações privadas."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Enviar notificações de transferências."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Permite que a aplicação envie notificações acerca de transferências concluídas. As aplicações maliciosas podem utilizar esta permissão para confundir outras aplicações que transfiram ficheiros."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Ver todas as transferências para o cartão SD"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Ver todas as transferências para o cartão SD"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Ver todas as transferências para o cartão SD"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Permite à aplicação ver todas as transferências efectuadas para o cartão SD, independentemente da aplicação utilizada nas transferências."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Reservar espaço na cache de transferência"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Permite à aplic. transf. ficheiros para a cache de transf., os quais não podem ser automatic. eliminados quando o gestor de transf. necessitar de mais espaço."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" e mais <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Transferência concluída"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Falha na transferência"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"WiFi nec. devido ao tam."</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"WiFi nec. devido ao tam."</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 2e5a3876..33a75c69 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Permite que o aplicativo acesse as funções avançadas do gerenciador de downloads. Aplicativos maliciosos podem usar isso para interromper os downloads e acessar informações particulares."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Enviar notificações de download."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Permite que o aplicativo envie notificações sobre downloads concluídos. Aplicativos maliciosos podem usar isso para confundir outros aplicativos que fazem download de arquivos."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Ver todos os downloads para o cartão SD"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Ver todos os downloads para o cartão SD"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Ver todos os downloads para o cartão SD"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Permite que o aplicativo veja todos os downloads feitos no cartão SD, independentemente do aplicativo que fez o download."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Reservar espaço no cache de download"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Permite que o aplicativo faça download de arquivos no cache de downloads, que não pode ser excluído automaticamente quando o gerenciador precisa de mais espaço."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" e <xliff:g id="NUMBER">%d</xliff:g> mais"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Download concluído"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Falha no download"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Tamanho exige Wi-Fi"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Tamanho exige Wi-Fi"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index f058e5c5..b1189bc0 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Предоставляет приложению доступ к расширенным функциям диспетчера загрузки. Вредоносное ПО может этим воспользоваться для прерывания загрузки и доступа к личной информации."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Отправить оповещение о загрузке."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Позволяет приложению отправлять оповещения о завершенных загрузках. Вредоносное ПО может пользоваться этим, мешая работе приложений, загружающих файлы."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Просмотреть все загрузки на SD-карту"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Просмотреть все загрузки на SD-карту"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Просмотреть все загрузки на SD-карту"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Разрешить программе доступ ко всем загрузкам на SD-карту независимо от того, через какое приложение они были загружены."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Резервировать место в кэше загрузки"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Разрешает приложению загружать файлы в кэш загрузки (который не может быть автоматически очищен), если менеджеру загрузки потребуется больше места."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" и ещё <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Загрузка завершена"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Ошибка загрузки"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Размер требует Wi-Fi"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Размер требует Wi-Fi"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 6f00d304..0fffc5d5 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Tillåter att ett program får åtkomst till hämtningshanterarens avancerade funktioner. Skadliga program kan använda detta för att störa hämtningar och komma åt privat information."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"Skicka meddelande om hämtning."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Tillåter att ett program skickar meddelanden om slutförda hämtningar. Skadliga program kan använda detta för att störa andra program som hämtar filer."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"Visa alla hämtningar till SD-kort"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"Visa alla hämtningar till SD-kort"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"Visa alla hämtningar till SD-kort"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Tillåter att programmet ser alla hämtningar till SD-kortet, oavsett vilket program som hämtat innehållet."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"Reservera utrymme i hämtningscachen"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Tillåter att programmet hämtar filer till hämtningscachen som inte kan tas bort automatiskt när hämtningshanteraren behöver mer utrymme."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" och <xliff:g id="NUMBER">%d</xliff:g> till"</string>
<string name="notification_download_complete" msgid="840713937779273632">"Hämtning slutförd"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"Det gick inte att hämta"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Wifi krävs pga storlek"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Wifi krävs pga storlek"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index bca334bf..e75c932b 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"Uygulamaya indirme yöneticisinin gelişmiş işlevlerine erişme izni verir. Kötü niyetli uygulamalar, indirme işlemlerini bozmak ve özel bilgilere erişmek için bunu kullanabilir."</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"İndirme bildirimleri gönder."</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"Uygulamaya tamamlanan indirme işlemleri ile ilgili bildirimler gönderme izni verir. Kötü amaçlı uygulamalar bunu dosya indiren diğer uygulamaları yanıltmak için kullanabilir."</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"SD karta yapılan tüm indirmeleri gör"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"SD karta yapılan tüm indirmeleri gör"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"SD karta yapılan tüm indirmeleri gör"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"Uygulamanın SD karta yapılan tüm indirmeleri, indirme işlemini yapan uygulamadan bağımsız olarak görmesine izin verir."</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"İndirme önbelleğinde alan ayır"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"Uygulamanın dosyaları, indirme önbelleğine indirmesine izin verir. İndirme önbelleği indirme yöneticisi daha fazla alana ihtiyaç duyduğunda otomatik olarak silinemez."</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" ve <xliff:g id="NUMBER">%d</xliff:g> adet daha"</string>
<string name="notification_download_complete" msgid="840713937779273632">"İndirme işlemi tamamlandı"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"İndirme işlemi başarısız"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"Boyut için kablsuz gerkr"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"Boyut için kablsuz gerkr"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 45eed180..6dab1f38 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"允许应用程序使用下载管理器的高级功能。恶意应用程序可能会借此中断下载以及访问私密信息。"</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"发送下载通知。"</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"允许应用程序发送关于已完成下载的通知。恶意应用程序可借此干扰下载文件的其他应用程序。"</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"查看下载到 SD 卡的全部内容"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"查看下载到 SD 卡的全部内容"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"查看下载到 SD 卡的全部内容"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"无论下载到 SD 卡的内容是由什么应用程序下载的,都允许该应用程序查看所有这些内容。"</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"保留下载缓存中的空间"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"允许应用程序将文件下载到下载缓存(系统不会因为下载管理器需要更多空间而自动删除下载缓存)。"</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" 还有 <xliff:g id="NUMBER">%d</xliff:g> 项"</string>
<string name="notification_download_complete" msgid="840713937779273632">"下载完成"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"下载失败"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"文件过大,需要使用 Wi-Fi 连接"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"文件过大,需要使用 Wi-Fi 连接"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e9302a8a..5a258499 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -23,7 +23,8 @@
<string name="permdesc_downloadManagerAdvanced" msgid="6985743912436565114">"允許應用程式存取下載管理員的進階功能 (惡意應用程式可能會利用此功能讓下載發生錯誤並存取私人資訊)。"</string>
<string name="permlab_downloadCompletedIntent" msgid="945913803765675685">"傳送下載通知。"</string>
<string name="permdesc_downloadCompletedIntent" msgid="8672701687104399228">"下載完成時,允許應用程式送出通知。請注意:惡意程式可能使用此功能干擾其他下載檔案的應用程式。"</string>
- <string name="permlab_seeAllExternal" msgid="140058400609165726">"查看 SD 卡中的所有下載項目"</string>
+ <!-- outdated translation 140058400609165726 --> <string name="permlab_seeAllExternal" product="nosdcard" msgid="3423239546637683653">"查看 SD 卡中的所有下載項目"</string>
+ <string name="permlab_seeAllExternal" product="default" msgid="140058400609165726">"查看 SD 卡中的所有下載項目"</string>
<string name="permdesc_seeAllExternal" msgid="3298948060016417104">"允許應用程式查看 SD 卡中的所有下載項目,無論這些項目是透過何種應用程式進行下載。"</string>
<string name="permlab_downloadCacheNonPurgeable" msgid="3069534308882047412">"保留下載快取空間"</string>
<string name="permdesc_downloadCacheNonPurgeable" msgid="1089583021652571424">"允許應用程式將檔案下載至下載快取空間,確保檔案不會因為下載管理員需要更多空間而遭到自動刪除。"</string>
@@ -38,14 +39,14 @@
<string name="notification_filename_extras" msgid="5549729917695688191">" 以及其他 <xliff:g id="NUMBER">%d</xliff:g> 個"</string>
<string name="notification_download_complete" msgid="840713937779273632">"完成下載"</string>
<string name="notification_download_failed" msgid="5343637375905111462">"下載失敗"</string>
- <string name="notification_need_wifi_for_size" msgid="7034174266881861838">"檔案過大,需用 WiFi 下載"</string>
- <!-- no translation found for wifi_required_title (1995971416871498179) -->
+ <!-- outdated translation 7034174266881861838 --> <string name="notification_need_wifi_for_size" msgid="5973127997598540499">"檔案過大,需用 WiFi 下載"</string>
+ <!-- no translation found for wifi_required_title (1003041298526831643) -->
<skip />
- <!-- no translation found for wifi_required_body (236265653997704213) -->
+ <!-- no translation found for wifi_required_body (515230018902671203) -->
<skip />
- <!-- no translation found for wifi_recommended_title (7441589306734687400) -->
+ <!-- no translation found for wifi_recommended_title (5539971631114967735) -->
<skip />
- <!-- no translation found for wifi_recommended_body (2814345390059518237) -->
+ <!-- no translation found for wifi_recommended_body (6723283448732519545) -->
<skip />
<!-- no translation found for button_queue_for_wifi (422576726189179221) -->
<skip />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e7629cc1..8deee358 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -67,8 +67,10 @@
can use this to confuse other applications that download
files.</string>
+ <!-- Title for permission to see all downloads to EXTERNAL [CHAR LIMIT=25] -->
+ <string name="permlab_seeAllExternal" product="nosdcard">See all downloads to shared storage</string>
<!-- Title for permission to see all downloads to EXTERNAL -->
- <string name="permlab_seeAllExternal">See all downloads to SD card</string>
+ <string name="permlab_seeAllExternal" product="default">See all downloads to SD card</string>
<!-- Description for the permission to see all downloads to EXTERNAL -->
<string name="permdesc_seeAllExternal">Allows the application to see all
downloads to the SD card, regardless of which application downloaded
diff --git a/src/com/android/providers/downloads/DownloadFileInfo.java b/src/com/android/providers/downloads/DownloadFileInfo.java
deleted file mode 100644
index ce423880..00000000
--- a/src/com/android/providers/downloads/DownloadFileInfo.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 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.downloads;
-
-import java.io.FileOutputStream;
-
-/**
- * Stores information about the file in which a download gets saved.
- */
-public class DownloadFileInfo {
- String mFileName;
- FileOutputStream mStream;
- int mStatus;
-
- public DownloadFileInfo(String fileName, FileOutputStream stream, int status) {
- mFileName = fileName;
- mStream = stream;
- mStatus = status;
- }
-}
diff --git a/src/com/android/providers/downloads/DownloadInfo.java b/src/com/android/providers/downloads/DownloadInfo.java
index a2048958..3327e80b 100644
--- a/src/com/android/providers/downloads/DownloadInfo.java
+++ b/src/com/android/providers/downloads/DownloadInfo.java
@@ -175,9 +175,9 @@ public class DownloadInfo {
public static final int NETWORK_OK = 1;
/**
- * The network is unusuable for some unspecified reason.
+ * There is no network connectivity.
*/
- public static final int NETWORK_UNUSABLE_GENERIC = 2;
+ public static final int NETWORK_NO_CONNECTION = 2;
/**
* The download exceeds the maximum size for this network.
@@ -191,6 +191,16 @@ public class DownloadInfo {
public static final int NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE = 4;
/**
+ * The current connection is roaming, and the download can't proceed over a roaming connection.
+ */
+ public static final int NETWORK_CANNOT_USE_ROAMING = 5;
+
+ /**
+ * The app requesting the download specific that it can't use the current network connection.
+ */
+ public static final int NETWORK_TYPE_DISALLOWED_BY_REQUESTOR = 6;
+
+ /**
* For intents used to notify the user that a download exceeds a size threshold, if this extra
* is true, WiFi is required for this download size; otherwise, it is only recommended.
*/
@@ -227,7 +237,6 @@ public class DownloadInfo {
public String mTitle;
public String mDescription;
public int mBypassRecommendedSizeLimit;
- public String mPausedReason;
public int mFuzz;
@@ -275,10 +284,12 @@ public class DownloadInfo {
}
/**
- * Returns the time when a download should be restarted. Must only
- * be called when numFailed > 0.
+ * Returns the time when a download should be restarted.
*/
- public long restartTime() {
+ public long restartTime(long now) {
+ if (mNumFailed == 0) {
+ return now;
+ }
if (mRetryAfter > 0) {
return mLastMod + mRetryAfter;
}
@@ -291,67 +302,29 @@ public class DownloadInfo {
* Returns whether this download (which the download manager hasn't seen yet)
* should be started.
*/
- public boolean isReadyToStart(long now) {
+ private boolean isReadyToStart(long now) {
+ if (mHasActiveThread) {
+ // already running
+ return false;
+ }
if (mControl == Downloads.Impl.CONTROL_PAUSED) {
// the download is paused, so it's not going to start
return false;
}
- if (mStatus == 0) {
- // status hasn't been initialized yet, this is a new download
- return true;
- }
- if (mStatus == Downloads.Impl.STATUS_PENDING) {
- // download is explicit marked as ready to start
- return true;
- }
- if (mStatus == Downloads.Impl.STATUS_RUNNING) {
- // download was interrupted (process killed, loss of power) while it was running,
- // without a chance to update the database
- return true;
- }
- if (mStatus == Downloads.Impl.STATUS_RUNNING_PAUSED) {
- if (mNumFailed == 0) {
- // download is waiting for network connectivity to return before it can resume
+ switch (mStatus) {
+ case 0: // status hasn't been initialized yet, this is a new download
+ case Downloads.Impl.STATUS_PENDING: // download is explicit marked as ready to start
+ case Downloads.Impl.STATUS_RUNNING: // download interrupted (process killed etc) while
+ // running, without a chance to update the database
return true;
- }
- if (restartTime() < now) {
- // download was waiting for a delayed restart, and the delay has expired
- return true;
- }
- }
- return false;
- }
- /**
- * Returns whether this download (which the download manager has already seen
- * and therefore potentially started) should be restarted.
- *
- * In a nutshell, this returns true if the download isn't already running
- * but should be, and it can know whether the download is already running
- * by checking the status.
- */
- public boolean isReadyToRestart(long now) {
- if (mControl == Downloads.Impl.CONTROL_PAUSED) {
- // the download is paused, so it's not going to restart
- return false;
- }
- if (mStatus == 0) {
- // download hadn't been initialized yet
- return true;
- }
- if (mStatus == Downloads.Impl.STATUS_PENDING) {
- // download is explicit marked as ready to start
- return true;
- }
- if (mStatus == Downloads.Impl.STATUS_RUNNING_PAUSED) {
- if (mNumFailed == 0) {
- // download is waiting for network connectivity to return before it can resume
+ case Downloads.Impl.STATUS_WAITING_FOR_NETWORK:
+ case Downloads.Impl.STATUS_QUEUED_FOR_WIFI:
return checkCanUseNetwork() == NETWORK_OK;
- }
- if (restartTime() < now) {
- // download was waiting for a delayed restart, and the delay has expired
- return true;
- }
+
+ case Downloads.Impl.STATUS_WAITING_TO_RETRY:
+ // download was waiting for a delayed restart
+ return restartTime(now) <= now;
}
return false;
}
@@ -377,10 +350,10 @@ public class DownloadInfo {
public int checkCanUseNetwork() {
Integer networkType = mSystemFacade.getActiveNetworkType();
if (networkType == null) {
- return NETWORK_UNUSABLE_GENERIC;
+ return NETWORK_NO_CONNECTION;
}
if (!isRoamingAllowed() && mSystemFacade.isNetworkRoaming()) {
- return NETWORK_UNUSABLE_GENERIC;
+ return NETWORK_CANNOT_USE_ROAMING;
}
return checkIsNetworkTypeAllowed(networkType);
}
@@ -394,6 +367,32 @@ public class DownloadInfo {
}
/**
+ * @return a non-localized string appropriate for logging corresponding to one of the
+ * NETWORK_* constants.
+ */
+ public String getLogMessageForNetworkError(int networkError) {
+ switch (networkError) {
+ case NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE:
+ return "download size exceeds recommended limit for mobile network";
+
+ case NETWORK_UNUSABLE_DUE_TO_SIZE:
+ return "download size exceeds limit for mobile network";
+
+ case NETWORK_NO_CONNECTION:
+ return "no network connection available";
+
+ case NETWORK_CANNOT_USE_ROAMING:
+ return "download cannot use the current network connection because it is roaming";
+
+ case NETWORK_TYPE_DISALLOWED_BY_REQUESTOR:
+ return "download was requested to not use the current network type";
+
+ default:
+ return "unknown error with network connectivity";
+ }
+ }
+
+ /**
* Check if this download can proceed over the given network type.
* @param networkType a constant from ConnectivityManager.TYPE_*.
* @return one of the NETWORK_* constants
@@ -402,7 +401,7 @@ public class DownloadInfo {
if (mIsPublicApi) {
int flag = translateNetworkTypeToApiFlag(networkType);
if ((flag & mAllowedNetworkTypes) == 0) {
- return NETWORK_UNUSABLE_GENERIC;
+ return NETWORK_TYPE_DISALLOWED_BY_REQUESTOR;
}
}
return checkSizeAllowedForNetwork(networkType);
@@ -450,7 +449,11 @@ public class DownloadInfo {
return NETWORK_OK;
}
- void start(long now) {
+ void startIfReady(long now) {
+ if (!isReadyToStart(now)) {
+ return;
+ }
+
if (Constants.LOGV) {
Log.v(Constants.TAG, "Service spawning thread to handle download " + mId);
}
@@ -521,13 +524,10 @@ public class DownloadInfo {
if (Downloads.Impl.isStatusCompleted(mStatus)) {
return -1;
}
- if (mStatus != Downloads.Impl.STATUS_RUNNING_PAUSED) {
- return 0;
- }
- if (mNumFailed == 0) {
+ if (mStatus != Downloads.Impl.STATUS_WAITING_TO_RETRY) {
return 0;
}
- long when = restartTime();
+ long when = restartTime(now);
if (when <= now) {
return 0;
}
@@ -545,8 +545,6 @@ public class DownloadInfo {
}
void notifyPauseDueToSize(boolean isWifiRequired) {
- mPausedReason = mContext.getResources().getString(
- R.string.notification_need_wifi_for_size);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(getAllDownloadsUri());
intent.setClassName(SizeLimitActivity.class.getPackage().getName(),
diff --git a/src/com/android/providers/downloads/DownloadNotification.java b/src/com/android/providers/downloads/DownloadNotification.java
index 90c8693b..4d615df7 100644
--- a/src/com/android/providers/downloads/DownloadNotification.java
+++ b/src/com/android/providers/downloads/DownloadNotification.java
@@ -138,8 +138,10 @@ class DownloadNotification {
item.addItem(title, progress, max);
mNotifications.put(packageName, item);
}
- if (hasPausedReason(download) && item.mPausedText == null) {
- item.mPausedText = download.mPausedReason;
+ if (download.mStatus == Downloads.Impl.STATUS_QUEUED_FOR_WIFI
+ && item.mPausedText == null) {
+ item.mPausedText = mContext.getResources().getString(
+ R.string.notification_need_wifi_for_size);
}
}
@@ -205,10 +207,6 @@ class DownloadNotification {
}
}
- private boolean hasPausedReason(DownloadInfo download) {
- return download.mStatus == Downloads.STATUS_RUNNING_PAUSED && download.mPausedReason != null;
- }
-
private void updateCompletedNotification(Collection<DownloadInfo> downloads) {
for (DownloadInfo download : downloads) {
if (!isCompleteAndVisible(download)) {
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java
index 2cbf7fbb..9b86adff 100644
--- a/src/com/android/providers/downloads/DownloadProvider.java
+++ b/src/com/android/providers/downloads/DownloadProvider.java
@@ -538,7 +538,8 @@ public final class DownloadProvider extends ContentProvider {
"DESTINATION_FILE_URI must include a file URI under COLUMN_FILE_NAME_HINT");
}
Uri uri = Uri.parse(fileUri);
- if (!uri.getScheme().equals("file")) {
+ String scheme = uri.getScheme();
+ if (scheme == null || !scheme.equals("file")) {
throw new IllegalArgumentException("Not a file URI: " + uri);
}
String path = uri.getPath();
diff --git a/src/com/android/providers/downloads/DownloadService.java b/src/com/android/providers/downloads/DownloadService.java
index 62598b7c..8fbcf4b4 100644
--- a/src/com/android/providers/downloads/DownloadService.java
+++ b/src/com/android/providers/downloads/DownloadService.java
@@ -196,8 +196,6 @@ public class DownloadService extends Service {
mNotifier = new DownloadNotification(this, mSystemFacade);
mSystemFacade.cancelAllNotifications();
- trimDatabase();
- removeSpuriousFiles();
updateFromProvider();
}
@@ -243,6 +241,9 @@ public class DownloadService extends Service {
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+ trimDatabase();
+ removeSpuriousFiles();
+
boolean keepService = false;
// for each update from the database, remember which download is
// supposed to get restarted soonest in the future
@@ -438,10 +439,7 @@ public class DownloadService extends Service {
info.logVerboseInfo();
}
- if (info.isReadyToStart(now)) {
- info.start(now);
- }
-
+ info.startIfReady(now);
return info;
}
@@ -465,9 +463,7 @@ public class DownloadService extends Service {
mSystemFacade.cancelNotification(info.mId);
}
- if (info.isReadyToRestart(now)) {
- info.start(now);
- }
+ info.startIfReady(now);
}
/**
diff --git a/src/com/android/providers/downloads/DownloadThread.java b/src/com/android/providers/downloads/DownloadThread.java
index 12ddfa60..2995bfb6 100644
--- a/src/com/android/providers/downloads/DownloadThread.java
+++ b/src/com/android/providers/downloads/DownloadThread.java
@@ -26,7 +26,6 @@ import android.os.PowerManager;
import android.os.Process;
import android.provider.Downloads;
import android.provider.DrmStore;
-import android.util.Config;
import android.util.Log;
import android.util.Pair;
@@ -111,16 +110,21 @@ public class DownloadThread extends Thread {
/**
* Raised from methods called by run() to indicate that the current request should be stopped
* immediately.
+ *
+ * Note the message passed to this exception will be logged and therefore must be guaranteed
+ * not to contain any PII, meaning it generally can't include any information about the request
+ * URI, headers, or destination filename.
*/
private class StopRequest extends Throwable {
public int mFinalStatus;
- public StopRequest(int finalStatus) {
+ public StopRequest(int finalStatus, String message) {
+ super(message);
mFinalStatus = finalStatus;
}
- public StopRequest(int finalStatus, Throwable throwable) {
- super(throwable);
+ public StopRequest(int finalStatus, String message, Throwable throwable) {
+ super(message, throwable);
mFinalStatus = finalStatus;
}
}
@@ -141,7 +145,6 @@ public class DownloadThread extends Thread {
AndroidHttpClient client = null;
PowerManager.WakeLock wakeLock = null;
int finalStatus = Downloads.Impl.STATUS_UNKNOWN_ERROR;
- mInfo.mPausedReason = null;
try {
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
@@ -157,6 +160,7 @@ public class DownloadThread extends Thread {
boolean finished = false;
while(!finished) {
+ Log.i(Constants.TAG, "Initiating request for download " + mInfo.mId);
HttpGet request = new HttpGet(state.mRequestUri);
try {
executeDownload(state, client, request);
@@ -175,25 +179,16 @@ public class DownloadThread extends Thread {
finalizeDestinationFile(state);
finalStatus = Downloads.Impl.STATUS_SUCCESS;
} catch (StopRequest error) {
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "Aborting request for " + mInfo.mUri, error);
- }
+ // remove the cause before printing, in case it contains PII
+ Log.w(Constants.TAG,
+ "Aborting request for download " + mInfo.mId + ": " + error.getMessage());
finalStatus = error.mFinalStatus;
// fall through to finally block
- } catch (FileNotFoundException ex) {
- Log.d(Constants.TAG, "FileNotFoundException for " + state.mFilename + " : " + ex);
- finalStatus = Downloads.Impl.STATUS_FILE_ERROR;
- // falls through to the code that reports an error
- } catch (RuntimeException ex) { //sometimes the socket code throws unchecked exceptions
- if (Constants.LOGV) {
- Log.d(Constants.TAG, "Exception for " + mInfo.mUri, ex);
- } else if (Config.LOGD) {
- Log.d(Constants.TAG, "Exception for id " + mInfo.mId, ex);
- }
+ } catch (Throwable ex) { //sometimes the socket code throws unchecked exceptions
+ Log.w(Constants.TAG, "Exception for id " + mInfo.mId + ": " + ex);
finalStatus = Downloads.Impl.STATUS_UNKNOWN_ERROR;
// falls through to the code that reports an error
} finally {
- mInfo.mHasActiveThread = false;
if (wakeLock != null) {
wakeLock.release();
wakeLock = null;
@@ -206,6 +201,7 @@ public class DownloadThread extends Thread {
notifyDownloadCompleted(finalStatus, state.mCountRetry, state.mRetryAfter,
state.mRedirectCount, state.mGotData, state.mFilename,
state.mNewUri, state.mMimeType);
+ mInfo.mHasActiveThread = false;
}
}
@@ -214,7 +210,7 @@ public class DownloadThread extends Thread {
* and transfer the data to the destination file.
*/
private void executeDownload(State state, AndroidHttpClient client, HttpGet request)
- throws StopRequest, RetryDownload, FileNotFoundException {
+ throws StopRequest, RetryDownload {
InnerState innerState = new InnerState();
byte data[] = new byte[Constants.BUFFER_SIZE];
@@ -242,12 +238,15 @@ public class DownloadThread extends Thread {
private void checkConnectivity(State state) throws StopRequest {
int networkUsable = mInfo.checkCanUseNetwork();
if (networkUsable != DownloadInfo.NETWORK_OK) {
+ int status = Downloads.Impl.STATUS_WAITING_FOR_NETWORK;
if (networkUsable == DownloadInfo.NETWORK_UNUSABLE_DUE_TO_SIZE) {
+ status = Downloads.Impl.STATUS_QUEUED_FOR_WIFI;
mInfo.notifyPauseDueToSize(true);
} else if (networkUsable == DownloadInfo.NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE) {
+ status = Downloads.Impl.STATUS_QUEUED_FOR_WIFI;
mInfo.notifyPauseDueToSize(false);
}
- throw new StopRequest(Downloads.Impl.STATUS_RUNNING_PAUSED);
+ throw new StopRequest(status, mInfo.getLogMessageForNetworkError(networkUsable));
}
}
@@ -349,8 +348,8 @@ public class DownloadThread extends Thread {
file.delete();
if (item == null) {
- Log.w(Constants.TAG, "unable to add file " + state.mFilename + " to DrmProvider");
- throw new StopRequest(Downloads.Impl.STATUS_UNKNOWN_ERROR);
+ throw new StopRequest(Downloads.Impl.STATUS_UNKNOWN_ERROR,
+ "unable to add file to DrmProvider");
} else {
state.mFilename = item.getDataString();
state.mMimeType = item.getType();
@@ -382,17 +381,12 @@ public class DownloadThread extends Thread {
private void checkPausedOrCanceled(State state) throws StopRequest {
synchronized (mInfo) {
if (mInfo.mControl == Downloads.Impl.CONTROL_PAUSED) {
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "paused " + mInfo.mUri);
- }
- throw new StopRequest(Downloads.Impl.STATUS_RUNNING_PAUSED);
+ throw new StopRequest(Downloads.Impl.STATUS_PAUSED_BY_APP,
+ "download paused by owner");
}
}
if (mInfo.mStatus == Downloads.Impl.STATUS_CANCELED) {
- if (Constants.LOGV) {
- Log.d(Constants.TAG, "canceled " + mInfo.mUri);
- }
- throw new StopRequest(Downloads.Impl.STATUS_CANCELED);
+ throw new StopRequest(Downloads.Impl.STATUS_CANCELED, "download canceled");
}
}
@@ -437,15 +431,18 @@ public class DownloadThread extends Thread {
continue;
}
} else if (!Helpers.isExternalMediaMounted()) {
- throw new StopRequest(Downloads.Impl.STATUS_DEVICE_NOT_FOUND_ERROR);
+ throw new StopRequest(Downloads.Impl.STATUS_DEVICE_NOT_FOUND_ERROR,
+ "external media not mounted while writing destination file");
}
long availableBytes =
Helpers.getAvailableBytes(Helpers.getFilesystemRoot(state.mFilename));
if (availableBytes < bytesRead) {
- throw new StopRequest(Downloads.Impl.STATUS_INSUFFICIENT_SPACE_ERROR, ex);
+ throw new StopRequest(Downloads.Impl.STATUS_INSUFFICIENT_SPACE_ERROR,
+ "insufficient space while writing destination file", ex);
}
- throw new StopRequest(Downloads.Impl.STATUS_FILE_ERROR, ex);
+ throw new StopRequest(Downloads.Impl.STATUS_FILE_ERROR,
+ "while writing destination file: " + ex.toString(), ex);
}
}
}
@@ -466,16 +463,11 @@ public class DownloadThread extends Thread {
&& (innerState.mBytesSoFar != Integer.parseInt(innerState.mHeaderContentLength));
if (lengthMismatched) {
if (cannotResume(innerState)) {
- if (Constants.LOGV) {
- Log.d(Constants.TAG, "mismatched content length " +
- mInfo.mUri);
- } else if (Config.LOGD) {
- Log.d(Constants.TAG, "mismatched content length for " +
- mInfo.mId);
- }
- throw new StopRequest(Downloads.Impl.STATUS_CANNOT_RESUME);
+ throw new StopRequest(Downloads.Impl.STATUS_CANNOT_RESUME,
+ "mismatched content length");
} else {
- throw new StopRequest(handleHttpError(state, "closed socket"));
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "closed socket before end of file");
}
}
}
@@ -500,11 +492,13 @@ public class DownloadThread extends Thread {
values.put(Downloads.Impl.COLUMN_CURRENT_BYTES, innerState.mBytesSoFar);
mContext.getContentResolver().update(mInfo.getAllDownloadsUri(), values, null, null);
if (cannotResume(innerState)) {
- Log.d(Constants.TAG, "download IOException for download " + mInfo.mId, ex);
- Log.d(Constants.TAG, "can't resume interrupted download with no ETag");
- throw new StopRequest(Downloads.Impl.STATUS_CANNOT_RESUME, ex);
+ String message = "while reading response: " + ex.toString()
+ + ", can't resume interrupted download with no ETag";
+ throw new StopRequest(Downloads.Impl.STATUS_CANNOT_RESUME,
+ message, ex);
} else {
- throw new StopRequest(handleHttpError(state, "download IOException"), ex);
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "while reading response: " + ex.toString(), ex);
}
}
}
@@ -519,7 +513,8 @@ public class DownloadThread extends Thread {
return response.getEntity().getContent();
} catch (IOException ex) {
logNetworkState();
- throw new StopRequest(handleHttpError(state, "IOException getting entity"), ex);
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "while getting entity: " + ex.toString(), ex);
}
}
@@ -535,7 +530,7 @@ public class DownloadThread extends Thread {
* file and updating the database.
*/
private void processResponseHeaders(State state, InnerState innerState, HttpResponse response)
- throws StopRequest, FileNotFoundException {
+ throws StopRequest {
if (innerState.mContinuingDownload) {
// ignore response headers on resume requests
return;
@@ -543,22 +538,27 @@ public class DownloadThread extends Thread {
readResponseHeaders(state, innerState, response);
- DownloadFileInfo fileInfo = Helpers.generateSaveFile(
- mContext,
- mInfo.mUri,
- mInfo.mHint,
- innerState.mHeaderContentDisposition,
- innerState.mHeaderContentLocation,
- state.mMimeType,
- mInfo.mDestination,
- (innerState.mHeaderContentLength != null) ?
- Long.parseLong(innerState.mHeaderContentLength) : 0,
- mInfo.mIsPublicApi);
- if (fileInfo.mFileName == null) {
- throw new StopRequest(fileInfo.mStatus);
- }
- state.mFilename = fileInfo.mFileName;
- state.mStream = fileInfo.mStream;
+ try {
+ state.mFilename = Helpers.generateSaveFile(
+ mContext,
+ mInfo.mUri,
+ mInfo.mHint,
+ innerState.mHeaderContentDisposition,
+ innerState.mHeaderContentLocation,
+ state.mMimeType,
+ mInfo.mDestination,
+ (innerState.mHeaderContentLength != null) ?
+ Long.parseLong(innerState.mHeaderContentLength) : 0,
+ mInfo.mIsPublicApi);
+ } catch (Helpers.GenerateSaveFileError exc) {
+ throw new StopRequest(exc.mStatus, exc.mMessage);
+ }
+ try {
+ state.mStream = new FileOutputStream(state.mFilename);
+ } catch (FileNotFoundException exc) {
+ throw new StopRequest(Downloads.Impl.STATUS_FILE_ERROR,
+ "while opening destination file: " + exc.toString(), exc);
+ }
if (Constants.LOGV) {
Log.v(Constants.TAG, "writing " + mInfo.mUri + " to " + state.mFilename);
}
@@ -640,8 +640,8 @@ public class DownloadThread extends Thread {
&& (headerTransferEncoding == null
|| !headerTransferEncoding.equalsIgnoreCase("chunked"));
if (!mInfo.mNoIntegrity && noSizeInfo) {
- Log.d(Constants.TAG, "can't know size of download, giving up");
- throw new StopRequest(Downloads.Impl.STATUS_HTTP_DATA_ERROR);
+ throw new StopRequest(Downloads.Impl.STATUS_HTTP_DATA_ERROR,
+ "can't know size of download, giving up");
}
}
@@ -669,12 +669,6 @@ public class DownloadThread extends Thread {
*/
private void handleOtherStatus(State state, InnerState innerState, int statusCode)
throws StopRequest {
- if (Constants.LOGV) {
- Log.d(Constants.TAG, "http error " + statusCode + " for " + mInfo.mUri);
- } else if (Config.LOGD) {
- Log.d(Constants.TAG, "http error " + statusCode + " for download " +
- mInfo.mId);
- }
int finalStatus;
if (Downloads.Impl.isStatusError(statusCode)) {
finalStatus = statusCode;
@@ -685,7 +679,7 @@ public class DownloadThread extends Thread {
} else {
finalStatus = Downloads.Impl.STATUS_UNHANDLED_HTTP_CODE;
}
- throw new StopRequest(finalStatus);
+ throw new StopRequest(finalStatus, "http error " + statusCode);
}
/**
@@ -697,13 +691,7 @@ public class DownloadThread extends Thread {
Log.v(Constants.TAG, "got HTTP redirect " + statusCode);
}
if (state.mRedirectCount >= Constants.MAX_REDIRECTS) {
- if (Constants.LOGV) {
- Log.d(Constants.TAG, "too many redirects for download " + mInfo.mId +
- " at " + mInfo.mUri);
- } else if (Config.LOGD) {
- Log.d(Constants.TAG, "too many redirects for download " + mInfo.mId);
- }
- throw new StopRequest(Downloads.Impl.STATUS_TOO_MANY_REDIRECTS);
+ throw new StopRequest(Downloads.Impl.STATUS_TOO_MANY_REDIRECTS, "too many redirects");
}
Header header = response.getFirstHeader("Location");
if (header == null) {
@@ -720,12 +708,9 @@ public class DownloadThread extends Thread {
if (Constants.LOGV) {
Log.d(Constants.TAG, "Couldn't resolve redirect URI " + header.getValue()
+ " for " + mInfo.mUri);
- } else if (Config.LOGD) {
- Log.d(Constants.TAG,
- "Couldn't resolve redirect URI for download " +
- mInfo.mId);
}
- throw new StopRequest(Downloads.Impl.STATUS_HTTP_DATA_ERROR);
+ throw new StopRequest(Downloads.Impl.STATUS_HTTP_DATA_ERROR,
+ "Couldn't resolve redirect URI");
}
++state.mRedirectCount;
state.mRequestUri = newUri;
@@ -766,7 +751,8 @@ public class DownloadThread extends Thread {
// ignored - retryAfter stays 0 in this case.
}
}
- throw new StopRequest(Downloads.Impl.STATUS_RUNNING_PAUSED);
+ throw new StopRequest(Downloads.Impl.STATUS_WAITING_TO_RETRY,
+ "got 503 Service Unavailable, will retry later");
}
/**
@@ -777,36 +763,23 @@ public class DownloadThread extends Thread {
try {
return client.execute(request);
} catch (IllegalArgumentException ex) {
- if (Constants.LOGV) {
- Log.d(Constants.TAG, "Arg exception trying to execute request for " +
- mInfo.mUri + " : " + ex);
- } else if (Config.LOGD) {
- Log.d(Constants.TAG, "Arg exception trying to execute request for " +
- mInfo.mId + " : " + ex);
- }
- throw new StopRequest(Downloads.Impl.STATUS_HTTP_DATA_ERROR, ex);
+ throw new StopRequest(Downloads.Impl.STATUS_HTTP_DATA_ERROR,
+ "while trying to execute request: " + ex.toString(), ex);
} catch (IOException ex) {
logNetworkState();
- throw new StopRequest(handleHttpError(state, "IOException trying to execute request"),
- ex);
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "while trying to execute request: " + ex.toString(), ex);
}
}
- /**
- * @return the final status for this attempt
- */
- private int handleHttpError(State state, String message) {
- if (Constants.LOGV) {
- Log.d(Constants.TAG, message + " for " + mInfo.mUri);
- }
-
+ private int getFinalStatusForHttpError(State state) {
if (!Helpers.isNetworkAvailable(mSystemFacade)) {
- return Downloads.Impl.STATUS_RUNNING_PAUSED;
+ return Downloads.Impl.STATUS_WAITING_FOR_NETWORK;
} else if (mInfo.mNumFailed < Constants.MAX_RETRIES) {
state.mCountRetry = true;
- return Downloads.Impl.STATUS_RUNNING_PAUSED;
+ return Downloads.Impl.STATUS_WAITING_TO_RETRY;
} else {
- Log.d(Constants.TAG, "reached max retries: " + message + " for " + mInfo.mId);
+ Log.w(Constants.TAG, "reached max retries for " + mInfo.mId);
return Downloads.Impl.STATUS_HTTP_DATA_ERROR;
}
}
@@ -816,10 +789,12 @@ public class DownloadThread extends Thread {
* appropriately for resumption.
*/
private void setupDestinationFile(State state, InnerState innerState)
- throws StopRequest, FileNotFoundException {
+ throws StopRequest {
if (state.mFilename != null) { // only true if we've already run a thread for this download
if (!Helpers.isFilenameValid(state.mFilename)) {
- throw new StopRequest(Downloads.Impl.STATUS_FILE_ERROR);
+ // this should never happen
+ throw new StopRequest(Downloads.Impl.STATUS_FILE_ERROR,
+ "found invalid internal destination filename");
}
// We're resuming a download that got interrupted
File f = new File(state.mFilename);
@@ -831,12 +806,17 @@ public class DownloadThread extends Thread {
state.mFilename = null;
} else if (mInfo.mETag == null && !mInfo.mNoIntegrity) {
// This should've been caught upon failure
- Log.wtf(Constants.TAG, "Trying to resume a download that can't be resumed");
f.delete();
- throw new StopRequest(Downloads.Impl.STATUS_CANNOT_RESUME);
+ throw new StopRequest(Downloads.Impl.STATUS_CANNOT_RESUME,
+ "Trying to resume a download that can't be resumed");
} else {
// All right, we'll be able to resume this download
- state.mStream = new FileOutputStream(state.mFilename, true);
+ try {
+ state.mStream = new FileOutputStream(state.mFilename, true);
+ } catch (FileNotFoundException exc) {
+ throw new StopRequest(Downloads.Impl.STATUS_FILE_ERROR,
+ "while opening destination for resuming: " + exc.toString(), exc);
+ }
innerState.mBytesSoFar = (int) fileLength;
if (mInfo.mTotalBytes != -1) {
innerState.mHeaderContentLength = Long.toString(mInfo.mTotalBytes);
diff --git a/src/com/android/providers/downloads/Helpers.java b/src/com/android/providers/downloads/Helpers.java
index f1f23b17..cbcae5f4 100644
--- a/src/com/android/providers/downloads/Helpers.java
+++ b/src/com/android/providers/downloads/Helpers.java
@@ -33,8 +33,6 @@ import android.util.Log;
import android.webkit.MimeTypeMap;
import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.util.Random;
import java.util.Set;
import java.util.regex.Matcher;
@@ -75,18 +73,20 @@ public class Helpers {
/**
* Exception thrown from methods called by generateSaveFile() for any fatal error.
*/
- private static class GenerateSaveFileError extends Exception {
+ public static class GenerateSaveFileError extends Exception {
int mStatus;
+ String mMessage;
- public GenerateSaveFileError(int status) {
+ public GenerateSaveFileError(int status, String message) {
mStatus = status;
+ mMessage = message;
}
}
/**
- * Creates a filename (where the file should be saved) from a uri.
+ * Creates a filename (where the file should be saved) from info about a download.
*/
- public static DownloadFileInfo generateSaveFile(
+ public static String generateSaveFile(
Context context,
String url,
String hint,
@@ -95,40 +95,31 @@ public class Helpers {
String mimeType,
int destination,
long contentLength,
- boolean isPublicApi) throws FileNotFoundException {
-
- if (!canHandleDownload(context, mimeType, destination, isPublicApi)) {
- return new DownloadFileInfo(null, null, Downloads.Impl.STATUS_NOT_ACCEPTABLE);
- }
-
- String fullFilename;
- try {
- if (destination == Downloads.Impl.DESTINATION_FILE_URI) {
- fullFilename = getPathForFileUri(hint, contentLength);
- } else {
- fullFilename = chooseFullPath(context, url, hint, contentDisposition,
- contentLocation, mimeType, destination,
- contentLength);
- }
- } catch (GenerateSaveFileError exc) {
- return new DownloadFileInfo(null, null, exc.mStatus);
+ boolean isPublicApi) throws GenerateSaveFileError {
+ checkCanHandleDownload(context, mimeType, destination, isPublicApi);
+ if (destination == Downloads.Impl.DESTINATION_FILE_URI) {
+ return getPathForFileUri(hint, contentLength);
+ } else {
+ return chooseFullPath(context, url, hint, contentDisposition, contentLocation, mimeType,
+ destination, contentLength);
}
-
- return new DownloadFileInfo(fullFilename, new FileOutputStream(fullFilename), 0);
}
private static String getPathForFileUri(String hint, long contentLength)
throws GenerateSaveFileError {
if (!isExternalMediaMounted()) {
- throw new GenerateSaveFileError(Downloads.Impl.STATUS_DEVICE_NOT_FOUND_ERROR);
+ throw new GenerateSaveFileError(Downloads.Impl.STATUS_DEVICE_NOT_FOUND_ERROR,
+ "external media not mounted");
}
String path = Uri.parse(hint).getPath();
if (new File(path).exists()) {
Log.d(Constants.TAG, "File already exists: " + path);
- throw new GenerateSaveFileError(Downloads.Impl.STATUS_FILE_ALREADY_EXISTS_ERROR);
+ throw new GenerateSaveFileError(Downloads.Impl.STATUS_FILE_ALREADY_EXISTS_ERROR,
+ "requested destination file already exists");
}
if (getAvailableBytes(getFilesystemRoot(path)) < contentLength) {
- throw new GenerateSaveFileError(Downloads.Impl.STATUS_INSUFFICIENT_SPACE_ERROR);
+ throw new GenerateSaveFileError(Downloads.Impl.STATUS_INSUFFICIENT_SPACE_ERROR,
+ "insufficient space on external storage");
}
return path;
@@ -179,19 +170,17 @@ public class Helpers {
return chooseUniqueFilename(destination, filename, extension, recoveryDir);
}
- private static boolean canHandleDownload(Context context, String mimeType, int destination,
- boolean isPublicApi) {
+ private static void checkCanHandleDownload(Context context, String mimeType, int destination,
+ boolean isPublicApi) throws GenerateSaveFileError {
if (isPublicApi) {
- return true;
+ return;
}
if (destination == Downloads.Impl.DESTINATION_EXTERNAL
|| destination == Downloads.Impl.DESTINATION_CACHE_PARTITION_PURGEABLE) {
if (mimeType == null) {
- if (Config.LOGD) {
- Log.d(Constants.TAG, "external download with no mime type not allowed");
- }
- return false;
+ throw new GenerateSaveFileError(Downloads.Impl.STATUS_NOT_ACCEPTABLE,
+ "external download with no mime type not allowed");
}
if (!DrmRawContent.DRM_MIMETYPE_MESSAGE_STRING.equalsIgnoreCase(mimeType)) {
// Check to see if we are allowed to download this file. Only files
@@ -212,14 +201,14 @@ public class Helpers {
//Log.i(Constants.TAG, "*** FILENAME QUERY " + intent + ": " + list);
if (ri == null) {
- if (Config.LOGD) {
- Log.d(Constants.TAG, "no handler found for type " + mimeType);
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "no handler found for type " + mimeType);
}
- return false;
+ throw new GenerateSaveFileError(Downloads.Impl.STATUS_NOT_ACCEPTABLE,
+ "no handler found for this download type");
}
}
}
- return true;
}
private static File locateDestinationDirectory(Context context, String mimeType,
@@ -239,23 +228,24 @@ public class Helpers {
private static File getExternalDestination(long contentLength) throws GenerateSaveFileError {
if (!isExternalMediaMounted()) {
- throw new GenerateSaveFileError(Downloads.Impl.STATUS_DEVICE_NOT_FOUND_ERROR);
+ throw new GenerateSaveFileError(Downloads.Impl.STATUS_DEVICE_NOT_FOUND_ERROR,
+ "external media not mounted");
}
File root = Environment.getExternalStorageDirectory();
if (getAvailableBytes(root) < contentLength) {
// Insufficient space.
Log.d(Constants.TAG, "download aborted - not enough free space");
- throw new GenerateSaveFileError(Downloads.Impl.STATUS_INSUFFICIENT_SPACE_ERROR);
+ throw new GenerateSaveFileError(Downloads.Impl.STATUS_INSUFFICIENT_SPACE_ERROR,
+ "insufficient space on external media");
}
File base = new File(root.getPath() + Constants.DEFAULT_DL_SUBDIR);
if (!base.isDirectory() && !base.mkdir()) {
// Can't create download directory, e.g. because a file called "download"
// already exists at the root level, or the SD card filesystem is read-only.
- Log.d(Constants.TAG, "download aborted - can't create base directory "
- + base.getPath());
- throw new GenerateSaveFileError(Downloads.Impl.STATUS_FILE_ERROR);
+ throw new GenerateSaveFileError(Downloads.Impl.STATUS_FILE_ERROR,
+ "unable to create external downloads directory " + base.getPath());
}
return base;
}
@@ -278,9 +268,9 @@ public class Helpers {
// Insufficient space; try discarding purgeable files.
if (!discardPurgeableFiles(context, contentLength - bytesAvailable)) {
// No files to purge, give up.
- Log.d(Constants.TAG,
- "download aborted - not enough free space in internal storage");
- throw new GenerateSaveFileError(Downloads.Impl.STATUS_INSUFFICIENT_SPACE_ERROR);
+ throw new GenerateSaveFileError(Downloads.Impl.STATUS_INSUFFICIENT_SPACE_ERROR,
+ "not enough free space in internal download storage, unable to free any "
+ + "more");
}
bytesAvailable = getAvailableBytes(base);
}
@@ -482,7 +472,8 @@ public class Helpers {
sequence += sRandom.nextInt(magnitude) + 1;
}
}
- throw new GenerateSaveFileError(Downloads.Impl.STATUS_FILE_ERROR);
+ throw new GenerateSaveFileError(Downloads.Impl.STATUS_FILE_ERROR,
+ "failed to generate an unused filename on internal download storage");
}
/**
diff --git a/tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java b/tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java
index 350c63d4..0cb63e0f 100644
--- a/tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java
+++ b/tests/src/com/android/providers/downloads/DownloadManagerFunctionalTest.java
@@ -82,7 +82,7 @@ public class DownloadManagerFunctionalTest extends AbstractDownloadManagerFuncti
downloadUri = requestDownload("/path");
updateDownload(downloadUri, Downloads.COLUMN_DESTINATION,
Integer.toString(Downloads.DESTINATION_CACHE_PARTITION_NOROAMING));
- runUntilStatus(downloadUri, Downloads.STATUS_RUNNING_PAUSED);
+ runUntilStatus(downloadUri, Downloads.Impl.STATUS_WAITING_FOR_NETWORK);
// ...and pick up when we're off roaming
enqueueResponse(HTTP_OK, FILE_CONTENT);
diff --git a/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java b/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java
index ab7d0e4e..cad01df6 100644
--- a/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java
+++ b/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java
@@ -531,7 +531,7 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest {
Download download = enqueueRequest(getRequest().setDestinationUri(destination));
download.runUntilStatus(DownloadManager.STATUS_FAILED);
assertEquals(DownloadManager.ERROR_FILE_ALREADY_EXISTS,
- download.getLongField(DownloadManager.COLUMN_ERROR_CODE));
+ download.getLongField(DownloadManager.COLUMN_REASON));
}
public void testEmptyFields() throws Exception {
@@ -542,7 +542,7 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest {
assertEquals(0, download.getLongField(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
assertEquals(-1, download.getLongField(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
// just ensure no exception is thrown
- download.getLongField(DownloadManager.COLUMN_ERROR_CODE);
+ download.getLongField(DownloadManager.COLUMN_REASON);
}
public void testRestart() throws Exception {
@@ -567,7 +567,7 @@ public class PublicApiFunctionalTest extends AbstractPublicApiTest {
Download download = enqueueRequest(getRequest());
download.runUntilStatus(DownloadManager.STATUS_FAILED);
assertEquals(expectedErrorCode,
- download.getLongField(DownloadManager.COLUMN_ERROR_CODE));
+ download.getLongField(DownloadManager.COLUMN_REASON));
}
/**
diff --git a/ui/AndroidManifest.xml b/ui/AndroidManifest.xml
index de8da45d..c2c93241 100644
--- a/ui/AndroidManifest.xml
+++ b/ui/AndroidManifest.xml
@@ -9,7 +9,8 @@
<application android:process="android.process.media"
android:label="@string/app_label"
android:icon="@drawable/ic_launcher_download">
- <activity android:name=".DownloadList">
+ <activity android:name=".DownloadList"
+ android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
diff --git a/ui/res/values-cs/strings.xml b/ui/res/values-cs/strings.xml
new file mode 100644
index 00000000..3f9f7ce4
--- /dev/null
+++ b/ui/res/values-cs/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Stahování"</string>
+ <string name="download_title" msgid="2470985874255839247">"Stahování"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Žádná stahování"</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Neznámé&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Řadit podle velikosti"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"Ve frontě"</string>
+ <string name="download_running" msgid="4656462962155580641">"Probíhá"</string>
+ <string name="download_success" msgid="7006048006543495236">"Dokončeno"</string>
+ <string name="download_error" msgid="3107369653921738690">"Neúspěšné"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Soubor není dostupný"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Toto stažení se nezdařilo."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Tento soubor je ve frontě stahování."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Stažený soubor nelze nalézt."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Soubor nelze otevřít"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Odebrat"</string>
+ <string name="delete_download" msgid="76629022653866471">"Smazat"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Zachovat"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Zrušit"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Zkusit znovu"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Zrušit výběr všech"</string>
+</resources>
diff --git a/ui/res/values-da/strings.xml b/ui/res/values-da/strings.xml
new file mode 100644
index 00000000..68481abc
--- /dev/null
+++ b/ui/res/values-da/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Downloads"</string>
+ <string name="download_title" msgid="2470985874255839247">"Downloads"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Ingen downloads."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Ukendt&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Sorter efter størrelse"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"I kø"</string>
+ <string name="download_running" msgid="4656462962155580641">"I gang"</string>
+ <string name="download_success" msgid="7006048006543495236">"Fuldført"</string>
+ <string name="download_error" msgid="3107369653921738690">"Mislykket"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Filen er ikke tilgængelig"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Denne download mislykkedes."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Filen downloades senere."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Den downloadede fil blev ikke fundet."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Filen kan ikke åbnes"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Fjern"</string>
+ <string name="delete_download" msgid="76629022653866471">"Slet"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Behold"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Annuller"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Prøv igen"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Ryd valgte"</string>
+</resources>
diff --git a/ui/res/values-de/strings.xml b/ui/res/values-de/strings.xml
new file mode 100644
index 00000000..d2664d95
--- /dev/null
+++ b/ui/res/values-de/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Downloads"</string>
+ <string name="download_title" msgid="2470985874255839247">"Downloads"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Keine Downloads"</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Unbekannt&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Nach Größe sortieren"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"Wartet"</string>
+ <string name="download_running" msgid="4656462962155580641">"Läuft"</string>
+ <string name="download_success" msgid="7006048006543495236">"Fertig"</string>
+ <string name="download_error" msgid="3107369653921738690">"Fehler"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Datei nicht verfügbar"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Dieser Download ist fehlgeschlagen."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Diese Datei wurde zum späteren Download in die Warteschlange gestellt."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Die heruntergeladene Datei kann nicht gefunden werden."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Datei kann nicht geöffnet werden."</string>
+ <string name="remove_download" msgid="6372920256257247857">"Entfernen"</string>
+ <string name="delete_download" msgid="76629022653866471">"Löschen"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Beibehalten"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Abbrechen"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Wiederholen"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Auswahl löschen"</string>
+</resources>
diff --git a/ui/res/values-el/strings.xml b/ui/res/values-el/strings.xml
new file mode 100644
index 00000000..b56f790d
--- /dev/null
+++ b/ui/res/values-el/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Λήψεις"</string>
+ <string name="download_title" msgid="2470985874255839247">"Λήψεις"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Καμία λήψη."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Άγνωστο&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Ταξινόμηση βάσει μεγέθους"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"Σε ουρά"</string>
+ <string name="download_running" msgid="4656462962155580641">"Σε εξέλιξη"</string>
+ <string name="download_success" msgid="7006048006543495236">"Ολοκληρ."</string>
+ <string name="download_error" msgid="3107369653921738690">"Αποτυχία"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Μη διαθέσιμο αρχείο"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Αυτή η λήψη δεν ήταν επιτυχής."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Αυτό το αρχείο είναι στην ουρά για μελλοντική λήψη."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Δεν είναι δυνατή η εύρεση του αρχείου λήψης."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Δεν είναι δυνατό το άνοιγμα του αρχείου"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Κατάργηση"</string>
+ <string name="delete_download" msgid="76629022653866471">"Διαγραφή"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Διατήρηση"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Άκυρο"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Επανάληψη"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Εκκαθάριση επιλογής"</string>
+</resources>
diff --git a/ui/res/values-es-rUS/strings.xml b/ui/res/values-es-rUS/strings.xml
new file mode 100644
index 00000000..e7675ec7
--- /dev/null
+++ b/ui/res/values-es-rUS/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Descargas"</string>
+ <string name="download_title" msgid="2470985874255839247">"Descargas"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"No hay descargas."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Desconocido&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Ordenar por tamaño"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"Citado"</string>
+ <string name="download_running" msgid="4656462962155580641">"En progreso"</string>
+ <string name="download_success" msgid="7006048006543495236">"Completa"</string>
+ <string name="download_error" msgid="3107369653921738690">"Error"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Archivo no disponible"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Esta descarga no fue exitosa."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Este archivo está en cola para descargas futuras."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"No podemos encontrar el archivo que se descargó."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"No se puede abrir el archivo."</string>
+ <string name="remove_download" msgid="6372920256257247857">"Eliminar"</string>
+ <string name="delete_download" msgid="76629022653866471">"Eliminar"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Conservar"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Cancelar"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Intentar nuevamente"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Borrar selección"</string>
+</resources>
diff --git a/ui/res/values-es/strings.xml b/ui/res/values-es/strings.xml
new file mode 100644
index 00000000..7f0dd7c5
--- /dev/null
+++ b/ui/res/values-es/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Descargas"</string>
+ <string name="download_title" msgid="2470985874255839247">"Descargas"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"No hay descargas."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Desconocido&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Ordenar por tamaño"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"En cola"</string>
+ <string name="download_running" msgid="4656462962155580641">"En curso"</string>
+ <string name="download_success" msgid="7006048006543495236">"Completada"</string>
+ <string name="download_error" msgid="3107369653921738690">"Con error"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Archivo no disponible"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Se ha producido un error al realizar la descarga."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Este archivo está en cola para descargarlo más tarde."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"No se puede encontrar el archivo descargado."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"No se puede abrir el archivo."</string>
+ <string name="remove_download" msgid="6372920256257247857">"Quitar"</string>
+ <string name="delete_download" msgid="76629022653866471">"Eliminar"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Conservar"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Cancelar"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Reintentar"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Borrar selección"</string>
+</resources>
diff --git a/ui/res/values-fr/strings.xml b/ui/res/values-fr/strings.xml
new file mode 100644
index 00000000..a342166f
--- /dev/null
+++ b/ui/res/values-fr/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Téléchargements"</string>
+ <string name="download_title" msgid="2470985874255839247">"Téléchargements"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Aucun téléchargement"</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Inconnu&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Trier par taille"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"Ajouté à la file d\'attente"</string>
+ <string name="download_running" msgid="4656462962155580641">"En cours…"</string>
+ <string name="download_success" msgid="7006048006543495236">"Terminé"</string>
+ <string name="download_error" msgid="3107369653921738690">"Échec"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Fichier indisponible"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Ce téléchargement a échoué."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Ce fichier est mis en file d\'attente et sera téléchargé ultérieurement."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Le fichier téléchargé est introuvable."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Impossible d\'ouvrir le fichier."</string>
+ <string name="remove_download" msgid="6372920256257247857">"Supprimer"</string>
+ <string name="delete_download" msgid="76629022653866471">"Supprimer"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Conserver"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Annuler"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Réessayer"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Annuler la sélection"</string>
+</resources>
diff --git a/ui/res/values-it/strings.xml b/ui/res/values-it/strings.xml
new file mode 100644
index 00000000..c73e77fd
--- /dev/null
+++ b/ui/res/values-it/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Download"</string>
+ <string name="download_title" msgid="2470985874255839247">"Download"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Nessun download."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Sconosciuto&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Ordina per dimensioni"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"In coda"</string>
+ <string name="download_running" msgid="4656462962155580641">"In corso"</string>
+ <string name="download_success" msgid="7006048006543495236">"Completato"</string>
+ <string name="download_error" msgid="3107369653921738690">"Non riuscito"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"File non disponibile"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Questo download non è riuscito."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Questo file è in coda per un futuro download."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Impossibile trovare il file scaricato."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Impossibile aprire il file"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Rimuovi"</string>
+ <string name="delete_download" msgid="76629022653866471">"Elimina"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Conserva"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Annulla"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Riprova"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Annulla selezione"</string>
+</resources>
diff --git a/ui/res/values-ja/strings.xml b/ui/res/values-ja/strings.xml
new file mode 100644
index 00000000..25d2c14c
--- /dev/null
+++ b/ui/res/values-ja/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"ダウンロード"</string>
+ <string name="download_title" msgid="2470985874255839247">"ダウンロード"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"ダウンロードはありません。"</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;不明&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"サイズ順"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"キューに登録"</string>
+ <string name="download_running" msgid="4656462962155580641">"処理中"</string>
+ <string name="download_success" msgid="7006048006543495236">"完了"</string>
+ <string name="download_error" msgid="3107369653921738690">"失敗"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"ファイルを利用できません"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"このダウンロードは失敗しました。"</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"このファイルはダウンロード待機中です。"</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"ダウンロードしたファイルが見つかりません。"</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"ファイルを開けません"</string>
+ <string name="remove_download" msgid="6372920256257247857">"削除"</string>
+ <string name="delete_download" msgid="76629022653866471">"削除"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"継続"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"キャンセル"</string>
+ <string name="retry_download" msgid="7617100787922717912">"再試行"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"選択を解除"</string>
+</resources>
diff --git a/ui/res/values-ko/strings.xml b/ui/res/values-ko/strings.xml
new file mode 100644
index 00000000..afd8384d
--- /dev/null
+++ b/ui/res/values-ko/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"다운로드"</string>
+ <string name="download_title" msgid="2470985874255839247">"다운로드"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"다운로드 항목이 없습니다."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;알 수 없음&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"크기별 정렬"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"대기 중"</string>
+ <string name="download_running" msgid="4656462962155580641">"진행 중"</string>
+ <string name="download_success" msgid="7006048006543495236">"완료"</string>
+ <string name="download_error" msgid="3107369653921738690">"실패"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"파일이 없습니다."</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"다운로드에 실패했습니다."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"다음 다운로드를 위해 파일이 대기 중입니다."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"다운로드한 파일을 찾지 못했습니다."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"파일을 열 수 없음"</string>
+ <string name="remove_download" msgid="6372920256257247857">"삭제"</string>
+ <string name="delete_download" msgid="76629022653866471">"삭제"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"유지"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"취소"</string>
+ <string name="retry_download" msgid="7617100787922717912">"다시 시도"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"선택 취소"</string>
+</resources>
diff --git a/ui/res/values-nb/strings.xml b/ui/res/values-nb/strings.xml
new file mode 100644
index 00000000..2cd42064
--- /dev/null
+++ b/ui/res/values-nb/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Nedlastinger"</string>
+ <string name="download_title" msgid="2470985874255839247">"Nedlastinger"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Ingen nedlastinger."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Ukjent&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Sorter etter størrelse"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"I kø"</string>
+ <string name="download_running" msgid="4656462962155580641">"Arbeider"</string>
+ <string name="download_success" msgid="7006048006543495236">"Fullført"</string>
+ <string name="download_error" msgid="3107369653921738690">"Mislyktes"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Filen er ikke tilgj."</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Nedlastingen mislyktes."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Filen er satt i kø for nedlasting."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Finner ikke den nedlastede filen."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Kan ikke åpne filen"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Fjern"</string>
+ <string name="delete_download" msgid="76629022653866471">"Slett"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Behold"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Avbryt"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Prøv på nytt"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Slett valg"</string>
+</resources>
diff --git a/ui/res/values-nl/strings.xml b/ui/res/values-nl/strings.xml
new file mode 100644
index 00000000..afff9b68
--- /dev/null
+++ b/ui/res/values-nl/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Downloads"</string>
+ <string name="download_title" msgid="2470985874255839247">"Downloads"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Geen downloads."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Onbekend&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Sorteren op grootte"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"In wachtrij"</string>
+ <string name="download_running" msgid="4656462962155580641">"Bezig"</string>
+ <string name="download_success" msgid="7006048006543495236">"Voltooid"</string>
+ <string name="download_error" msgid="3107369653921738690">"Mislukt"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Bestand niet beschikbaar"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Deze download is mislukt."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Het bestand staat in de wachtrij om later te worden gedownload."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Kan het gedownloade bestand niet vinden."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Kan bestand niet openen"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Verwijderen"</string>
+ <string name="delete_download" msgid="76629022653866471">"Verwijderen"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Houden"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Annuleren"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Opnieuw proberen"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Selectie wissen"</string>
+</resources>
diff --git a/ui/res/values-pl/strings.xml b/ui/res/values-pl/strings.xml
new file mode 100644
index 00000000..fea92f47
--- /dev/null
+++ b/ui/res/values-pl/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Pobrane"</string>
+ <string name="download_title" msgid="2470985874255839247">"Pobrane"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Brak pobranych plików."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Nieznane&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Sortuj według rozmiaru"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"W kolejce"</string>
+ <string name="download_running" msgid="4656462962155580641">"W toku"</string>
+ <string name="download_success" msgid="7006048006543495236">"Ukończono"</string>
+ <string name="download_error" msgid="3107369653921738690">"Błąd"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Plik jest niedostępny"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"To pobranie nie powiodło się."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Ten plik jest w kolejce do pobrania w przyszłości."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Nie można znaleźć pobranego pliku."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Nie można otworzyć pliku"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Usuń"</string>
+ <string name="delete_download" msgid="76629022653866471">"Usuń"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Zachowaj"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Anuluj"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Ponów próbę"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Usuń zaznaczenie"</string>
+</resources>
diff --git a/ui/res/values-pt-rPT/strings.xml b/ui/res/values-pt-rPT/strings.xml
new file mode 100644
index 00000000..b32e0d55
--- /dev/null
+++ b/ui/res/values-pt-rPT/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Transferências"</string>
+ <string name="download_title" msgid="2470985874255839247">"Transferências"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Não há transferências."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Desconhecido&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Ordenar por tamanho"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"Em fila"</string>
+ <string name="download_running" msgid="4656462962155580641">"Em curso"</string>
+ <string name="download_success" msgid="7006048006543495236">"Concluído"</string>
+ <string name="download_error" msgid="3107369653921738690">"Falhou"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Ficheiro não disponível"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Esta transferência não teve êxito."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"O ficheiro está colocado em fila para uma futura transferência."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Não é possível encontrar o ficheiro transferido."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Não é possível abrir o ficheiro"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Remover"</string>
+ <string name="delete_download" msgid="76629022653866471">"Eliminar"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Manter"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Cancelar"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Tentar novamente"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Limpar selecção"</string>
+</resources>
diff --git a/ui/res/values-pt/strings.xml b/ui/res/values-pt/strings.xml
new file mode 100644
index 00000000..1697607a
--- /dev/null
+++ b/ui/res/values-pt/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Downloads"</string>
+ <string name="download_title" msgid="2470985874255839247">"Downloads"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Nenhum download."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Desconhecido&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Classificar por tamanho"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"Na fila"</string>
+ <string name="download_running" msgid="4656462962155580641">"Em andamen."</string>
+ <string name="download_success" msgid="7006048006543495236">"Concluído"</string>
+ <string name="download_error" msgid="3107369653921738690">"Falha"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Arquivo não disponível"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Falha no download."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Este arquivo está na fila para download no futuro."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Não foi possível encontrar o arquivo carregado."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Não é possível abrir o arquivo"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Remover"</string>
+ <string name="delete_download" msgid="76629022653866471">"Excluir"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Manter"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Cancelar"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Tentar novamente"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Limpar seleção"</string>
+</resources>
diff --git a/ui/res/values-ru/strings.xml b/ui/res/values-ru/strings.xml
new file mode 100644
index 00000000..6a0df1a0
--- /dev/null
+++ b/ui/res/values-ru/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Загрузки"</string>
+ <string name="download_title" msgid="2470985874255839247">"Загрузки"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Нет загрузок."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Неизвестно&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Сортировать по размеру"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"В очереди"</string>
+ <string name="download_running" msgid="4656462962155580641">"В процессе"</string>
+ <string name="download_success" msgid="7006048006543495236">"Завершено"</string>
+ <string name="download_error" msgid="3107369653921738690">"Не удалось"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Файл недоступен"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Не удалось выполнить загрузку."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Файл добавлен в очередь загрузки."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Не удалось найти загруженный файл."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Невозможно открыть файл"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Удалить"</string>
+ <string name="delete_download" msgid="76629022653866471">"Удалить"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Сохранить"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Отмена"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Повторить"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Снять выделение"</string>
+</resources>
diff --git a/ui/res/values-sv/strings.xml b/ui/res/values-sv/strings.xml
new file mode 100644
index 00000000..7013477e
--- /dev/null
+++ b/ui/res/values-sv/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"Hämtningar"</string>
+ <string name="download_title" msgid="2470985874255839247">"Hämtningar"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"Inga hämtningar."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Okänd&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Sortera efter storlek"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"I kö"</string>
+ <string name="download_running" msgid="4656462962155580641">"Bearbetas"</string>
+ <string name="download_success" msgid="7006048006543495236">"Slutförd"</string>
+ <string name="download_error" msgid="3107369653921738690">"Misslyckad"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Filen är inte tillgänglig"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"Hämtningen misslyckades."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Filen står i kö och hämtas senare."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"Den hämtade filen hittades inte."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Det går inte att öppna filen"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Ta bort"</string>
+ <string name="delete_download" msgid="76629022653866471">"Ta bort"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Behåll"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"Avbryt"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Försök igen"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Ta bort markerade"</string>
+</resources>
diff --git a/ui/res/values-tr/strings.xml b/ui/res/values-tr/strings.xml
new file mode 100644
index 00000000..36aa8099
--- /dev/null
+++ b/ui/res/values-tr/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"İndirilenler"</string>
+ <string name="download_title" msgid="2470985874255839247">"İndirilenler"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"İndirilen öğe yok."</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;Bilinmiyor&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"Boyuta göre sırala"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"Kuyrğ alndı"</string>
+ <string name="download_running" msgid="4656462962155580641">"Dvm ediyor"</string>
+ <string name="download_success" msgid="7006048006543495236">"Tamamlandı"</string>
+ <string name="download_error" msgid="3107369653921738690">"Başarısız"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"Dosya kullanılamıyor"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"İndirme işlemi başarısız oldu."</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"Bu dosya daha sonra indirilmek üzere kuyruğa alındı."</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"İndirilen dosya bulunamadı."</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"Dosya açılamıyor"</string>
+ <string name="remove_download" msgid="6372920256257247857">"Kaldır"</string>
+ <string name="delete_download" msgid="76629022653866471">"Sil"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"Sakla"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"İptal"</string>
+ <string name="retry_download" msgid="7617100787922717912">"Tekrar Dene"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"Seçimi temizle"</string>
+</resources>
diff --git a/ui/res/values-zh-rCN/strings.xml b/ui/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000..751a8fe6
--- /dev/null
+++ b/ui/res/values-zh-rCN/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"下载内容"</string>
+ <string name="download_title" msgid="2470985874255839247">"下载内容"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"无下载内容。"</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;未知&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"按大小排序"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"已加入队列"</string>
+ <string name="download_running" msgid="4656462962155580641">"正在下载"</string>
+ <string name="download_success" msgid="7006048006543495236">"已完成"</string>
+ <string name="download_error" msgid="3107369653921738690">"下载失败"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"文件不可用"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"该下载失败。"</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"该文件已加入队列,供以后下载。"</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"未找到已下载的文件。"</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"无法打开文件"</string>
+ <string name="remove_download" msgid="6372920256257247857">"删除"</string>
+ <string name="delete_download" msgid="76629022653866471">"删除"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"保留"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"取消"</string>
+ <string name="retry_download" msgid="7617100787922717912">"重试"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"清除所选项"</string>
+</resources>
diff --git a/ui/res/values-zh-rTW/strings.xml b/ui/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000..4520539c
--- /dev/null
+++ b/ui/res/values-zh-rTW/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3070921713463294774">"下載"</string>
+ <string name="download_title" msgid="2470985874255839247">"下載檔案"</string>
+ <string name="no_downloads" msgid="1029667411186146836">"無下載檔案。"</string>
+ <string name="missing_title" msgid="830115697868833773">"&lt;不明&gt;"</string>
+ <string name="download_menu_sort_by_size" msgid="2276438658769422878">"依大小排序"</string>
+ <!-- no translation found for download_menu_sort_by_date (4300882048968609945) -->
+ <skip />
+ <string name="download_pending" msgid="446474554414082313">"已佇列"</string>
+ <string name="download_running" msgid="4656462962155580641">"進行中"</string>
+ <string name="download_success" msgid="7006048006543495236">"完成"</string>
+ <string name="download_error" msgid="3107369653921738690">"失敗"</string>
+ <string name="dialog_title_not_available" msgid="7778534318108794843">"檔案無法使用。"</string>
+ <string name="dialog_failed_body" msgid="6156768789629578318">"下載失敗。"</string>
+ <string name="dialog_queued_body" msgid="2506935748423351902">"檔案已排入之後要下載的佇列中。"</string>
+ <string name="dialog_file_missing_body" msgid="2783781332668129395">"找不到下載的檔案。"</string>
+ <!-- no translation found for dialog_insufficient_space_on_external (7534108515812329821) -->
+ <skip />
+ <!-- no translation found for dialog_insufficient_space_on_cache (8387210487235302129) -->
+ <skip />
+ <!-- no translation found for dialog_cannot_resume (7704082031608361756) -->
+ <skip />
+ <!-- no translation found for dialog_file_already_exists (2663737850617642888) -->
+ <skip />
+ <!-- no translation found for dialog_media_not_found (5308602145105720991) -->
+ <skip />
+ <string name="download_no_application_title" msgid="3501359021635168387">"無法開啟檔案"</string>
+ <string name="remove_download" msgid="6372920256257247857">"移除"</string>
+ <string name="delete_download" msgid="76629022653866471">"刪除"</string>
+ <string name="keep_queued_download" msgid="5144882786014818569">"保留"</string>
+ <string name="cancel_running_download" msgid="5232704030969221112">"取消"</string>
+ <string name="retry_download" msgid="7617100787922717912">"重試"</string>
+ <string name="deselect_all" msgid="5638030443515705047">"取消選取"</string>
+</resources>
diff --git a/ui/res/values/strings.xml b/ui/res/values/strings.xml
index bb3654af..6bd9f2c9 100644
--- a/ui/res/values/strings.xml
+++ b/ui/res/values/strings.xml
@@ -38,9 +38,9 @@
<!-- Status messages -->
- <!-- Status indicating that the download has not yet begun. Appears for an individual item in
- the download list. [CHAR LIMIT=11] -->
- <string name="download_pending">Queued</string>
+ <!-- Status indicating that the download has been queued to start in the future. Appears for an
+ individual item in the download list. [CHAR LIMIT=11] -->
+ <string name="download_queued">Queued</string>
<!-- Status indicating that the system is currently downloading the file. Appears for an
individual item in the download list. [CHAR LIMIT=11] -->
<string name="download_running">In progress</string>
diff --git a/ui/src/com/android/providers/downloads/ui/DownloadAdapter.java b/ui/src/com/android/providers/downloads/ui/DownloadAdapter.java
index c7d4c2cb..9c572538 100644
--- a/ui/src/com/android/providers/downloads/ui/DownloadAdapter.java
+++ b/ui/src/com/android/providers/downloads/ui/DownloadAdapter.java
@@ -57,6 +57,7 @@ public class DownloadAdapter extends CursorAdapter {
private int mTitleColumnId;
private int mDescriptionColumnId;
private int mStatusColumnId;
+ private int mReasonColumnId;
private int mTotalBytesColumnId;
private int mMediaTypeColumnId;
private int mDateColumnId;
@@ -76,6 +77,7 @@ public class DownloadAdapter extends CursorAdapter {
mTitleColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TITLE);
mDescriptionColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_DESCRIPTION);
mStatusColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS);
+ mReasonColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_REASON);
mTotalBytesColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES);
mMediaTypeColumnId = cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_MEDIA_TYPE);
mDateColumnId =
@@ -150,11 +152,15 @@ public class DownloadAdapter extends CursorAdapter {
return R.string.download_success;
case DownloadManager.STATUS_PENDING:
- return R.string.download_pending;
-
case DownloadManager.STATUS_RUNNING:
- case DownloadManager.STATUS_PAUSED:
return R.string.download_running;
+
+ case DownloadManager.STATUS_PAUSED:
+ if (mCursor.getInt(mReasonColumnId) == DownloadManager.PAUSED_QUEUED_FOR_WIFI) {
+ return R.string.download_queued;
+ } else {
+ return R.string.download_running;
+ }
}
throw new IllegalStateException("Unknown status: " + mCursor.getInt(mStatusColumnId));
}
diff --git a/ui/src/com/android/providers/downloads/ui/DownloadList.java b/ui/src/com/android/providers/downloads/ui/DownloadList.java
index 4b3547c2..f1cb91fe 100644
--- a/ui/src/com/android/providers/downloads/ui/DownloadList.java
+++ b/ui/src/com/android/providers/downloads/ui/DownloadList.java
@@ -85,7 +85,7 @@ public class DownloadList extends Activity
private int mIdColumnId;
private int mLocalUriColumnId;
private int mMediaTypeColumnId;
- private int mErrorCodeColumndId;
+ private int mReasonColumndId;
private boolean mIsSortedBySize = false;
private Set<Long> mSelectedIds = new HashSet<Long>();
@@ -94,8 +94,9 @@ public class DownloadList extends Activity
* We keep track of when a dialog is being displayed for a pending download, because if that
* download starts running, we want to immediately hide the dialog.
*/
- private Long mPendingDownloadId = null;
- private AlertDialog mPendingDialog;
+ private Long mQueuedDownloadId = null;
+ private AlertDialog mQueuedDialog;
+
private class MyContentObserver extends ContentObserver {
public MyContentObserver() {
@@ -145,8 +146,8 @@ public class DownloadList extends Activity
mDateSortedCursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI);
mMediaTypeColumnId =
mDateSortedCursor.getColumnIndexOrThrow(DownloadManager.COLUMN_MEDIA_TYPE);
- mErrorCodeColumndId =
- mDateSortedCursor.getColumnIndexOrThrow(DownloadManager.COLUMN_ERROR_CODE);
+ mReasonColumndId =
+ mDateSortedCursor.getColumnIndexOrThrow(DownloadManager.COLUMN_REASON);
mDateSortedAdapter = new DateSortedDownloadAdapter(this, mDateSortedCursor, this);
mDateOrderedListView.setAdapter(mDateSortedAdapter);
@@ -359,19 +360,23 @@ public class DownloadList extends Activity
long id = cursor.getInt(mIdColumnId);
switch (cursor.getInt(mStatusColumnId)) {
case DownloadManager.STATUS_PENDING:
- mPendingDownloadId = id;
- mPendingDialog = new AlertDialog.Builder(this)
- .setTitle(R.string.dialog_title_not_available)
- .setMessage(R.string.dialog_queued_body)
- .setPositiveButton(R.string.keep_queued_download, null)
- .setNegativeButton(R.string.remove_download, getDeleteClickHandler(id))
- .setOnCancelListener(this)
- .show();
+ case DownloadManager.STATUS_RUNNING:
+ sendRunningDownloadClickedBroadcast(id);
break;
- case DownloadManager.STATUS_RUNNING:
case DownloadManager.STATUS_PAUSED:
- sendRunningDownloadClickedBroadcast(id);
+ if (isPausedForWifi(cursor)) {
+ mQueuedDownloadId = id;
+ mQueuedDialog = new AlertDialog.Builder(this)
+ .setTitle(R.string.dialog_title_not_available)
+ .setMessage(R.string.dialog_queued_body)
+ .setPositiveButton(R.string.keep_queued_download, null)
+ .setNegativeButton(R.string.remove_download, getDeleteClickHandler(id))
+ .setOnCancelListener(this)
+ .show();
+ } else {
+ sendRunningDownloadClickedBroadcast(id);
+ }
break;
case DownloadManager.STATUS_SUCCESSFUL:
@@ -388,7 +393,7 @@ public class DownloadList extends Activity
* @return the appropriate error message for the failed download pointed to by cursor
*/
private String getErrorMessage(Cursor cursor) {
- switch (cursor.getInt(mErrorCodeColumndId)) {
+ switch (cursor.getInt(mReasonColumndId)) {
case DownloadManager.ERROR_FILE_ALREADY_EXISTS:
if (isOnExternalStorage(cursor)) {
return getString(R.string.dialog_file_already_exists);
@@ -577,9 +582,11 @@ public class DownloadList extends Activity
private void deleteDownload(long downloadId) {
if (moveToDownload(downloadId)) {
int status = mDateSortedCursor.getInt(mStatusColumnId);
- if (status == DownloadManager.STATUS_SUCCESSFUL
- || status == DownloadManager.STATUS_FAILED) {
- String path = Uri.parse(mDateSortedCursor.getString(mLocalUriColumnId)).getPath();
+ boolean isComplete = status == DownloadManager.STATUS_SUCCESSFUL
+ || status == DownloadManager.STATUS_FAILED;
+ String localUri = mDateSortedCursor.getString(mLocalUriColumnId);
+ if (isComplete && localUri != null) {
+ String path = Uri.parse(localUri).getPath();
if (path.startsWith(Environment.getExternalStorageDirectory().getPath())) {
String mediaType = mDateSortedCursor.getString(mMediaTypeColumnId);
deleteDownloadedFile(path, mediaType);
@@ -616,13 +623,18 @@ public class DownloadList extends Activity
void handleDownloadsChanged() {
checkSelectionForDeletedEntries();
- if (mPendingDownloadId != null && moveToDownload(mPendingDownloadId)) {
- if (mDateSortedCursor.getInt(mStatusColumnId) != DownloadManager.STATUS_PENDING) {
- mPendingDialog.cancel();
+ if (mQueuedDownloadId != null && moveToDownload(mQueuedDownloadId)) {
+ if (mDateSortedCursor.getInt(mStatusColumnId) != DownloadManager.STATUS_PAUSED
+ || !isPausedForWifi(mDateSortedCursor)) {
+ mQueuedDialog.cancel();
}
}
}
+ private boolean isPausedForWifi(Cursor cursor) {
+ return cursor.getInt(mReasonColumndId) == DownloadManager.PAUSED_QUEUED_FOR_WIFI;
+ }
+
/**
* Check if any of the selected downloads have been deleted from the downloads database, and
* remove such downloads from the selection.
@@ -662,7 +674,7 @@ public class DownloadList extends Activity
*/
@Override
public void onCancel(DialogInterface dialog) {
- mPendingDownloadId = null;
- mPendingDialog = null;
+ mQueuedDownloadId = null;
+ mQueuedDialog = null;
}
}