diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9becd0870..d8044e1ed 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + if ("com.android.build.gradle.AppPlugin".equals(plugin.class.name) || + "com.android.build.gradle.LibraryPlugin".equals(plugin.class.name)) { + project.android.dexOptions.preDexLibraries = rootProject.ext.preDexLibs + } + } +} + android { compileSdkVersion 19 buildToolsVersion '20.0.0' + dexOptions { + preDexLibraries = rootProject.ext.preDexLibs + } + sourceSets { main { manifest.srcFile 'AndroidManifest.xml' @@ -51,6 +73,16 @@ android { } } +check.dependsOn 'checkstyle' +task checkstyle(type: Checkstyle) { + ignoreFailures = true + configFile file("config/checkstyle/checkstyle.xml") + + source 'src' + include '**/*.java' + classpath = files() +} + task testsOnJVM(type :GradleBuild, dependsOn: assemble) { buildFile = 'tests-on-jvm/build.gradle' tasks = ['test'] diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 000000000..7b0a8b796 --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/feature_graphic.png b/images/feature_graphic.png new file mode 100644 index 000000000..fdef6de76 Binary files /dev/null and b/images/feature_graphic.png differ diff --git a/images/feature_graphic.svg b/images/feature_graphic.svg new file mode 100644 index 000000000..fc8709384 --- /dev/null +++ b/images/feature_graphic.svg @@ -0,0 +1,1474 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + K-9 Mail + Advanced Emailing + + + diff --git a/plugins/HoloColorPicker/build.gradle b/plugins/HoloColorPicker/build.gradle index 7c966604e..610b12133 100644 --- a/plugins/HoloColorPicker/build.gradle +++ b/plugins/HoloColorPicker/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 19 - buildToolsVersion '19.1.0' + buildToolsVersion '20.0.0' sourceSets { main { diff --git a/res/menu/message_compose_option.xml b/res/menu/message_compose_option.xml index 06cf7ac68..4d3d4e37a 100644 --- a/res/menu/message_compose_option.xml +++ b/res/menu/message_compose_option.xml @@ -39,16 +39,4 @@ android:title="@string/read_receipt" android:icon="?attr/iconActionRequestReadReceipt" /> - - diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index b1cd9df16..f0ae6c3ff 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -136,8 +136,6 @@ Si us plau, envia\'ns els errors, contribueix a millorar-lo a Es farà una petició per la confirmació de lectura No es faran més peticions per les confirmacions de lectura Afegeix adjunt - Afegeix adjunt (Imatge) - Afegeix adjunt (Vídeo) Buida paperera Elimina Neteja missatges locals @@ -705,13 +703,7 @@ Si us plau, envia\'ns els errors, contribueix a millorar-lo a Mitjà Gran Més gran - - Comprova \"Configuració\" -> \"Utilitza la galeria la Galeria d\'errors\" per poder adjuntar imatges o vídeos utilitzant la Galeria 3D. - - Utilitza \"Afegeix adjunt (Imatge)\" or \"Afegeix adjunt (Vídeo)\" per afegir imatges o vídeos amb la Galeria 3D. Miscel·lània - Utilitza la Galeria d\'errors - Mostra els botons per afegir adjunts d\'imatge/vídeo (per treballar amb els errors de la Galeria 3D) No s\'ha trobat cap aplicació idònia per a aquesta acció. Versió APG instal·lada no suportada. diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 840b96e31..d1a3a5938 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -137,8 +137,6 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Potvrzení o přečtení bude vyžadováno Potvrzení o přečtení nebude vyžadováno Přidat přílohu - Přidat přílohu (obrázek) - Přidat přílohu (video) Vysypat koš Vymazat Vyčistit místní zprávy @@ -725,13 +723,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Střední Velký Největší - - Zaškrtněte \"Možnosti\" -> \"Obejít chybu Galerie\", abyste byli schopni připojit obrázky nebo video pomocí Galerie 3D. - - Použijte \"Přidat přílohu (obrázek)\" nebo \"Přidat přílohu (video)\" k připojení obrázků a videa pomocí Galerie 3D. Různé - Obejít chybu Galerie - Zobrazit tlačítka k připojení obrázku/videa jako přílohy (kvůli chybě v Galerie 3D) Pro tuto akci nebyla nalezena žádná vhodná aplikace. Nainstalovaná verze APG není podporována. diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 2192bffa3..828bee975 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -133,8 +133,6 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål Der vil blive anmodet om kvittering for modtagelse Der vil ikke blive anmodet om kvittering for modtagelse Vedhæft fil - Vedhæft (billede) - Vedhæft (Video) Tøm papirkurv Ryd helt Fjern lokalt lagrede mails @@ -699,13 +697,7 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål Stor Større Størst - - Kontroller \"Indstillinger\" -> \"Benyt Gallery bug work-around\" for at kunne vedhæfte billeder og videoer med Gallery 3D. - - Benyt \"Tilføj vedhæft (billede)\" eller \"Tilføj vedhæftning (video)\" for at kunne vedhæfte billeder eller videoer med Gallery 3D. Diverse - Benyt Gallery bug work-around - Vis knapper til vedhæftning af billede/video (måde at omgå fejl i Gallery 3D) Kunne ikke finde noget program som kan udføre denne handling. Den installerede version af APG understørttes ikke. diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index aac966798..68e6a76ac 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -137,8 +137,6 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Eine Empfangsbestätigung wird angefordert Es wird keine Empfangsbestätigung angefordert Anhang hinzufügen - Anhang hinzufügen (Bild) - Anhang hinzufügen (Video) Papierkorb leeren Bereinigen (Expunge) Lokale Nachrichten löschen @@ -739,13 +737,7 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Mittel Groß Größer - - Wählen Sie \'Einstellungen\' -> \'Galerie-Workaround aktivieren\', um Bilder oder Videos mit Hilfe der 3D-Galerie hinzufügen zu können. - - Verwenden Sie \'Anhang hinzufügen (Bild)\' oder \'Anhang hinzufügen (Video)\', um Bilder oder Videos mit der 3D-Galerie hinzuzufügen. Verschiedenes - Galerie-Workaround - Schaltflächen zum Hinzufügen von Bild- und Video-Anhängen anzeigen (um Fehler in 3D-Galerie zu umgehen) Keine geeignete Anwendung für diese Aktion gefunden. Die installierte APG-Version wird nicht unterstützt. diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 6ff0d4142..b46e5aa73 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -135,8 +135,6 @@ Θα ζητηθεί απόδειξη ανάγνωσης Δεν θα ζητηθεί απόδειξη ανάγνωσης Προσθήκη συνημμένου - Προσθήκη συνημμένης εικόνας - Προσθήκη συνημμένου βίντεο Άδειασμα σκουπιδιών Εξάλειψη Καθαρισμός τοπικών μηνυμάτων @@ -716,13 +714,7 @@ Μεσαίο Μεγάλο Μεγαλύτερο - - Ελέγξτε \'Ρυθμίσεις\' -> \'Παράκαμψη σφάλματος πινακοθήκης\' για να μπορείτε να συνάψετε εικόνες ή βίντεο με το Gallery 3D. - - Χρήση \'Προσθήκη συνημμένου (Εικόνα)\' ή \'Προσθήκη συνημμένου (Βίντεο)\' για να συνάψετε εικόνες ή βίντεο με το Gallery 3D. Διάφορα - Παράκαμψη σφάλματος πινακοθήκης - Προβολή πλήκτρων για προσθήκη συνημμένων εικόνας/βίντεο (παράκαμψη του σφάλματος Gallery 3D) Δεν βρέθηκε κατάλληλη εφαρμογή για αυτή την ενέργεια. Η εγκατεστημένη έκδοση APG δεν υποστηρίζεται. diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 61b17e09d..fb1249ed1 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -136,8 +136,6 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Se solicitará confirmación de lectura No se solicitará confirmación de lectura Añadir adjunto - Añadir adjunto (imagen) - Añadir adjunto (vídeo) Vaciar Papelera Purgar Borrar mensajes locales @@ -715,13 +713,7 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Mediana Grande Muy Grande - - Comprobar \"Configuración\" -> \"Usar Galería\" para poder adjuntar imágenes y vídeos utilizando la Galería 3D. - - Usar \"Añadir adjunto (Imagen)\" o \"Añadir adjunto (Vídeo)\" para Añadir imágenes o Vídeos con Galería 3D Varios - Usar galería - Mostrar botones para Añadir adjuntos de imagen/vídeo No existe aplicación para realizar esta acción. No se admite esta versión de APG. diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index aa1d5cf81..feb7591e9 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -137,8 +137,6 @@ Palun saada infot probleemidest, soovitavatest lisafunktsioonidest ja küsi küs Taotleb lugemise kinnitust Ei taotle lugemise kinnitust Lisa manus - Lisa manus (pilt) - Lisa manus (video) Tühjenda prügikast Pühi ära Puhasta kohalikud sõnumid @@ -704,8 +702,6 @@ Palun saada infot probleemidest, soovitavatest lisafunktsioonidest ja küsi küs Keskmine Suur Suurem - - Muu Installitud APG versioon ei ole toetatud. diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index fe5ca4430..7d2f46bd8 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -136,8 +136,6 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko Irakurragiria eskatuko da Ez da irakurragiria eskatuko Eranskina gehitu - Eranskina gehitu (Irudia) - Eranskina gehitu (Bideoa) Zakarrontzia hustu Suntsitu Mezu lokalak garbitu @@ -704,13 +702,7 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko Ertaina Handia Handiagoa - - \"Ezarpenak\" -> \"Galeriako arazoa sahiestu\" gaitu 3D galeriako irudi edo bideoak erantsi ahal izateko. - - \"Eranskina gehitu (Irudia)\" edo \"Eranskina gehitu (Video)\" erabili 3D galeriatik irudi edo bideoak eransteko. Bestelakoak - Galeriako arazoa sahiestu - Irudi/bideoak eransteko botoiak ikusi (3D galeriako arazoa sahiesteko) Ez da honetarako aplikaziorik topatu. Instalatutako APG bertsioa ezin da erabili. diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index b08683fac..b4d1aca81 100755 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -138,8 +138,6 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen Vastaanottokuittaus pyydetään Ei pyydä lukukuittausta Lisää liite - Lisää liite (Kuva) - Video Tyhjennä roskakori Poista Poista paikalliset viestit @@ -741,13 +739,7 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen Keskikoko Suuri Suurin - - Tarkista Asetukset -> Ota käyttöön Gallery-ohjelmavirheen kierto mahdollistaaksesi kuvien tai videoiden liittämisen Gallery 3D -ohjelmalla. - - Käytä Lisää liite (kuva)- tai Lisää liite (video) -toimintoa Gallery 3D:n kuvan tai videon liittämiseksi. Muut - Ota käyttöön Gallery -ohjelmavirheen kierto - Näytä painikkeet liitteen (video/kuva) lisäämiseksi (Gallery 3D -ohjelmavirheen kiertäminen) Toiminnolle ei löytynyt sopivaa ohjelmaa. Asennettua APG-versiota ei tueta. diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index f884a580b..bfc287af8 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -135,8 +135,6 @@ Veuillez envoyer les rapports de bogues, suggérer de nouvelles fonctions et pos Un accusé de lecture sera demandé Un accusé de lecture ne sera pas demandé Ajouter une pièce jointe - Joindre une image - Joindre une vidéo Vider la corbeille Supprimer Effacer les messages locaux @@ -739,13 +737,7 @@ jusqu\'à %d de plus Moyen Grand Plus grand - - Cochez «\u00A0Paramètres\u00A0» > «\u00A0Utiliser le contournement du bogue de la Galerie\u00A0» pour être capable d\'attacher des images ou des vidéos en utilisant Galerie 3D. - - Utiliser «\u00A0Joindre une image\u00A0» ou «\u00A0Joindre une vidéo\u00A0» pour joindre des images ou vidéos avec Galerie 3D Divers - Utiliser le contournement du bogue de la Galerie - Afficher les boutons pour joindre des images ou des vidéos (pour contourner le bogue de la Galerie 3D) Aucune application adéquate n\'a été trouvée pour cette action. La version installée d\'APG n\'est pas prise en charge. diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 4c737e097..df0051bb9 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -134,8 +134,6 @@ Envía informes de erro, contribúe con novas funcionalidades e pregunta o que d Pedirase confirmación de lectura Non se pedirá confirmación de lectura Engadir anexo - Engadir anexo (imaxe) - Engadir anexo (vídeo) Baleirar papeleira Purgar Limpar mensaxes locais @@ -695,11 +693,7 @@ Envía informes de erro, contribúe con novas funcionalidades e pregunta o que d Mediana Grande Moi grande - - - Usar \"Engadir anexo (imaxe)\" ou \"Engadir anexo (vídeo)\" para anexar imaxes ou vídeos con Galería 3D. Miscelánea - Mostrar botóns para engadir anexos de imaxe e vídeo Non hai un aplicativo para executar esta acción. Non se admite a versión instalada de APG. diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 45c1172af..30bf874db 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -128,8 +128,6 @@ Por favor, envía os erros que detectes, contribúe con novas funcionalidades e Marcar Non Lido Engadir Cc/Bcc Engadir adxunto - Engadir adxunto (Imaxe) - Engadir adxunto (Vídeo) Valeirar Papelera Erradicar Borrar mensaxes locais @@ -641,13 +639,7 @@ Por favor, envía os erros que detectes, contribúe con novas funcionalidades e Mediana Grande Moi Grande - - Comprobar \"Configuración\" -> \"Usar Galería\" para poder adxuntar imaxes e videos usando a Galería 3D. - - Usar \"Engadir adxunto (Imaxe)\" oo \"Engadir adxunto (Vídeo)\" para Engadir imaxes ou Vídeos con Galería 3D Varios - Usar galería - Amosar botóns para Engadir adxuntos de imaxe/vídeo Non existe aplicación para executar esta acción Non se soporta esta versión de APG diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index a849e2c97..092fa9786 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -135,8 +135,6 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Olvasási jelentés lesz kérve Nem lesz Olvasási jelentés lesz kérve Melléklet - Kép-melléklet csatolása - Videó-melléklet csatolása Lomtár ürítése Biztonságos törlés Helyi üzenetek törlése @@ -693,13 +691,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Közepes Nagy Nagyobb - - Kapcsolja be a \"Beállítások\" -> \"Galéria hiba\" ha 3D galériából akar képet mellékelni. - - Használja a \"Kép csatolása\" vagy \"Videó csatolása\" opciót ha 3D galériából szeretne választani. Egyéb - Galéria hiba kikerülése - Gombok megjelenítése a kép/videó csatoláshoz (a 3D Galéria hiba kikerülése érdekében) Nincs megfelelő alkalmazás ehhez a művelethez. A telepített APG verzió nem támogatott. diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 67a13c478..d577695c0 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -137,8 +137,6 @@ Invia le tue segnalazioni, suggerisci nuove funzionalità e chiedi informazioni Notifica di lettura attiva Non richiederà la notifica di lettura Aggiungi allegato - Aggiungi allegato (Immagine) - Aggiungi allegato (Video) Svuota cestino Rimuovi messaggi eliminati Cancella messaggi locali @@ -740,13 +738,7 @@ Invia le tue segnalazioni, suggerisci nuove funzionalità e chiedi informazioni Medio Grande Più grande - - Controlla \"Impostazioni\" -> \"Aggira bug Galleria immagini\" per allegare immagini o video usando Galleria 3D. - - Utilizza \"Aggiungi allegato (Immagini)\" o \"Aggiungi allegato (Video)\" per allegare immagini o video con Galleria 3D. Varie - Aggira bug della Galleria immagini - Visualizza i pulsanti per allegare immagini/video (evita bug della Galleria 3D) Nessuna applicazione trovata per questa azione. La versione di APG installata non è supportata. diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 6c4afa35e..50cd657d7 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -113,8 +113,6 @@ נדרש אישור לקריאה לא נדרש אישור קריאה צרף קובץ - הוסף קובץ (תמונה) - הוסף קובת (וידאו) רוקן אשפה רוקן נקה הודעות מקומיות @@ -580,13 +578,7 @@ בינוני גדול ענק - - סמן \"הגדרות\" -> \"השתמש בעקיפת באג הגלריה\" כדי שתוכל לצרף תמונות או קטעי וידאו לגלריית 3D. - - השתמש ב \"הוסף קובץ מצורף (תמונה) \" או \"הוסף קובץ מצורף (וידאו) \" כדי לצרף תמונות או קטעי וידאו באמצעות גלריית 3D. שונות - השתמש בעקיפת באג הגלריה - הצג כפתורים כדי להוסיף קבצי תמונה / וידאו (כדי לעקוף את באג גלריית 3D) לא נמצא ישום שיכול לבצע פעולה זו. גרסת APG המותקנת אינה נתמכת. diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 285f3fd3c..6fb953339 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -136,8 +136,6 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ 開封確認を要求 開封確認を要求しない 添付追加 - 添付ファイル追加 (画像) - 添付ファイル追加 (動画) ゴミ箱を空に 完全削除(Expunge) ローカルのメッセージをクリア @@ -718,13 +716,7 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ 極大 - - ギャラリ3Dを使って画像/動画を添付するには\"設定\" -> \"ギャラリのバグ回避\"をチェックしてください - - ギャラリ3Dで画像/動画を添付するには\"添付ファイル追加 (画像)\"や\"添付ファイル追加 (動画)\" を使ってください その他 - ギャラリのバグ回避 - 添付ファイルに画像/動画を追加するボタンを表示する(ギャラリ3Dバグを回避するため) この操作のためのアプリケーションが見つかりません インストールされているAPGは、サポートされていないバージョンです diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index f52cc4ef2..bc94ed13f 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -135,8 +135,6 @@ K-9 메일은 대부분의 무료 hotmail 계정을 지원하지 않으며, 다 읽음 확인을 요청함 읽음 확인을 요청하지 않음 첨부 추가 - 첨부 추가 (이미지) - 첨부 추가 (비디오) 휴지통 비우기 폐기 로컬 메시지 삭제 @@ -703,13 +701,7 @@ K-9 메일은 대부분의 무료 hotmail 계정을 지원하지 않으며, 다 중간 크게 더 크게 - - 갤러리 3D에서 이미지나 비디오를 첨부하려면 \"설정\" -> \"갤러리 버그 회피\"를 확인하십시오. - - 갤러리 3D에서 \"첨부 추가 (이미지)\" 혹은 \"첨부 추가 (비디오)\"를 통해 이미지나 비디오를 첨부할 수 있습니다. 기타 설정 - 갤러리 버그 회피 - 이미지/비디오 첨부 파일을 추가하는 버튼을 보여 줍니다 (갤러리 3D 버그를 회피할 수 있음) 이 작동에 대해 적절한 애플리케이션을 찾을 수 없습니다. 설치된 APG 버전을 지원하지 않습니다. diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 442df0259..fe2f17162 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -136,8 +136,6 @@ Praneškite apie klaidas, pridėkite naujų galimybių ir užduokite klausimus m Prašys perskaitymo patvirtinimo Neprašys perskaitymo patvirtinimo Priedo priedą - Pridėti priedą (paveikslėlis) - Pridėti priedą (Video) Išvalyti šiukšliadėžę Išvalyti Išvalyti vietinius laiškus @@ -705,13 +703,7 @@ Praneškite apie klaidas, pridėkite naujų galimybių ir užduokite klausimus m Vidutinis Didelis Didesnis - - Norėdami pridėti paveikslėlius ir video naudojant Gallery 3D, pažymėkite „Nustatymai“ -> „Naudoti galerijos klaidos apėjimą“ - - Norėdami pridėti paveikslėlius ir video naudojant Gallery 3D naudokite „Pridėti priedą (paveikslėlis)“ ar „Pridėti priedą (Video)“. Kita - Naudoti galerijos klaidos apėjimą - Rodyti mygtukus kurie prideda vaizdo/video priedus (Gallery 3D klaidos apėjimas) Šiai programai nerasta tinkamo veiksmo. Įdiegta APG versija nepalaikoma. diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 69f0795a7..d986fffa1 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -138,8 +138,6 @@ Lūdzu sūtiet kļūdu ziņojumus, iesakiet uzlabojumus un uzdodiet jautājumus Pieprasīt izlasīšanas atskaiti Neprasīt izlasīšanas atskaiti Pievienot pielikumu - Pievienot pielikumu (bildi) - Pievienot pielikumu (video) Iztukšot miskasti Izmest Izdzēst ierīcē esošās vēstules @@ -731,13 +729,7 @@ pat %d vairāk Vidējs Liels Lielāks - - Pārbaudiet \"Iestatījumi\" -> \"Izmantot galerijas kļūdu apvedceļu\", lai varētu pievienotu bildes vai video, izmantojot Gallery 3D. - - Izmantot \"Pievienot pielikumu (bildi)\" vai \"Pievienot pielikumu (video)\", lai pievienotu bildes vai videoklipus ar Gallery 3D. Dažādi - Izmantot galerijas kļūdu apvedceļu - Rādīt pogas, lai pievienotu bildi/video kā pielikumus (izmantojot Gallery 3D kļūdu apvedceļu) Šai darbībai nav atrasta atbilstoša aplikācija. Instalētā APG versija netiek atbalstīta. diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index f748e8665..b0b738b2b 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -137,8 +137,6 @@ Vennligst send feilmeldinger, forbedringer og still spørsmål hos Kommer til å be om lesekvittering Kommer ikke til å be om lesekvittering Legg til vedlegg - Legg til vedlegg (bilde) - Legg til vedlegg (video) Tøm søppeldunk Tilintetgjør Fjern lokale meldinger @@ -661,8 +659,6 @@ Vis neste melding som standard etter meldingssletting Medium Stor Større - - Diverse Ingen egnede program ble funnet for denne handlingen. diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 2e519e45e..67f743e6e 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -136,8 +136,6 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Lees rapport vragen Geen lees rapport vragen Voeg bijlage toe - Voeg bijlage toe (Afbeelding) - Voeg bijlage toe (Video) Prullenbak legen Wissen Lokale berichten wissen @@ -713,13 +711,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Gemiddeld Groot Groter - - Controleer \"Instellingen\" -> \"Use Gallery bug work-around\" to be able to attach images or videos using Gallery 3D. - - Gebruik \"Bijlage toevoegen (Afbeelding)\" of \"Bijlage toevoegen (Video)\" to attach images or videos with Gallery 3D. Diversen - Gebruik Gallery bug work-around - Laat knoppen zien om afbeelding/video bijlage toe te voegen (to work around a Gallery 3D bug) Geen geschikte applicatie gevonden voor deze aktie. De geïnstalleerde APG versie wordt niet ondersteund. diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 64586e056..8975e5f24 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -136,8 +136,6 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z Żadaj powiadomienia o przeczytaniu Nie wymagaj powiadomienia o przeczytaniu Dodaj załącznik - Dodaj załącznik (Zdjęcie) - Dodaj załącznik (Film) Opróżnij kosz Wyczyść Wyczyść wiadomości lokalne @@ -714,13 +712,7 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z Średnia Duża Wielka - - Włącz \"Obejdź błędy w Galerii\" aby móc załączać zdjęcia oraz filmy używając Galerii 3D. - - Użyj \"Dodaj załącznik (Zdjęcie)\" lub \"Dodaj załącznik (Film)\" aby je dodać używając Galerii 3D. Różne - Obejdź błędy w Galerii - Wyświetla przyciski dodawania zdjęć oraz filmów jako załączników Nie znaleiono odpowiedniej aplikacji. Zainstalowana wersja APG nie jest wspierana. diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 08089bbf8..b65f683b2 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -135,8 +135,6 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça Confirmação de leitura será requisitada Confirmação de leitura não será requisitada Incluir anexo - Incluir anexo (Imagem) - Incluir anexo (Video) Esvaziar Lixeira Expurgar Limpar mensagens locais @@ -714,13 +712,7 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça Médio Maior Grande - - Ativar em \"Configurações\" a opção \"Solução do bug da Galeria\" para poder anexar imagens ou vídeos utilizando a Galeria 3D. - - Usar \"Incluir anexo (Imagem)\" ou \"Incluir anexo (Video)\" para anexar imagens ou videos da Galeria 3D. Diversos - Solução do bug da Galeria - Mostrar botões para incluir anexos de imagem/video (para contornar problemas utilizando Gallery 3D) Nenhum aplicativo adequado para esta ação foi encontrado. A versão da APG instalada não é suportada. diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index f8331a5c9..0760d9ce1 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -137,8 +137,6 @@ K-9 Mail — почтовый клиент для Android. Запросить уведомление о прочтении Без уведомления о прочтении Вложение - Изображение - Видео Очистить корзину Стереть Стереть локальные @@ -729,13 +727,7 @@ K-9 Mail — почтовый клиент для Android. Большой Огромный Гигантский - - Включите в настройках \"Обход ошибки Галереи 3D\" для её использования - - Используйте дествия \"Изображение\" или \"Видео\" для вложения с помощью Галереи 3D Разное - Обход ошибки Галереи 3D - Показать действия вложения изображений и видео Подходящее приложение не найдено Установленная версия APG не поддерживается diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index a35590424..e7c9828e4 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -137,8 +137,6 @@ Prosím, nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte Potvrdenie o prečítaní bude vyžadované Potvrdenie o prečítaní nebude vyžadované Pridať prílohu - Pridať prílohu (obrázok) - Pridať prílohu (video) Vyprázdniť kôš Vymazať Vymazať správy @@ -729,13 +727,7 @@ Prosím, nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte Stredné Veľké Väčšie - - Skontrolujte \"Nastavenia\" -> \"Používať riešenie chyby pre Galériu\", aby ste boli schopný pripojiť obrázky alebo videá pomocou Galérie 3D. - - Použite \"Pridať prílohu (obrázok)\" alebo \"Pridať prílohu (video)\" pre pridanie obrázkov a videí pomocou Galérie 3D. Rôzne - Používať riešenie chyby pre Galériu - Zobraziť tlačidlá pre pridanie príloh (obrázky, videá) pre riešenie chyby Galérie 3D Nebola nájdená žiadna vhodná aplikácia pre túto akciu. Nainštalovaná verzia APG nie je podporovaná. diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index e037f185d..28649adde 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -136,8 +136,6 @@ Anmäl fel, hjälp till med nya funktioner och ställ frågor på Läskvitto kommer att begäras Läskvitto kommer inte att begäras Lägg till bilaga - Lägg till bilaga (bild) - Lägg till bilaga (video) Töm papperskorg Radera Rensa lokalt lagrade meddelanden @@ -719,13 +717,7 @@ Anmäl fel, hjälp till med nya funktioner och ställ frågor på Stor Större Störst - - Kontrollera \"Inställningar\" -> \"Använd work-adound för bug i Gallery\" för att kunna bifoga bilder och filmer med Gallery 3D. - - Använd \"Lägg till bilaga (Bild)\" eller \"Lägg till bilaga (Video)\" för att bifoga bilder eller video med Gallery 3D. Diverse - Använd workadound för bug i Gallery - Visa knappar för att bifoga image/video (för att komma runt en bug i Gallery 3D) Hittade ingen passande applikation för denna åtgärd. Den installerade versionen av APG stöds inte. diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index c294338c9..985f837e0 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -136,8 +136,6 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Okundu raporu istenecek Okundu raporu istenmeyecek Ekle - Ekle (Resim) - Ekle (Video) Çöpü Boşalt Çıkar Yerel mesajları temizle @@ -718,13 +716,7 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Orta Büyük Daha büyük - - \"Ayarlar\" -> \"Galeri hata çalışması kullan\" işaretleyerek 3D Galeri kullanarak resimler veya videoları ekleyin. - - \"Ek Ekle (Resim)\" veya \"Ek Ekle (Video)\" kullanarak 3D Galeri ile resimleri ve videoları ekleyin. Çeşitli - Geçici çözüm galeri hatasını kullan - Resim/Video ekleri ekleme butonlarını göster (Bir galeri 3D hatası geçici çözümüne) Bu eylem için uygun program bulunamadı. Kurulu APG versiyon desteklenmiyor. diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 641cba526..8530cd3b8 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -135,8 +135,6 @@ K-9 Mail це поштовий клієнт з відкритим вихідни Включити запит повідомлень про прочитання Вимкнути запит повідомлень про прочитання Додати вкладення - Додати вкладення (зображення) - Додати вкладення (Відео) Очистити Кошик Витерти Видалити локальні повідомлення @@ -702,13 +700,7 @@ K-9 Mail це поштовий клієнт з відкритим вихідни Середній Великий Найбільший - - Виберіть \"Налаштування\" -> \"Використовувати обхід помилок Галереї\" для вкладень зображень та відео з допомогою Gallery 3D. - - Виберіть \"Додати вкладення (зображення)\" або \"Додати вкладення (відео)\" для вкладень зображень та відео з допомогою Gallery 3D. Різне - Використовувати обхід помилок Галереї - Показувати кнопки для додавання зображень та відео вкладень (щоб обійти проблему з Gallery 3D) Відсутня програма для цієї дії. Встановлена версія APG не підтримується. diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 7642d4600..c1a82d923 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -135,8 +135,6 @@ K-9改进的功能包括: 将会请求已读回执 将不会请求已读回执 添加附件 - 添加图片附件 - 添加视频附件 清空垃圾箱 擦除 清空本地邮件 @@ -717,13 +715,7 @@ K-9改进的功能包括: 中等 更大 - - 选择“设置”->“避免画册发生错误”来启用使用3D画册模式添加附件或视频。 - - 利用“添加附件(图片)”或“添加附件(视频)”来使用3D画册添加图片或视频。 杂项 - 避免画册发生错误 - 显示按钮来添加图片/视频附件(以避免3D画册发生错误) 没有找到可以用于这一操作的程序。 不支持所安装版本的APG。 diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 6842c4c26..cc8300870 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -107,8 +107,6 @@ 要求讀取回條 取消讀取回條 新增附件 - 新增圖片附件 - 新增影片附件 清空垃圾桶 刪除 清除本地郵件 @@ -675,13 +673,7 @@ 中等 最大 - - 選擇「設定」->「避免相簿發生錯誤」來啟用3D相簿模式新增附件或影片。 - - 利用「新增附件(圖片)」或「新增附件(影片)」來使用3D相簿新增圖片或影片。 偏好設定 - 避免相簿發生錯誤 - 顯示按鈕來新增圖片/影片為附件(以避免3D相簿發生錯誤) 沒有找到可以用於此操作的程式。 尚未支援所安裝的APG版本。 diff --git a/res/values/strings.xml b/res/values/strings.xml index afa6335ce..32c764a1f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -170,8 +170,6 @@ Please submit bug reports, contribute new features and ask questions at Will request read receipt Will not request read receipt Add attachment - Add attachment (Image) - Add attachment (Video) Empty Trash Expunge Clear local messages @@ -908,15 +906,7 @@ Please submit bug reports, contribute new features and ask questions at Large Larger - - Check \"Settings\" -> \"Use Gallery bug work-around\" to be able to attach images or videos using Gallery 3D. - - - Use \"Add attachment (Image)\" or \"Add attachment (Video)\" to attach images or videos with Gallery 3D. - Miscellaneous - Use Gallery bug work-around - Show buttons to add image/video attachments (to work around a Gallery 3D bug) No suitable application for this action found. diff --git a/res/xml/changelog_master.xml b/res/xml/changelog_master.xml index 30b5c77eb..b3431139c 100644 --- a/res/xml/changelog_master.xml +++ b/res/xml/changelog_master.xml @@ -8,6 +8,21 @@ They are automatically updated with "ant bump-version". --> + + Dropped support for Android versions older than 4.0.3 + Added ability to use client certificates for authentication + Enabled support for TLSv1.1 and TLSv1.2 + Added SSL/TLS session caching + Finer grained control for notifications + Added support for delete confirmations in the message list + Added the option to show the password when setting up new accounts + Added privacy setting to omit the User-Agent header + Added privacy setting to use UTC as timezone in mail headers + Added auto configuration settings for various providers + Fixed HELO/EHLO with IPv6 address literals + Various bug fixes + Added translations: Latvian, Estonian, Norwegian Bokmål, Galician (Spain) + Added support for OpenPGP API v3 Fixed problems with IMAP login @@ -66,7 +81,6 @@ Better cleanup of old data when deleting an account Worked around a bug in KitKat that stopped settings import from working Updated German, Greek, Japanese, Korean, Lithuanian, Portugese, Russian and Slovak translations - Code cleanups diff --git a/res/xml/global_preferences.xml b/res/xml/global_preferences.xml index 5ceed2db6..f06afa116 100644 --- a/res/xml/global_preferences.xml +++ b/res/xml/global_preferences.xml @@ -348,12 +348,6 @@ android:title="@string/miscellaneous_preferences" android:key="misc_preferences"> - - mSortAscending = new HashMap(); @@ -543,7 +538,6 @@ public class K9 extends Application { editor.putInt("messageViewTheme", messageViewTheme.ordinal()); editor.putInt("messageComposeTheme", composerTheme.ordinal()); editor.putBoolean("fixedMessageViewTheme", useFixedMessageTheme); - editor.putBoolean("useGalleryBugWorkaround", useGalleryBugWorkaround); editor.putBoolean("confirmDelete", mConfirmDelete); editor.putBoolean("confirmDeleteStarred", mConfirmDeleteStarred); @@ -582,8 +576,6 @@ public class K9 extends Application { super.onCreate(); app = this; - galleryBuggy = checkForBuggyGallery(); - sIsDebuggable = ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0); checkCachedDatabaseVersion(); @@ -749,8 +741,6 @@ public class K9 extends Application { mHideUserAgent = sprefs.getBoolean("hideUserAgent", false); mHideTimeZone = sprefs.getBoolean("hideTimeZone", false); - useGalleryBugWorkaround = sprefs.getBoolean("useGalleryBugWorkaround", K9.isGalleryBuggy()); - mConfirmDelete = sprefs.getBoolean("confirmDelete", false); mConfirmDeleteStarred = sprefs.getBoolean("confirmDeleteStarred", false); mConfirmSpam = sprefs.getBoolean("confirmSpam", false); @@ -1185,18 +1175,6 @@ public class K9 extends Application { mHideSpecialAccounts = hideSpecialAccounts; } - public static boolean useGalleryBugWorkaround() { - return useGalleryBugWorkaround; - } - - public static void setUseGalleryBugWorkaround(boolean useGalleryBugWorkaround) { - K9.useGalleryBugWorkaround = useGalleryBugWorkaround; - } - - public static boolean isGalleryBuggy() { - return galleryBuggy; - } - public static boolean confirmDelete() { return mConfirmDelete; } @@ -1245,25 +1223,6 @@ public class K9 extends Application { sNotificationQuickDelete = mode; } - /** - * Check if this system contains a buggy Gallery 3D package. - * - * We have to work around the fact that those Gallery versions won't show - * any images or videos when the pick intent is used with a MIME type other - * than image/* or video/*. See issue 1186. - * - * @return true, if a buggy Gallery 3D package was found. False, otherwise. - */ - private boolean checkForBuggyGallery() { - try { - PackageInfo pi = getPackageManager().getPackageInfo("com.cooliris.media", 0); - - return (pi.versionCode == 30682); - } catch (NameNotFoundException e) { - return false; - } - } - public static boolean wrapFolderNames() { return mWrapFolderNames; } diff --git a/src/com/fsck/k9/activity/MessageCompose.java b/src/com/fsck/k9/activity/MessageCompose.java index 727f524ca..1bda6cb47 100644 --- a/src/com/fsck/k9/activity/MessageCompose.java +++ b/src/com/fsck/k9/activity/MessageCompose.java @@ -2042,18 +2042,6 @@ public class MessageCompose extends K9Activity implements OnClickListener, * Kick off a picker for whatever kind of MIME types we'll accept and let Android take over. */ private void onAddAttachment() { - if (K9.isGalleryBuggy()) { - if (K9.useGalleryBugWorkaround()) { - Toast.makeText(MessageCompose.this, - getString(R.string.message_compose_use_workaround), - Toast.LENGTH_LONG).show(); - } else { - Toast.makeText(MessageCompose.this, - getString(R.string.message_compose_buggy_gallery), - Toast.LENGTH_LONG).show(); - } - } - onAddAttachment2("*/*"); } @@ -2549,12 +2537,6 @@ public class MessageCompose extends K9Activity implements OnClickListener, case R.id.add_attachment: onAddAttachment(); break; - case R.id.add_attachment_image: - onAddAttachment2("image/*"); - break; - case R.id.add_attachment_video: - onAddAttachment2("video/*"); - break; case R.id.read_receipt: onReadReceipt(); default: @@ -2575,13 +2557,6 @@ public class MessageCompose extends K9Activity implements OnClickListener, menu.findItem(R.id.save).setEnabled(false); } - /* - * Show the menu items "Add attachment (Image)" and "Add attachment (Video)" - * if the work-around for the Gallery bug is enabled (see Issue 1186). - */ - menu.findItem(R.id.add_attachment_image).setVisible(K9.useGalleryBugWorkaround()); - menu.findItem(R.id.add_attachment_video).setVisible(K9.useGalleryBugWorkaround()); - return true; } diff --git a/src/com/fsck/k9/activity/setup/Prefs.java b/src/com/fsck/k9/activity/setup/Prefs.java index b3e0d0416..f2d574557 100644 --- a/src/com/fsck/k9/activity/setup/Prefs.java +++ b/src/com/fsck/k9/activity/setup/Prefs.java @@ -87,7 +87,6 @@ public class Prefs extends K9PreferenceActivity { private static final String PREFERENCE_AUTOFIT_WIDTH = "messageview_autofit_width"; private static final String PREFERENCE_BACKGROUND_OPS = "background_ops"; - private static final String PREFERENCE_GALLERY_BUG_WORKAROUND = "use_gallery_bug_workaround"; private static final String PREFERENCE_DEBUG_LOGGING = "debug_logging"; private static final String PREFERENCE_SENSITIVE_LOGGING = "sensitive_logging"; @@ -134,7 +133,6 @@ public class Prefs extends K9PreferenceActivity { private CheckBoxPreference mShowNext; private CheckBoxPreference mAutofitWidth; private ListPreference mBackgroundOps; - private CheckBoxPreference mUseGalleryBugWorkaround; private CheckBoxPreference mDebugLogging; private CheckBoxPreference mSensitiveLogging; private CheckBoxPreference mHideUserAgent; @@ -341,9 +339,6 @@ public class Prefs extends K9PreferenceActivity { mBackgroundOps = setupListPreference(PREFERENCE_BACKGROUND_OPS, K9.getBackgroundOps().name()); - mUseGalleryBugWorkaround = (CheckBoxPreference)findPreference(PREFERENCE_GALLERY_BUG_WORKAROUND); - mUseGalleryBugWorkaround.setChecked(K9.useGalleryBugWorkaround()); - mDebugLogging = (CheckBoxPreference)findPreference(PREFERENCE_DEBUG_LOGGING); mSensitiveLogging = (CheckBoxPreference)findPreference(PREFERENCE_SENSITIVE_LOGGING); mHideUserAgent = (CheckBoxPreference)findPreference(PREFERENCE_HIDE_USERAGENT); @@ -492,7 +487,6 @@ public class Prefs extends K9PreferenceActivity { K9.setSplitViewMode(SplitViewMode.valueOf(mSplitViewMode.getValue())); K9.setAttachmentDefaultPath(mAttachmentPathPreference.getSummary().toString()); boolean needsRefresh = K9.setBackgroundOps(mBackgroundOps.getValue()); - K9.setUseGalleryBugWorkaround(mUseGalleryBugWorkaround.isChecked()); if (!K9.DEBUG && mDebugLogging.isChecked()) { Toast.makeText(this, R.string.debug_logging_enabled, Toast.LENGTH_LONG).show(); diff --git a/src/com/fsck/k9/helper/DomainNameChecker.java b/src/com/fsck/k9/helper/DomainNameChecker.java deleted file mode 100644 index 6731de648..000000000 --- a/src/com/fsck/k9/helper/DomainNameChecker.java +++ /dev/null @@ -1,280 +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.fsck.k9.helper; - -import android.net.http.SslCertificate; -import android.util.Log; -import com.fsck.k9.K9; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.security.cert.X509Certificate; -import java.security.cert.CertificateParsingException; -import java.util.Collection; -import java.util.List; -import java.util.Locale; -import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; - -/** - * Implements basic domain-name validation as specified by RFC2818. - */ -public class DomainNameChecker { - private static Pattern QUICK_IP_PATTERN; - static { - try { - QUICK_IP_PATTERN = Pattern.compile("^[a-f0-9\\.:]+$"); - } catch (PatternSyntaxException e) { - } - } - - private static final int ALT_DNS_NAME = 2; - private static final int ALT_IPA_NAME = 7; - - /** - * Checks the site certificate against the domain name of the site being - * visited - * - * @param certificate - * The certificate to check - * @param thisDomain - * The domain name of the site being visited - * @return True iff if there is a domain match as specified by RFC2818 - */ - public static boolean match(X509Certificate certificate, String thisDomain) { - if ((certificate == null) || (thisDomain == null) - || thisDomain.isEmpty()) { - return false; - } - - thisDomain = thisDomain.toLowerCase(Locale.US); - if (!isIpAddress(thisDomain)) { - return matchDns(certificate, thisDomain); - } else { - return matchIpAddress(certificate, thisDomain); - } - } - - /** - * @return True iff the domain name is specified as an IP address - */ - private static boolean isIpAddress(String domain) { - if ((domain == null) || domain.isEmpty()) { - return false; - } - - boolean rval; - try { - // do a quick-dirty IP match first to avoid DNS lookup - rval = QUICK_IP_PATTERN.matcher(domain).matches(); - if (rval) { - rval = domain.equals(InetAddress.getByName(domain) - .getHostAddress()); - } - } catch (UnknownHostException e) { - String errorMessage = e.getMessage(); - if (errorMessage == null) { - errorMessage = "unknown host exception"; - } - - if (K9.DEBUG) { - Log.v(K9.LOG_TAG, "DomainNameChecker.isIpAddress(): " - + errorMessage); - } - - rval = false; - } - - return rval; - } - - /** - * Checks the site certificate against the IP domain name of the site being - * visited - * - * @param certificate - * The certificate to check - * @param thisDomain - * The DNS domain name of the site being visited - * @return True iff if there is a domain match as specified by RFC2818 - */ - private static boolean matchIpAddress(X509Certificate certificate, String thisDomain) { - if (K9.DEBUG) { - Log.v(K9.LOG_TAG, "DomainNameChecker.matchIpAddress(): this domain: " + thisDomain); - } - - try { - Collection> subjectAltNames = certificate.getSubjectAlternativeNames(); - if (subjectAltNames != null) { - for (List altNameEntry : subjectAltNames) { - if ((altNameEntry != null) && (2 <= altNameEntry.size())) { - Integer altNameType = (Integer)(altNameEntry.get(0)); - if (altNameType != null && altNameType.intValue() == ALT_IPA_NAME) { - String altName = (String)(altNameEntry.get(1)); - if (altName != null) { - if (K9.DEBUG) { - Log.v(K9.LOG_TAG, "alternative IP: " + altName); - } - if (thisDomain.equalsIgnoreCase(altName)) { - return true; - } - } - } - } - } - } - } catch (CertificateParsingException e) { - } - - return false; - } - - /** - * Checks the site certificate against the DNS domain name of the site being - * visited - * - * @param certificate - * The certificate to check - * @param thisDomain - * The DNS domain name of the site being visited - * @return True iff if there is a domain match as specified by RFC2818 - */ - private static boolean matchDns(X509Certificate certificate, String thisDomain) { - boolean hasDns = false; - try { - Collection> subjectAltNames = certificate.getSubjectAlternativeNames(); - if (subjectAltNames != null) { - for (List altNameEntry : subjectAltNames) { - if ((altNameEntry != null) && (2 <= altNameEntry.size())) { - Integer altNameType = (Integer)(altNameEntry.get(0)); - if (altNameType != null && altNameType.intValue() == ALT_DNS_NAME) { - hasDns = true; - String altName = (String)(altNameEntry.get(1)); - if (altName != null && matchDns(thisDomain, altName)) { - return true; - } - } - } - } - } - } catch (CertificateParsingException e) { - // one way we can get here is if an alternative name starts with - // '*' character, which is contrary to one interpretation of the - // spec (a valid DNS name must start with a letter); there is no - // good way around this, and in order to be compatible we proceed - // to check the common name (ie, ignore alternative names) - if (K9.DEBUG) { - String errorMessage = e.getMessage(); - if (errorMessage == null) { - errorMessage = "failed to parse certificate"; - } - - Log.v(K9.LOG_TAG, "DomainNameChecker.matchDns(): " - + errorMessage); - } - } - - if (!hasDns) { - SslCertificate sslCertificate = new SslCertificate(certificate); - return matchDns(thisDomain, sslCertificate.getIssuedTo().getCName()); - } - - return false; - } - - /** - * @param thisDomain - * The domain name of the site being visited - * @param thatDomain - * The domain name from the certificate - * @return True iff thisDomain matches thatDomain as specified by RFC2818 - */ - private static boolean matchDns(String thisDomain, String thatDomain) { - if (K9.DEBUG) { - Log.v(K9.LOG_TAG, "DomainNameChecker.matchDns():" - + " this domain: " + thisDomain + " that domain: " - + thatDomain); - } - - if ((thisDomain == null) || thisDomain.isEmpty() - || (thatDomain == null) || thatDomain.isEmpty()) { - return false; - } - - thatDomain = thatDomain.toLowerCase(Locale.US); - - // (a) domain name strings are equal, ignoring case: X matches X - boolean rval = thisDomain.equals(thatDomain); - if (!rval) { - String[] thisDomainTokens = thisDomain.split("\\."); - String[] thatDomainTokens = thatDomain.split("\\."); - - int thisDomainTokensNum = thisDomainTokens.length; - int thatDomainTokensNum = thatDomainTokens.length; - - // (b) OR thatHost is a '.'-suffix of thisHost: Z.Y.X matches X - if (thisDomainTokensNum >= thatDomainTokensNum) { - for (int i = thatDomainTokensNum - 1; i >= 0; --i) { - rval = thisDomainTokens[i].equals(thatDomainTokens[i]); - if (!rval) { - // (c) OR we have a special *-match: - // Z.Y.X matches *.Y.X but does not match *.X - rval = ((i == 0) && (thisDomainTokensNum == thatDomainTokensNum)); - if (rval) { - rval = thatDomainTokens[0].equals("*"); - if (!rval) { - // (d) OR we have a *-component match: - // f*.com matches foo.com but not bar.com - rval = domainTokenMatch(thisDomainTokens[0], - thatDomainTokens[0]); - } - } - - break; - } - } - } - } - - return rval; - } - - /** - * @param thisDomainToken - * The domain token from the current domain name - * @param thatDomainToken - * The domain token from the certificate - * @return True iff thisDomainToken matches thatDomainToken, using the - * wildcard match as specified by RFC2818-3.1. For example, f*.com - * must match foo.com but not bar.com - */ - private static boolean domainTokenMatch(String thisDomainToken, String thatDomainToken) { - if ((thisDomainToken != null) && (thatDomainToken != null)) { - int starIndex = thatDomainToken.indexOf('*'); - if (starIndex >= 0) { - if (thatDomainToken.length() - 1 <= thisDomainToken.length()) { - String prefix = thatDomainToken.substring(0, starIndex); - String suffix = thatDomainToken.substring(starIndex + 1); - - return thisDomainToken.startsWith(prefix) - && thisDomainToken.endsWith(suffix); - } - } - } - - return false; - } -} diff --git a/src/com/fsck/k9/mail/store/ImapStore.java b/src/com/fsck/k9/mail/store/ImapStore.java index 5f9dd1079..f2c002e05 100644 --- a/src/com/fsck/k9/mail/store/ImapStore.java +++ b/src/com/fsck/k9/mail/store/ImapStore.java @@ -96,7 +96,7 @@ import com.fsck.k9.mail.store.ImapResponseParser.ImapList; import com.fsck.k9.mail.store.ImapResponseParser.ImapResponse; import com.fsck.k9.mail.store.imap.ImapUtility; import com.fsck.k9.mail.transport.imap.ImapSettings; -import com.fsck.k9.net.ssl.SslHelper; +import com.fsck.k9.net.ssl.TrustedSocketFactory; import com.jcraft.jzlib.JZlib; import com.jcraft.jzlib.ZOutputStream; @@ -2435,7 +2435,7 @@ public class ImapStore extends Store { mSettings.getPort()); if (connectionSecurity == ConnectionSecurity.SSL_TLS_REQUIRED) { - mSocket = SslHelper.createSslSocket(mSettings.getHost(), + mSocket = TrustedSocketFactory.createSocket(mSettings.getHost(), mSettings.getPort(), mSettings.getClientCertificateAlias()); } else { mSocket = new Socket(); @@ -2485,8 +2485,8 @@ public class ImapStore extends Store { // STARTTLS executeSimpleCommand("STARTTLS"); - mSocket = SslHelper.createStartTlsSocket(mSocket, - mSettings.getHost(), mSettings.getPort(), true, + mSocket = TrustedSocketFactory.createSocket(mSocket, + mSettings.getHost(), mSettings.getPort(), mSettings.getClientCertificateAlias()); mSocket.setSoTimeout(Store.SOCKET_READ_TIMEOUT); mIn = new PeekableInputStream(new BufferedInputStream(mSocket diff --git a/src/com/fsck/k9/mail/store/Pop3Store.java b/src/com/fsck/k9/mail/store/Pop3Store.java index a66bca2ac..37c9b8efe 100644 --- a/src/com/fsck/k9/mail/store/Pop3Store.java +++ b/src/com/fsck/k9/mail/store/Pop3Store.java @@ -12,7 +12,7 @@ import com.fsck.k9.mail.*; import com.fsck.k9.mail.filter.Base64; import com.fsck.k9.mail.filter.Hex; import com.fsck.k9.mail.internet.MimeMessage; -import com.fsck.k9.net.ssl.SslHelper; +import com.fsck.k9.net.ssl.TrustedSocketFactory; import javax.net.ssl.SSLException; @@ -314,7 +314,7 @@ public class Pop3Store extends Store { try { SocketAddress socketAddress = new InetSocketAddress(mHost, mPort); if (mConnectionSecurity == ConnectionSecurity.SSL_TLS_REQUIRED) { - mSocket = SslHelper.createSslSocket(mHost, mPort, mClientCertificateAlias); + mSocket = TrustedSocketFactory.createSocket(mHost, mPort, mClientCertificateAlias); } else { mSocket = new Socket(); } @@ -336,7 +336,7 @@ public class Pop3Store extends Store { if (mCapabilities.stls) { executeSimpleCommand(STLS_COMMAND); - mSocket = SslHelper.createStartTlsSocket(mSocket, mHost, mPort, true, + mSocket = TrustedSocketFactory.createSocket(mSocket, mHost, mPort, mClientCertificateAlias); mSocket.setSoTimeout(Store.SOCKET_READ_TIMEOUT); mIn = new BufferedInputStream(mSocket.getInputStream(), 1024); diff --git a/src/com/fsck/k9/mail/transport/SmtpTransport.java b/src/com/fsck/k9/mail/transport/SmtpTransport.java index 155661e97..0b2ef25d8 100644 --- a/src/com/fsck/k9/mail/transport/SmtpTransport.java +++ b/src/com/fsck/k9/mail/transport/SmtpTransport.java @@ -15,7 +15,7 @@ import com.fsck.k9.mail.filter.PeekableInputStream; import com.fsck.k9.mail.filter.SmtpDataStuffing; import com.fsck.k9.mail.internet.MimeUtility; import com.fsck.k9.mail.store.local.LocalMessage; -import com.fsck.k9.net.ssl.SslHelper; +import com.fsck.k9.net.ssl.TrustedSocketFactory; import javax.net.ssl.SSLException; @@ -224,7 +224,7 @@ public class SmtpTransport extends Transport { try { SocketAddress socketAddress = new InetSocketAddress(addresses[i], mPort); if (mConnectionSecurity == ConnectionSecurity.SSL_TLS_REQUIRED) { - mSocket = SslHelper.createSslSocket(mHost, mPort, mClientCertificateAlias); + mSocket = TrustedSocketFactory.createSocket(mHost, mPort, mClientCertificateAlias); mSocket.connect(socketAddress, SOCKET_CONNECT_TIMEOUT); secureConnection = true; } else { @@ -278,7 +278,7 @@ public class SmtpTransport extends Transport { if (extensions.containsKey("STARTTLS")) { executeSimpleCommand("STARTTLS"); - mSocket = SslHelper.createStartTlsSocket(mSocket, mHost, mPort, true, + mSocket = TrustedSocketFactory.createSocket(mSocket, mHost, mPort, mClientCertificateAlias); mIn = new PeekableInputStream(new BufferedInputStream(mSocket.getInputStream(), diff --git a/src/com/fsck/k9/net/ssl/SslHelper.java b/src/com/fsck/k9/net/ssl/SslHelper.java deleted file mode 100644 index 38e281bf0..000000000 --- a/src/com/fsck/k9/net/ssl/SslHelper.java +++ /dev/null @@ -1,81 +0,0 @@ - -package com.fsck.k9.net.ssl; - -import java.io.IOException; -import java.net.Socket; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; - -import javax.net.ssl.KeyManager; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; - -import android.util.Log; - -import com.fsck.k9.K9; -import com.fsck.k9.mail.MessagingException; - -/** - * Helper class to create SSL sockets with support for client certificate - * authentication - */ -public class SslHelper { - - private static SSLContext createSslContext(String host, int port, String clientCertificateAlias) - throws NoSuchAlgorithmException, KeyManagementException, MessagingException { - if (K9.DEBUG) - Log.d(K9.LOG_TAG, "createSslContext: Client certificate alias: " - + clientCertificateAlias); - - KeyManager[] keyManagers; - if (clientCertificateAlias == null || clientCertificateAlias.isEmpty()) { - keyManagers = null; - } else { - keyManagers = new KeyManager[] { new KeyChainKeyManager(K9.app, clientCertificateAlias) }; - } - - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(keyManagers, - new TrustManager[] { - TrustManagerFactory.get( - host, port) - }, - new SecureRandom()); - - return sslContext; - } - - /** - * Create SSL socket - * - * @param host - * @param port - * @param clientCertificateAlias if not null, uses client certificate - * retrieved by this alias for authentication - */ - public static Socket createSslSocket(String host, int port, String clientCertificateAlias) - throws NoSuchAlgorithmException, KeyManagementException, IOException, - MessagingException { - SSLContext sslContext = createSslContext(host, port, clientCertificateAlias); - return TrustedSocketFactory.createSocket(sslContext); - } - - /** - * Create socket for START_TLS. autoClose = true - * - * @param socket - * @param host - * @param port - * @param secure - * @param clientCertificateAlias if not null, uses client certificate - * retrieved by this alias for authentication - */ - public static Socket createStartTlsSocket(Socket socket, String host, int port, boolean secure, - String clientCertificateAlias) throws NoSuchAlgorithmException, - KeyManagementException, IOException, MessagingException { - SSLContext sslContext = createSslContext(host, port, clientCertificateAlias); - boolean autoClose = true; - return TrustedSocketFactory.createSocket(sslContext, socket, host, port, autoClose); - } -} diff --git a/src/com/fsck/k9/net/ssl/SslSessionCacheHelper.java b/src/com/fsck/k9/net/ssl/SslSessionCacheHelper.java new file mode 100644 index 000000000..20439c4ff --- /dev/null +++ b/src/com/fsck/k9/net/ssl/SslSessionCacheHelper.java @@ -0,0 +1,89 @@ +package com.fsck.k9.net.ssl; + +import java.io.File; +import java.lang.reflect.Method; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSessionContext; + +import com.fsck.k9.K9; + +import android.content.Context; +import android.os.Build; +import android.util.Log; + +/** + * A class to help with associating an {@code SSLContext} with a persistent + * file-based cache of SSL sessions. + *

+ * This uses reflection to achieve its task. + *

+ * The alternative to this would be to use {@link SSLCertificateSocketFactory} + * which also provides session caching. The problem with using that occurs when + * using STARTTLS in combination with + * {@code TrustedSocketFactory.hardenSocket(SSLSocket)}. The result is that + * {@code hardenSocket()} fails to change anything because by the time it is + * applied to the socket, the SSL handshake has already been completed. (This is + * because of another feature of {@link SSLCertificateSocketFactory} whereby it + * performs host name verification which necessitates initiating the SSL + * handshake immediately on socket creation.) + *

+ * If eventually the use of hardenSocket() should become unnecessary, then + * switching to using {@link SSLCertificateSocketFactory} would be a better + * solution. + */ +public class SslSessionCacheHelper { + private static Object sSessionCache; + private static Method sSetPersistentCacheMethod; + private static boolean sIsDisabled = false; + + static { + final String packageName; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + packageName = "org.apache.harmony.xnet.provider.jsse"; + } else { + packageName = "com.android.org.conscrypt"; + } + final File cacheDirectory = K9.app.getDir("sslcache", Context.MODE_PRIVATE); + try { + Class fileClientSessionCacheClass = Class.forName(packageName + + ".FileClientSessionCache"); + Method usingDirectoryMethod = fileClientSessionCacheClass + .getMethod("usingDirectory", File.class); + sSessionCache = usingDirectoryMethod.invoke(null, cacheDirectory); + + Class sslClientSessionCacheClass = Class.forName(packageName + + ".SSLClientSessionCache"); + Class clientSessionContextClass = Class.forName(packageName + + ".ClientSessionContext"); + sSetPersistentCacheMethod = clientSessionContextClass.getMethod( + "setPersistentCache", sslClientSessionCacheClass); + } catch (Exception e) { + // Something went wrong. Proceed without a session cache. + Log.e(K9.LOG_TAG, "Failed to initialize SslSessionCacheHelper: " + e); + sIsDisabled = true; + } + } + + /** + * Associate an {@code SSLContext} with a persistent file-based cache of SSL + * sessions which can be used when re-establishing a connection to the same + * server. + *

+ * This is beneficial because it can eliminate redundant cryptographic + * computations and network traffic, thus saving time and conserving power. + */ + public static void setPersistentCache(SSLContext sslContext) { + if (sIsDisabled) { + return; + } + try { + SSLSessionContext sessionContext = sslContext.getClientSessionContext(); + sSetPersistentCacheMethod.invoke(sessionContext, sSessionCache); + } catch (Exception e) { + // Something went wrong. Proceed without a session cache. + Log.e(K9.LOG_TAG, "Failed to initialize persistent SSL cache: " + e); + sIsDisabled = true; + } + } +} diff --git a/src/com/fsck/k9/net/ssl/TrustManagerFactory.java b/src/com/fsck/k9/net/ssl/TrustManagerFactory.java index 27b2c70bb..4a2c7206a 100644 --- a/src/com/fsck/k9/net/ssl/TrustManagerFactory.java +++ b/src/com/fsck/k9/net/ssl/TrustManagerFactory.java @@ -3,12 +3,15 @@ package com.fsck.k9.net.ssl; import android.util.Log; -import com.fsck.k9.helper.DomainNameChecker; import com.fsck.k9.mail.CertificateChainException; import com.fsck.k9.security.LocalKeyStore; +import javax.net.ssl.SSLException; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; + +import org.apache.http.conn.ssl.StrictHostnameVerifier; + import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -58,31 +61,25 @@ public final class TrustManagerFactory { public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { String message = null; - boolean foundInGlobalKeyStore = false; + X509Certificate certificate = chain[0]; + try { defaultTrustManager.checkServerTrusted(chain, authType); - foundInGlobalKeyStore = true; + new StrictHostnameVerifier().verify(mHost, certificate); + return; } catch (CertificateException e) { + // cert. chain can't be validated + message = e.getMessage(); + } catch (SSLException e) { + // host name doesn't match certificate message = e.getMessage(); } - X509Certificate certificate = chain[0]; - // Check the local key store if we couldn't verify the certificate using the global // key store or if the host name doesn't match the certificate name - if (foundInGlobalKeyStore - && DomainNameChecker.match(certificate, mHost) - || keyStore.isValidCertificate(certificate, mHost, mPort)) { - return; + if (!keyStore.isValidCertificate(certificate, mHost, mPort)) { + throw new CertificateChainException(message, chain); } - - if (message == null) { - message = (foundInGlobalKeyStore) ? - "Certificate domain name does not match " + mHost : - "Couldn't find certificate in local key store"; - } - - throw new CertificateChainException(message, chain); } public X509Certificate[] getAcceptedIssuers() { diff --git a/src/com/fsck/k9/net/ssl/TrustedSocketFactory.java b/src/com/fsck/k9/net/ssl/TrustedSocketFactory.java index 030bf4910..a4949fa17 100644 --- a/src/com/fsck/k9/net/ssl/TrustedSocketFactory.java +++ b/src/com/fsck/k9/net/ssl/TrustedSocketFactory.java @@ -3,14 +3,21 @@ package com.fsck.k9.net.ssl; import android.util.Log; import com.fsck.k9.K9; +import com.fsck.k9.mail.MessagingException; +import javax.net.ssl.KeyManager; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + import java.io.IOException; import java.net.Socket; -import java.security.SecureRandom; -import java.util.*; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** @@ -67,15 +74,21 @@ public class TrustedSocketFactory { static { String[] enabledCiphers = null; - String[] enabledProtocols = null; + String[] supportedProtocols = null; try { SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(null, null, new SecureRandom()); + sslContext.init(null, null, null); SSLSocketFactory sf = sslContext.getSocketFactory(); SSLSocket sock = (SSLSocket) sf.createSocket(); enabledCiphers = sock.getEnabledCipherSuites(); - enabledProtocols = sock.getEnabledProtocols(); + + /* + * Retrieve all supported protocols, not just the (default) enabled + * ones. TLSv1.1 & TLSv1.2 are supported on API levels 16+, but are + * only enabled by default on API levels 20+. + */ + supportedProtocols = sock.getSupportedProtocols(); } catch (Exception e) { Log.e(K9.LOG_TAG, "Error getting information about available SSL/TLS ciphers and " + "protocols", e); @@ -84,8 +97,8 @@ public class TrustedSocketFactory { ENABLED_CIPHERS = (enabledCiphers == null) ? null : reorder(enabledCiphers, ORDERED_KNOWN_CIPHERS, BLACKLISTED_CIPHERS); - ENABLED_PROTOCOLS = (enabledProtocols == null) ? null : - reorder(enabledProtocols, ORDERED_KNOWN_PROTOCOLS, null); + ENABLED_PROTOCOLS = (supportedProtocols == null) ? null : + reorder(supportedProtocols, ORDERED_KNOWN_PROTOCOLS, null); } protected static String[] reorder(String[] enabled, String[] known, String[] blacklisted) { @@ -114,19 +127,33 @@ public class TrustedSocketFactory { return result.toArray(new String[result.size()]); } - public static Socket createSocket(SSLContext sslContext) throws IOException { - SSLSocket socket = (SSLSocket) sslContext.getSocketFactory().createSocket(); - hardenSocket(socket); + public static Socket createSocket(String host, int port, String clientCertificateAlias) + throws IOException, MessagingException, KeyManagementException, NoSuchAlgorithmException { - return socket; + return createSocket(null, host, port, clientCertificateAlias); } - public static Socket createSocket(SSLContext sslContext, Socket s, String host, int port, - boolean autoClose) throws IOException { - SSLSocket socket = (SSLSocket) sslContext.getSocketFactory().createSocket(s, host, port, autoClose); - hardenSocket(socket); + public static Socket createSocket(Socket socket, String host, int port, String clientCertificateAlias) + throws NoSuchAlgorithmException, KeyManagementException, MessagingException, IOException { - return socket; + TrustManager[] trustManagers = new TrustManager[] { TrustManagerFactory.get(host, port) }; + KeyManager[] keyManagers = null; + if (clientCertificateAlias != null && !clientCertificateAlias.isEmpty()) { + keyManagers = new KeyManager[] { new KeyChainKeyManager(K9.app, clientCertificateAlias) }; + } + + SSLContext context = SSLContext.getInstance("TLS"); + context.init(keyManagers, trustManagers, null); + SslSessionCacheHelper.setPersistentCache(context); + SSLSocketFactory socketFactory = context.getSocketFactory(); + Socket trustedSocket; + if (socket == null) { + trustedSocket = socketFactory.createSocket(); + } else { + trustedSocket = socketFactory.createSocket(socket, host, port, true); + } + hardenSocket((SSLSocket) trustedSocket); + return trustedSocket; } private static void hardenSocket(SSLSocket sock) { diff --git a/src/com/fsck/k9/preferences/GlobalSettings.java b/src/com/fsck/k9/preferences/GlobalSettings.java index be13bbe01..38d134a8f 100644 --- a/src/com/fsck/k9/preferences/GlobalSettings.java +++ b/src/com/fsck/k9/preferences/GlobalSettings.java @@ -188,9 +188,6 @@ public class GlobalSettings { new V(16, new ThemeSetting(K9.Theme.LIGHT)), new V(24, new SubThemeSetting(K9.Theme.USE_GLOBAL)) )); - s.put("useGalleryBugWorkaround", Settings.versions( - new V(1, new GalleryBugWorkaroundSetting()) - )); s.put("useVolumeKeysForListNavigation", Settings.versions( new V(1, new BooleanSetting(false)) )); @@ -372,27 +369,6 @@ public class GlobalSettings { } } - /** - * The gallery bug work-around setting. - * - *

- * The default value varies depending on whether you have a version of Gallery 3D installed - * that contains the bug we work around. - *

- * - * @see K9#isGalleryBuggy() - */ - public static class GalleryBugWorkaroundSetting extends BooleanSetting { - public GalleryBugWorkaroundSetting() { - super(false); - } - - @Override - public Object getDefaultValue() { - return K9.isGalleryBuggy(); - } - } - /** * The language setting. * diff --git a/src/com/fsck/k9/preferences/Settings.java b/src/com/fsck/k9/preferences/Settings.java index 694730673..1d06b7fd2 100644 --- a/src/com/fsck/k9/preferences/Settings.java +++ b/src/com/fsck/k9/preferences/Settings.java @@ -35,7 +35,7 @@ public class Settings { * * @see SettingsExporter */ - public static final int VERSION = 34; + public static final int VERSION = 35; public static Map validate(int version, Map> settings, diff --git a/src/com/fsck/k9/view/ColorChip.java b/src/com/fsck/k9/view/ColorChip.java index 3dcbeddc7..a20b8ff50 100644 --- a/src/com/fsck/k9/view/ColorChip.java +++ b/src/com/fsck/k9/view/ColorChip.java @@ -1,92 +1,76 @@ package com.fsck.k9.view; + import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.PathShape; + public class ColorChip { public static final Path CIRCULAR = new Path(); public static final Path LEFT_POINTING = new Path(); public static final Path RIGHT_POINTING = new Path(); public static final Path RIGHT_NOTCH = new Path(); public static final Path STAR = new Path(); - public static final Path CHECKMARK = new Path(); - static { - - CIRCULAR.addCircle(160,160,70f,Path.Direction.CW); + CIRCULAR.addCircle(160, 160, 70f, Path.Direction.CW); CIRCULAR.close(); - RIGHT_POINTING.addArc(new RectF(80f,80f,240f,240f) , 90, 180); - RIGHT_POINTING.arcTo(new RectF(160f,0f,320f,160f), 180, -90); - RIGHT_POINTING.arcTo(new RectF(160f,160f,320f,320f), 270,-90); + RIGHT_POINTING.addArc(new RectF(80f, 80f, 240f, 240f), 90, 180); + RIGHT_POINTING.arcTo(new RectF(160f, 0f, 320f, 160f), 180, -90); + RIGHT_POINTING.arcTo(new RectF(160f, 160f, 320f, 320f), 270, -90); RIGHT_POINTING.close(); - RIGHT_NOTCH.addArc(new RectF(80f,80f,240f,240f) , 90, 180); - RIGHT_NOTCH.arcTo(new RectF(160f,0f,320f,160f), 180, -90); - RIGHT_NOTCH.arcTo(new RectF(160f,160f,320f,320f), 270,-90); + RIGHT_NOTCH.addArc(new RectF(80f, 80f, 240f, 240f), 90, 180); + RIGHT_NOTCH.arcTo(new RectF(160f, 0f, 320f, 160f), 180, -90); + RIGHT_NOTCH.arcTo(new RectF(160f, 160f, 320f, 320f), 270, -90); RIGHT_NOTCH.close(); - LEFT_POINTING.addArc(new RectF(80f,80f,240f,240f) , 90, -180); - LEFT_POINTING.arcTo(new RectF(00f,00f,160f,160f), 0, 90); - LEFT_POINTING.arcTo(new RectF(00f,160f,160f,320f), 270,90); + LEFT_POINTING.addArc(new RectF(80f, 80f, 240f, 240f), 90, -180); + LEFT_POINTING.arcTo(new RectF(00f, 00f, 160f, 160f), 0, 90); + LEFT_POINTING.arcTo(new RectF(00f, 160f, 160f, 320f), 270, 90); LEFT_POINTING.close(); - STAR.moveTo(140f,60f); - STAR.lineTo(170f,110f); - STAR.lineTo(220f,120f); - STAR.lineTo(180f,160f); - STAR.lineTo(200f,220f); - STAR.lineTo(140f,190f); - STAR.lineTo(80f,220f); - STAR.lineTo(100f,160f); - STAR.lineTo(60f,120f); - STAR.lineTo(110f,110f); - STAR.lineTo(140f,60f); + STAR.moveTo(140f, 60f); + STAR.lineTo(170f, 110f); + STAR.lineTo(220f, 120f); + STAR.lineTo(180f, 160f); + STAR.lineTo(200f, 220f); + STAR.lineTo(140f, 190f); + STAR.lineTo(80f, 220f); + STAR.lineTo(100f, 160f); + STAR.lineTo(60f, 120f); + STAR.lineTo(110f, 110f); + STAR.lineTo(140f, 60f); STAR.close(); - - - CHECKMARK.moveTo(10f,160f); - CHECKMARK.lineTo(120f,280f); - CHECKMARK.lineTo(300f,40f); - } + private ShapeDrawable mDrawable; - public ColorChip(int color, boolean messageRead, Path shape) { - if (shape.equals(STAR)) { mDrawable = new ShapeDrawable(new PathShape(shape, 280f, 280f)); - } else { mDrawable = new ShapeDrawable(new PathShape(shape, 320f, 320f)); } - if (shape.equals(CHECKMARK)) { - mDrawable.getPaint().setStrokeWidth(50); - } else { - mDrawable.getPaint().setStrokeWidth(20); - } + if (messageRead) { // Read messages get an outlined circle mDrawable.getPaint().setStyle(Paint.Style.STROKE); } else { // Unread messages get filled, while retaining the outline, so that they stay the same size mDrawable.getPaint().setStyle(Paint.Style.FILL_AND_STROKE); - } + + mDrawable.getPaint().setStrokeWidth(20); mDrawable.getPaint().setColor(color); - - } public ShapeDrawable drawable() { return mDrawable; } - - }