diff --git a/app/autodiscovery/providersxml/build.gradle b/app/autodiscovery/providersxml/build.gradle index 1ec0a36c0bdb26e4f5f1e9e2d71d129fd27b5ca1..a82e1b4f1413662e9dac9c74eb31358ea0d187c9 100644 --- a/app/autodiscovery/providersxml/build.gradle +++ b/app/autodiscovery/providersxml/build.gradle @@ -21,6 +21,8 @@ dependencies { } android { + namespace 'com.fsck.k9.autodiscovery.providersxml' + compileSdkVersion buildConfig.compileSdk buildToolsVersion buildConfig.buildTools diff --git a/app/autodiscovery/providersxml/src/main/AndroidManifest.xml b/app/autodiscovery/providersxml/src/main/AndroidManifest.xml deleted file mode 100644 index d2b51100218d83e749a050bff75be4f385ce1467..0000000000000000000000000000000000000000 --- a/app/autodiscovery/providersxml/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/app/core/build.gradle b/app/core/build.gradle index 4434a06286788e36d83cae03d083a3a3ef11760f..1455ae732528e9d02de0378678ed77056884d45a 100644 --- a/app/core/build.gradle +++ b/app/core/build.gradle @@ -41,6 +41,8 @@ dependencies { } android { + namespace 'com.fsck.k9.core' + compileSdkVersion buildConfig.compileSdk buildToolsVersion buildConfig.buildTools diff --git a/app/core/src/main/AndroidManifest.xml b/app/core/src/main/AndroidManifest.xml index dca0147e8479133a5bf48a146db018e513b7eed9..60d884212fc0cd136a6f6cd70900138bc0dcc74f 100644 --- a/app/core/src/main/AndroidManifest.xml +++ b/app/core/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> diff --git a/app/core/src/main/java/com/fsck/k9/K9.kt b/app/core/src/main/java/com/fsck/k9/K9.kt index b0abc49e9a79211026b1a941703733da9333127d..af9c8e7a28a35ee290f7fb29074499893a5c651e 100644 --- a/app/core/src/main/java/com/fsck/k9/K9.kt +++ b/app/core/src/main/java/com/fsck/k9/K9.kt @@ -201,9 +201,6 @@ object K9 : EarlyInit { @JvmStatic var isUseVolumeKeysForNavigation = false - @JvmStatic - var isUseVolumeKeysForListNavigation = false - @JvmStatic var isShowUnifiedInbox = true @@ -314,7 +311,6 @@ object K9 : EarlyInit { isSensitiveDebugLoggingEnabled = storage.getBoolean("enableSensitiveLogging", false) isShowAnimations = storage.getBoolean("animations", true) isUseVolumeKeysForNavigation = storage.getBoolean("useVolumeKeysForNavigation", false) - isUseVolumeKeysForListNavigation = storage.getBoolean("useVolumeKeysForListNavigation", false) isShowUnifiedInbox = storage.getBoolean("showUnifiedInbox", true) isShowStarredCount = storage.getBoolean("showStarredCount", false) isMessageListSenderAboveSubject = storage.getBoolean("messageListSenderAboveSubject", true) @@ -394,7 +390,6 @@ object K9 : EarlyInit { editor.putEnum("backgroundOperations", backgroundOps) editor.putBoolean("animations", isShowAnimations) editor.putBoolean("useVolumeKeysForNavigation", isUseVolumeKeysForNavigation) - editor.putBoolean("useVolumeKeysForListNavigation", isUseVolumeKeysForListNavigation) editor.putBoolean("autofitWidth", isAutoFitWidth) editor.putBoolean("quietTimeEnabled", isQuietTimeEnabled) editor.putBoolean("isSentSoundEnabled", isSentSoundEnabled) diff --git a/app/core/src/main/java/com/fsck/k9/controller/MessagingController.java b/app/core/src/main/java/com/fsck/k9/controller/MessagingController.java index ada0509098134b03910670248bf42f595c02e09f..4d56037172418a8f4a09353f2f3119307f9bfcc6 100644 --- a/app/core/src/main/java/com/fsck/k9/controller/MessagingController.java +++ b/app/core/src/main/java/com/fsck/k9/controller/MessagingController.java @@ -37,7 +37,6 @@ import com.fsck.k9.K9; import com.fsck.k9.Preferences; import com.fsck.k9.backend.BackendManager; import com.fsck.k9.backend.api.Backend; -import com.fsck.k9.backend.api.BuildConfig; import com.fsck.k9.backend.api.SyncConfig; import com.fsck.k9.backend.api.SyncListener; import com.fsck.k9.controller.ControllerExtension.ControllerInternals; @@ -52,6 +51,7 @@ import com.fsck.k9.controller.MessagingControllerCommands.PendingMoveOrCopy; import com.fsck.k9.controller.MessagingControllerCommands.PendingReplace; import com.fsck.k9.controller.MessagingControllerCommands.PendingSetFlag; import com.fsck.k9.controller.ProgressBodyFactory.ProgressListener; +import com.fsck.k9.core.BuildConfig; import com.fsck.k9.helper.MutableBoolean; import com.fsck.k9.mail.AuthType; import com.fsck.k9.mail.AuthenticationFailedException; diff --git a/app/core/src/main/java/com/fsck/k9/mailstore/NotifierMessageStore.kt b/app/core/src/main/java/com/fsck/k9/mailstore/NotifierMessageStore.kt index 488dbbffd3662c65d5756832a5a64f9fd160cc09..0a63f3076a540f42f9efbfc8f0f89fe34c6fc5e6 100644 --- a/app/core/src/main/java/com/fsck/k9/mailstore/NotifierMessageStore.kt +++ b/app/core/src/main/java/com/fsck/k9/mailstore/NotifierMessageStore.kt @@ -58,6 +58,11 @@ class NotifierMessageStore( notifyChange() } + override fun setMoreMessages(folderId: Long, moreMessages: MoreMessages) { + messageStore.setMoreMessages(folderId, moreMessages) + notifyChange() + } + private fun notifyChange() { localStore.notifyChange() } diff --git a/app/core/src/main/java/com/fsck/k9/preferences/GeneralSettingsDescriptions.java b/app/core/src/main/java/com/fsck/k9/preferences/GeneralSettingsDescriptions.java index 34efb299a6663de90f21533e706860e2c7ba3407..2458bf7800227ec7d3cd9fc887df22dce2f0eaaf 100644 --- a/app/core/src/main/java/com/fsck/k9/preferences/GeneralSettingsDescriptions.java +++ b/app/core/src/main/java/com/fsck/k9/preferences/GeneralSettingsDescriptions.java @@ -184,9 +184,6 @@ public class GeneralSettingsDescriptions { new V(16, new LegacyThemeSetting(AppTheme.LIGHT)), new V(24, new SubThemeSetting(SubTheme.USE_GLOBAL)) )); - s.put("useVolumeKeysForListNavigation", Settings.versions( - new V(1, new BooleanSetting(false)) - )); s.put("useVolumeKeysForNavigation", Settings.versions( new V(1, new BooleanSetting(false)) )); diff --git a/app/core/src/main/java/com/fsck/k9/preferences/Settings.java b/app/core/src/main/java/com/fsck/k9/preferences/Settings.java index db1674f7c4abd4bdc6e0dd336f3b9fa33ed21a73..a82e888a7b22bf14bc31a50b184bd50efd0fdc08 100644 --- a/app/core/src/main/java/com/fsck/k9/preferences/Settings.java +++ b/app/core/src/main/java/com/fsck/k9/preferences/Settings.java @@ -36,7 +36,7 @@ public class Settings { * * @see SettingsExporter */ - public static final int VERSION = 81; + public static final int VERSION = 82; static Map validate(int version, Map> settings, Map importedSettings, boolean useDefaultValues) { diff --git a/app/core/src/main/res/values/arrays_general_settings_values.xml b/app/core/src/main/res/values/arrays_general_settings_values.xml index 692227334947aea1968ae80438c8408b7b89479b..b5b0f49f67a8e32e5e1775010113f62724f54a21 100644 --- a/app/core/src/main/res/values/arrays_general_settings_values.xml +++ b/app/core/src/main/res/values/arrays_general_settings_values.xml @@ -210,9 +210,4 @@ spam - - message - list - - diff --git a/app/crypto-openpgp/build.gradle b/app/crypto-openpgp/build.gradle index 1aa5537b542f2e0921263db034629278a9315217..31a1df211e46e0427317f29e84d49573e4e38120 100644 --- a/app/crypto-openpgp/build.gradle +++ b/app/crypto-openpgp/build.gradle @@ -9,6 +9,8 @@ dependencies { } android { + namespace 'com.fsck.k9.crypto.openpgp' + compileSdkVersion buildConfig.compileSdk buildToolsVersion buildConfig.buildTools diff --git a/app/crypto-openpgp/src/main/AndroidManifest.xml b/app/crypto-openpgp/src/main/AndroidManifest.xml deleted file mode 100644 index 2cdc574d9199e67446f5b4b3828c061d4c754aa5..0000000000000000000000000000000000000000 --- a/app/crypto-openpgp/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/app/k9mail-jmap/src/main/res/values/themes.xml b/app/k9mail-jmap/src/main/res/values/themes.xml index d76fd70e84aeee148121f989bb3faa8594677425..8be56e875581657cfc3379c9eed99c0f948d1ae4 100644 --- a/app/k9mail-jmap/src/main/res/values/themes.xml +++ b/app/k9mail-jmap/src/main/res/values/themes.xml @@ -78,6 +78,7 @@ @android:color/primary_text_light @android:color/secondary_text_light #8038B8E2 + ?android:attr/windowBackground #c0cdcdcd #DCDCDC ?android:attr/colorBackground @@ -197,6 +198,7 @@ @android:color/primary_text_dark @android:color/secondary_text_dark #8038B8E2 + ?android:attr/windowBackground #00000000 #2F2F2F ?android:attr/colorBackground diff --git a/app/k9mail/build.gradle b/app/k9mail/build.gradle index ce28af792bea39db00662d3b1f6099cf8a7194d3..dd0bf54db17b3267dcc8f1fc27bfd0ebb9d1f95e 100644 --- a/app/k9mail/build.gradle +++ b/app/k9mail/build.gradle @@ -42,6 +42,8 @@ dependencies { } android { + namespace 'com.fsck.k9' + compileSdkVersion buildConfig.compileSdk buildToolsVersion buildConfig.buildTools @@ -49,8 +51,8 @@ android { applicationId "foundation.e.mail" testApplicationId "foundation.e.mail.tests" - versionCode 33005 - versionName '6.305' + versionCode 33007 + versionName '6.307' // Keep in sync with the resource string array 'supported_languages' resConfigs "in", "br", "ca", "cs", "cy", "da", "de", "et", "en", "en_GB", "es", "eo", "eu", "fr", "gd", "gl", diff --git a/app/k9mail/src/main/AndroidManifest.xml b/app/k9mail/src/main/AndroidManifest.xml index 4eb82940e31c2f24aef17b58e2eba1714975efaa..5ab09c4ff1a6ed827933c070468ccf08b3659d95 100644 --- a/app/k9mail/src/main/AndroidManifest.xml +++ b/app/k9mail/src/main/AndroidManifest.xml @@ -2,8 +2,7 @@ + android:installLocation="auto"> - unreadFolder.summary = getString(R.string.unread_widget_folder_summary) + unreadFolder.summary = getString(UiR.string.unread_widget_folder_summary) selectedFolderId = null selectedFolderDisplayName = null true @@ -116,7 +117,7 @@ class UnreadWidgetConfigurationFragment : PreferenceFragmentCompat() { selectedAccountUuid = accountUuid selectedFolderId = null selectedFolderDisplayName = null - unreadFolder.summary = getString(R.string.unread_widget_folder_summary) + unreadFolder.summary = getString(UiR.string.unread_widget_folder_summary) if (SearchAccount.UNIFIED_INBOX == selectedAccountUuid) { handleSearchAccount() } else { @@ -126,7 +127,7 @@ class UnreadWidgetConfigurationFragment : PreferenceFragmentCompat() { private fun handleSearchAccount() { if (SearchAccount.UNIFIED_INBOX == selectedAccountUuid) { - unreadAccount.setSummary(R.string.unread_widget_unified_inbox_account_summary) + unreadAccount.setSummary(UiR.string.unread_widget_unified_inbox_account_summary) } unreadFolderEnabled.isEnabled = false unreadFolderEnabled.isChecked = false @@ -168,10 +169,10 @@ class UnreadWidgetConfigurationFragment : PreferenceFragmentCompat() { private fun validateWidget(): Boolean { if (selectedAccountUuid == null) { - Toast.makeText(requireContext(), R.string.unread_widget_account_not_selected, Toast.LENGTH_LONG).show() + Toast.makeText(requireContext(), UiR.string.unread_widget_account_not_selected, Toast.LENGTH_LONG).show() return false } else if (unreadFolderEnabled.isChecked && selectedFolderId == null) { - Toast.makeText(requireContext(), R.string.unread_widget_folder_not_selected, Toast.LENGTH_LONG).show() + Toast.makeText(requireContext(), UiR.string.unread_widget_folder_not_selected, Toast.LENGTH_LONG).show() return false } return true diff --git a/app/k9mail/src/main/java/com/fsck/k9/widget/unread/UnreadWidgetDataProvider.kt b/app/k9mail/src/main/java/com/fsck/k9/widget/unread/UnreadWidgetDataProvider.kt index 4766a43beb6811992ec43932f92b287cf2a91758..78df3d9cf5ca153bea241eb9265f62ea341eadf6 100644 --- a/app/k9mail/src/main/java/com/fsck/k9/widget/unread/UnreadWidgetDataProvider.kt +++ b/app/k9mail/src/main/java/com/fsck/k9/widget/unread/UnreadWidgetDataProvider.kt @@ -4,7 +4,6 @@ import android.content.Context import android.content.Intent import com.fsck.k9.Account import com.fsck.k9.Preferences -import com.fsck.k9.R import com.fsck.k9.activity.MessageList import com.fsck.k9.controller.MessagingController import com.fsck.k9.mailstore.FolderRepository @@ -13,6 +12,7 @@ import com.fsck.k9.search.SearchAccount import com.fsck.k9.ui.folders.FolderNameFormatterFactory import com.fsck.k9.ui.messagelist.DefaultFolderProvider import timber.log.Timber +import com.fsck.k9.ui.R as UiR class UnreadWidgetDataProvider( private val context: Context, @@ -68,7 +68,7 @@ class UnreadWidgetDataProvider( val accountName = account.displayName val folderDisplayName = getFolderDisplayName(account, folderId) - val title = context.getString(R.string.unread_widget_title, accountName, folderDisplayName) + val title = context.getString(UiR.string.unread_widget_title, accountName, folderDisplayName) val unreadCount = messagingController.getFolderUnreadMessageCount(account, folderId) diff --git a/app/storage/build.gradle b/app/storage/build.gradle index d4db393c3e066bd3b4166ecbcc57fc32b078171a..376e9e7f237c315e703baed20a61b74bc87d464c 100644 --- a/app/storage/build.gradle +++ b/app/storage/build.gradle @@ -24,6 +24,8 @@ dependencies { } android { + namespace 'com.fsck.k9.storage' + compileSdkVersion buildConfig.compileSdk buildToolsVersion buildConfig.buildTools diff --git a/app/storage/src/main/AndroidManifest.xml b/app/storage/src/main/AndroidManifest.xml deleted file mode 100644 index 00842773477ab4c96cba32e94db664247939d60e..0000000000000000000000000000000000000000 --- a/app/storage/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/app/storage/src/main/java/com/fsck/k9/storage/messages/CopyMessageOperations.kt b/app/storage/src/main/java/com/fsck/k9/storage/messages/CopyMessageOperations.kt index 9e6d2a4beb9aa7d32eb99c9e00fd0dfcc27f00b9..71afa9ae6124adb656e3b0ff74169036fca9ea30 100644 --- a/app/storage/src/main/java/com/fsck/k9/storage/messages/CopyMessageOperations.kt +++ b/app/storage/src/main/java/com/fsck/k9/storage/messages/CopyMessageOperations.kt @@ -70,30 +70,30 @@ internal class CopyMessageOperations( private fun copyMessageParts(database: SQLiteDatabase, messageId: Long): Long { return database.rawQuery( """ - SELECT - message_parts.id, - message_parts.type, - message_parts.root, - message_parts.parent, - message_parts.seq, - message_parts.mime_type, - message_parts.decoded_body_size, - message_parts.display_name, - message_parts.header, - message_parts.encoding, - message_parts.charset, - message_parts.data_location, - message_parts.data, - message_parts.preamble, - message_parts.epilogue, - message_parts.boundary, - message_parts.content_id, - message_parts.server_extra - FROM messages - JOIN message_parts ON (message_parts.root = messages.message_part_id) - WHERE messages.id = ? - ORDER BY message_parts.seq - """.trimIndent(), +SELECT + message_parts.id, + message_parts.type, + message_parts.root, + message_parts.parent, + message_parts.seq, + message_parts.mime_type, + message_parts.decoded_body_size, + message_parts.display_name, + message_parts.header, + message_parts.encoding, + message_parts.charset, + message_parts.data_location, + message_parts.data, + message_parts.preamble, + message_parts.epilogue, + message_parts.boundary, + message_parts.content_id, + message_parts.server_extra +FROM messages +JOIN message_parts ON (message_parts.root = messages.message_part_id) +WHERE messages.id = ? +ORDER BY message_parts.seq + """, arrayOf(messageId.toString()) ).use { cursor -> if (!cursor.moveToNext()) error("No message part found for message with ID $messageId") @@ -201,10 +201,8 @@ internal class CopyMessageOperations( private fun copyFulltextEntry(database: SQLiteDatabase, newMessageId: Long, messageId: Long) { database.execSQL( - """ - INSERT OR REPLACE INTO messages_fulltext (docid, fulltext) - SELECT ?, fulltext FROM messages_fulltext WHERE docid = ? - """.trimIndent(), + "INSERT OR REPLACE INTO messages_fulltext (docid, fulltext) " + + "SELECT ?, fulltext FROM messages_fulltext WHERE docid = ?", arrayOf(newMessageId.toString(), messageId.toString()) ) } diff --git a/app/storage/src/main/java/com/fsck/k9/storage/messages/DeleteFolderOperations.kt b/app/storage/src/main/java/com/fsck/k9/storage/messages/DeleteFolderOperations.kt index 3578f9cf9755920322ce1eb103f943c2c5b8881e..c05c27fc3eb1431731059edf65fa0695bcb6ab91 100644 --- a/app/storage/src/main/java/com/fsck/k9/storage/messages/DeleteFolderOperations.kt +++ b/app/storage/src/main/java/com/fsck/k9/storage/messages/DeleteFolderOperations.kt @@ -19,16 +19,16 @@ internal class DeleteFolderOperations( private fun SQLiteDatabase.deleteMessagePartFiles(folderServerId: String) { rawQuery( """ - SELECT message_parts.id - FROM folders - JOIN messages ON (messages.folder_id = folders.id) - JOIN message_parts ON ( - message_parts.root = messages.message_part_id - AND - message_parts.data_location = $DATA_LOCATION_ON_DISK - ) - WHERE folders.server_id = ? - """.trimIndent(), +SELECT message_parts.id +FROM folders +JOIN messages ON (messages.folder_id = folders.id) +JOIN message_parts ON ( + message_parts.root = messages.message_part_id + AND + message_parts.data_location = $DATA_LOCATION_ON_DISK +) +WHERE folders.server_id = ? + """, arrayOf(folderServerId) ).use { cursor -> while (cursor.moveToNext()) { diff --git a/app/storage/src/main/java/com/fsck/k9/storage/messages/DeleteMessageOperations.kt b/app/storage/src/main/java/com/fsck/k9/storage/messages/DeleteMessageOperations.kt index d015ae399c392f68188447628407953470f03923..d39150e9925382ea9875ac99ed3791b21ecaf894 100644 --- a/app/storage/src/main/java/com/fsck/k9/storage/messages/DeleteMessageOperations.kt +++ b/app/storage/src/main/java/com/fsck/k9/storage/messages/DeleteMessageOperations.kt @@ -38,12 +38,12 @@ internal class DeleteMessageOperations( return lockableDatabase.execute(false) { database -> database.rawQuery( """ - SELECT messages.id, messages.message_part_id, COUNT(threads2.id) - FROM messages - LEFT JOIN threads threads1 ON (threads1.message_id = messages.id) - LEFT JOIN threads threads2 ON (threads2.parent = threads1.id) - WHERE folder_id = ? AND uid = ? - """.trimIndent(), +SELECT messages.id, messages.message_part_id, COUNT(threads2.id) +FROM messages +LEFT JOIN threads threads1 ON (threads1.message_id = messages.id) +LEFT JOIN threads threads2 ON (threads2.parent = threads1.id) +WHERE folder_id = ? AND uid = ? + """, arrayOf(folderId.toString(), messageServerId) ).use { cursor -> if (cursor.moveToFirst()) { @@ -128,12 +128,12 @@ internal class DeleteMessageOperations( private fun SQLiteDatabase.getEmptyThreadParent(messageId: Long): Long? { return rawQuery( """ - SELECT messages.id - FROM threads threads1 - JOIN threads threads2 ON (threads1.parent = threads2.id) - JOIN messages ON (threads2.message_id = messages.id AND messages.empty = 1) - WHERE threads1.message_id = ? - """.trimIndent(), +SELECT messages.id +FROM threads threads1 +JOIN threads threads2 ON (threads1.parent = threads2.id) +JOIN messages ON (threads2.message_id = messages.id AND messages.empty = 1) +WHERE threads1.message_id = ? + """, arrayOf(messageId.toString()) ).use { cursor -> if (cursor.moveToFirst() && !cursor.isNull(0)) { @@ -151,11 +151,11 @@ internal class DeleteMessageOperations( private fun SQLiteDatabase.hasThreadChildren(messageId: Long): Boolean { return rawQuery( """ - SELECT COUNT(threads2.id) - FROM threads threads1 - JOIN threads threads2 ON (threads2.parent = threads1.id) - WHERE threads1.message_id = ? - """.trimIndent(), +SELECT COUNT(threads2.id) +FROM threads threads1 +JOIN threads threads2 ON (threads2.parent = threads1.id) +WHERE threads1.message_id = ? + """, arrayOf(messageId.toString()) ).use { cursor -> cursor.moveToFirst() && !cursor.isNull(0) && cursor.getLong(0) > 0L diff --git a/app/storage/src/main/java/com/fsck/k9/storage/messages/RetrieveFolderOperations.kt b/app/storage/src/main/java/com/fsck/k9/storage/messages/RetrieveFolderOperations.kt index 44bbba649c9fe36869ea1b186929e2a32e5b2e27..ea04aa6b97caac9bd1b674f01cc7ae2c3104c545 100644 --- a/app/storage/src/main/java/com/fsck/k9/storage/messages/RetrieveFolderOperations.kt +++ b/app/storage/src/main/java/com/fsck/k9/storage/messages/RetrieveFolderOperations.kt @@ -70,22 +70,22 @@ internal class RetrieveFolderOperations(private val lockableDatabase: LockableDa val query = """ - SELECT ${FOLDER_COLUMNS.joinToString()}, ( - SELECT COUNT(messages.id) - FROM messages - WHERE messages.folder_id = folders.id - AND messages.empty = 0 AND messages.deleted = 0 - AND (messages.read = 0 OR folders.id = ?) - ), ( - SELECT COUNT(messages.id) - FROM messages - WHERE messages.folder_id = folders.id - AND messages.empty = 0 AND messages.deleted = 0 - AND messages.flagged = 1 - ) - FROM folders - $displayModeSelection - """.trimIndent() +SELECT ${FOLDER_COLUMNS.joinToString()}, ( + SELECT COUNT(messages.id) + FROM messages + WHERE messages.folder_id = folders.id + AND messages.empty = 0 AND messages.deleted = 0 + AND (messages.read = 0 OR folders.id = ?) +), ( + SELECT COUNT(messages.id) + FROM messages + WHERE messages.folder_id = folders.id + AND messages.empty = 0 AND messages.deleted = 0 + AND messages.flagged = 1 +) +FROM folders +$displayModeSelection + """ db.rawQuery(query, arrayOf(outboxFolderIdOrZero.toString())).use { cursor -> val cursorFolderAccessor = CursorFolderAccessor(cursor) diff --git a/app/storage/src/main/java/com/fsck/k9/storage/messages/RetrieveMessageListOperations.kt b/app/storage/src/main/java/com/fsck/k9/storage/messages/RetrieveMessageListOperations.kt index 45d8b4340cf7434ec7dbf5cc9ba9f3fd4324fde1..d84480e44f3ff0f5f5adea3a9f65e9053902f4dd 100644 --- a/app/storage/src/main/java/com/fsck/k9/storage/messages/RetrieveMessageListOperations.kt +++ b/app/storage/src/main/java/com/fsck/k9/storage/messages/RetrieveMessageListOperations.kt @@ -20,32 +20,32 @@ internal class RetrieveMessageListOperations(private val lockableDatabase: Locka return lockableDatabase.execute(false) { database -> database.rawQuery( """ - SELECT - messages.id AS id, - uid, - folder_id, - sender_list, - to_list, - cc_list, - date, - internal_date, - subject, - preview_type, - preview, - read, - flagged, - answered, - forwarded, - attachment_count, - root - FROM messages - JOIN threads ON (threads.message_id = messages.id) - LEFT JOIN FOLDERS ON (folders.id = messages.folder_id) - WHERE - ($selection) - AND empty = 0 AND deleted = 0 - ORDER BY $sortOrder - """.trimIndent(), +SELECT + messages.id AS id, + uid, + folder_id, + sender_list, + to_list, + cc_list, + date, + internal_date, + subject, + preview_type, + preview, + read, + flagged, + answered, + forwarded, + attachment_count, + root +FROM messages +JOIN threads ON (threads.message_id = messages.id) +LEFT JOIN FOLDERS ON (folders.id = messages.folder_id) +WHERE + ($selection) + AND empty = 0 AND deleted = 0 +ORDER BY $sortOrder + """, selectionArgs, ).use { cursor -> val cursorMessageAccessor = CursorMessageAccessor(cursor, includesThreadCount = false) @@ -72,60 +72,60 @@ internal class RetrieveMessageListOperations(private val lockableDatabase: Locka return lockableDatabase.execute(false) { database -> database.rawQuery( """ - SELECT - messages.id AS id, - uid, - folder_id, - sender_list, - to_list, - cc_list, - aggregated.date AS date, - aggregated.internal_date AS internal_date, - subject, - preview_type, - preview, - aggregated.read AS read, - aggregated.flagged AS flagged, - aggregated.answered AS answered, - aggregated.forwarded AS forwarded, - aggregated.attachment_count AS attachment_count, - root, - aggregated.thread_count AS thread_count - FROM ( - SELECT - threads.root AS thread_root, - MAX(date) AS date, - MAX(internal_date) AS internal_date, - MIN(read) AS read, - MAX(flagged) AS flagged, - MIN(answered) AS answered, - MIN(forwarded) AS forwarded, - SUM(attachment_count) AS attachment_count, - COUNT(threads.root) AS thread_count - FROM messages - JOIN threads ON (threads.message_id = messages.id) - JOIN folders ON (folders.id = messages.folder_id) - WHERE - threads.root IN ( - SELECT threads.root - FROM messages - JOIN threads ON (threads.message_id = messages.id) - WHERE messages.empty = 0 AND messages.deleted = 0 - ) - AND ($selection) - AND messages.empty = 0 AND messages.deleted = 0 - GROUP BY threads.root - ) aggregated - JOIN threads ON (threads.root = aggregated.thread_root) - JOIN messages ON ( - messages.id = threads.message_id - AND messages.empty = 0 AND messages.deleted = 0 - AND messages.date = aggregated.date - ) - JOIN folders ON (folders.id = messages.folder_id) - GROUP BY threads.root - ORDER BY $orderBy - """.trimIndent(), +SELECT + messages.id AS id, + uid, + folder_id, + sender_list, + to_list, + cc_list, + aggregated.date AS date, + aggregated.internal_date AS internal_date, + subject, + preview_type, + preview, + aggregated.read AS read, + aggregated.flagged AS flagged, + aggregated.answered AS answered, + aggregated.forwarded AS forwarded, + aggregated.attachment_count AS attachment_count, + root, + aggregated.thread_count AS thread_count +FROM ( + SELECT + threads.root AS thread_root, + MAX(date) AS date, + MAX(internal_date) AS internal_date, + MIN(read) AS read, + MAX(flagged) AS flagged, + MIN(answered) AS answered, + MIN(forwarded) AS forwarded, + SUM(attachment_count) AS attachment_count, + COUNT(threads.root) AS thread_count + FROM messages + JOIN threads ON (threads.message_id = messages.id) + JOIN folders ON (folders.id = messages.folder_id) + WHERE + threads.root IN ( + SELECT threads.root + FROM messages + JOIN threads ON (threads.message_id = messages.id) + WHERE messages.empty = 0 AND messages.deleted = 0 + ) + AND ($selection) + AND messages.empty = 0 AND messages.deleted = 0 + GROUP BY threads.root +) aggregated +JOIN threads ON (threads.root = aggregated.thread_root) +JOIN messages ON ( + messages.id = threads.message_id + AND messages.empty = 0 AND messages.deleted = 0 + AND messages.date = aggregated.date +) +JOIN folders ON (folders.id = messages.folder_id) +GROUP BY threads.root +ORDER BY $orderBy + """, selectionArgs, ).use { cursor -> val cursorMessageAccessor = CursorMessageAccessor(cursor, includesThreadCount = true) @@ -145,32 +145,32 @@ internal class RetrieveMessageListOperations(private val lockableDatabase: Locka return lockableDatabase.execute(false) { database -> database.rawQuery( """ - SELECT - messages.id AS id, - uid, - folder_id, - sender_list, - to_list, - cc_list, - date, - internal_date, - subject, - preview_type, - preview, - read, - flagged, - answered, - forwarded, - attachment_count, - root - FROM threads - JOIN messages ON (messages.id = threads.message_id) - LEFT JOIN FOLDERS ON (folders.id = messages.folder_id) - WHERE - root = ? - AND empty = 0 AND deleted = 0 - ORDER BY $sortOrder - """.trimIndent(), +SELECT + messages.id AS id, + uid, + folder_id, + sender_list, + to_list, + cc_list, + date, + internal_date, + subject, + preview_type, + preview, + read, + flagged, + answered, + forwarded, + attachment_count, + root +FROM threads +JOIN messages ON (messages.id = threads.message_id) +LEFT JOIN FOLDERS ON (folders.id = messages.folder_id) +WHERE + root = ? + AND empty = 0 AND deleted = 0 +ORDER BY $sortOrder + """, arrayOf(threadId.toString()), ).use { cursor -> val cursorMessageAccessor = CursorMessageAccessor(cursor, includesThreadCount = false) diff --git a/app/storage/src/main/java/com/fsck/k9/storage/messages/ThreadMessageOperations.kt b/app/storage/src/main/java/com/fsck/k9/storage/messages/ThreadMessageOperations.kt index 52544b1f4b4fc9b2ea569170b5caacbabd9ee584..21491c98fee5b44796a730315b691eb86976fda2 100644 --- a/app/storage/src/main/java/com/fsck/k9/storage/messages/ThreadMessageOperations.kt +++ b/app/storage/src/main/java/com/fsck/k9/storage/messages/ThreadMessageOperations.kt @@ -20,11 +20,11 @@ internal class ThreadMessageOperations { fun getMessageThreadHeaders(database: SQLiteDatabase, messageId: Long): ThreadHeaders { return database.rawQuery( """ - SELECT messages.message_id, message_parts.header - FROM messages - LEFT JOIN message_parts ON (messages.message_part_id = message_parts.id) - WHERE messages.id = ? - """.trimIndent(), +SELECT messages.message_id, message_parts.header +FROM messages +LEFT JOIN message_parts ON (messages.message_part_id = message_parts.id) +WHERE messages.id = ? + """, arrayOf(messageId.toString()), ).use { cursor -> if (!cursor.moveToFirst()) error("Message not found: $messageId") @@ -157,14 +157,14 @@ internal class ThreadMessageOperations { return db.rawQuery( """ - SELECT t.id, t.message_id, t.root, t.parent - FROM messages m - LEFT JOIN threads t ON (t.message_id = m.id) - WHERE m.folder_id = ? AND m.message_id = ? - ${if (onlyEmpty) "AND m.empty = 1 " else ""} - ORDER BY m.id - LIMIT 1 - """.trimIndent(), +SELECT t.id, t.message_id, t.root, t.parent +FROM messages m +LEFT JOIN threads t ON (t.message_id = m.id) +WHERE m.folder_id = ? AND m.message_id = ? +${if (onlyEmpty) "AND m.empty = 1 " else ""} +ORDER BY m.id +LIMIT 1 + """, arrayOf(folderId.toString(), messageIdHeader) ).use { cursor -> if (cursor.moveToFirst()) { diff --git a/app/testing/build.gradle b/app/testing/build.gradle index 91d2eb8a26cbdda20d8ae4c775932f4d99831b6c..c349f9ddf1c6b675e2021a11bf0b26481a7235bf 100644 --- a/app/testing/build.gradle +++ b/app/testing/build.gradle @@ -12,6 +12,8 @@ dependencies { } android { + namespace 'com.fsck.k9.testing' + compileSdkVersion buildConfig.compileSdk buildToolsVersion buildConfig.buildTools diff --git a/app/testing/src/main/AndroidManifest.xml b/app/testing/src/main/AndroidManifest.xml deleted file mode 100644 index a7a5e01452c9b6f4d5c6b1f98dff6f873b710ba7..0000000000000000000000000000000000000000 --- a/app/testing/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/app/ui/base/build.gradle b/app/ui/base/build.gradle index 97dc1f2bd12a2df1c5ad9b5323be47a0f3f65697..410764844d4d57fa513c126248cd5a57ef7ee043 100644 --- a/app/ui/base/build.gradle +++ b/app/ui/base/build.gradle @@ -18,6 +18,8 @@ dependencies { } android { + namespace 'com.fsck.k9.ui.base' + compileSdkVersion buildConfig.compileSdk buildToolsVersion buildConfig.buildTools diff --git a/app/ui/base/src/main/AndroidManifest.xml b/app/ui/base/src/main/AndroidManifest.xml index f69b1cd3c079c31dd052c18a2d4c56e16427141b..495700ab6224c4cf6a947eec0b8b116640b54317 100644 --- a/app/ui/base/src/main/AndroidManifest.xml +++ b/app/ui/base/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + diff --git a/app/ui/legacy/build.gradle b/app/ui/legacy/build.gradle index 0c594ea03df7d7c10967aa3fd9e5e68d3754f393..1e0ec82ae7e1a92806d55e1d581b1664c4ae9208 100644 --- a/app/ui/legacy/build.gradle +++ b/app/ui/legacy/build.gradle @@ -33,9 +33,7 @@ dependencies { implementation "com.splitwise:tokenautocomplete:3.0.2" implementation "de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0" implementation 'com.mikepenz:materialdrawer:8.4.5' - implementation 'com.mikepenz:materialdrawer-iconics:8.4.5' - implementation 'com.mikepenz:fontawesome-typeface:5.9.0.0-kotlin@aar' - implementation 'com.github.ByteHamster:SearchPreference:v2.2.1' + implementation 'com.github.ByteHamster:SearchPreference:v2.3.0' implementation "com.mikepenz:fastadapter:${versions.fastAdapter}" implementation "com.mikepenz:fastadapter-extensions-drag:${versions.fastAdapter}" implementation "com.mikepenz:fastadapter-extensions-utils:${versions.fastAdapter}" @@ -71,11 +69,13 @@ dependencies { implementation "com.squareup.retrofit2:retrofit:${versions.retrofit}" implementation "com.squareup.retrofit2:converter-simplexml:${versions.retrofit}" - implementation "com.github.fahim44:FullScreenLoadingDialog:1.0.6" + implementation "com.github.fahim44:FullScreenLoadingDialog:1.0.7" implementation "org.greenrobot:eventbus:3.3.1" } android { + namespace 'com.fsck.k9.ui' + compileSdkVersion buildConfig.compileSdk buildToolsVersion buildConfig.buildTools diff --git a/app/ui/legacy/src/main/AndroidManifest.xml b/app/ui/legacy/src/main/AndroidManifest.xml index e60d813b96243318dc534f9122ff4e0a88a1bc91..ccafebb964fb720cdcf829542b83d930b6375d46 100644 --- a/app/ui/legacy/src/main/AndroidManifest.xml +++ b/app/ui/legacy/src/main/AndroidManifest.xml @@ -1,11 +1,9 @@ - + - 0) { - listView.setSelection(currentPosition - 1); - } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN && - currentPosition < listView.getCount()) { - listView.setSelection(currentPosition + 1); - } - - return true; - } - - return super.onKeyDown(keyCode, event); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - // Swallow these events too to avoid the audible notification of a volume change - if (K9.isUseVolumeKeysForListNavigation() && - (keyCode == KeyEvent.KEYCODE_VOLUME_UP || - keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) { - return true; - } - - return super.onKeyUp(keyCode, event); - } - protected ListView getListView() { if (list == null) { list = findViewById(android.R.id.list); diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt b/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt index 9a625169ad8bbe9a566be4bf2fee3d4b10aee241..e0fed2a76663c280220fde61d84aef0eaf8d9f07 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt @@ -603,7 +603,7 @@ open class MessageList : messageViewOnly = savedInstanceState.getBoolean(STATE_MESSAGE_VIEW_ONLY) messageListWasDisplayed = savedInstanceState.getBoolean(STATE_MESSAGE_LIST_WAS_DISPLAYED) - initialSearchViewIconified = savedInstanceState.getBoolean(STATE_SEARCH_VIEW_ICONIFIED) + initialSearchViewIconified = savedInstanceState.getBoolean(STATE_SEARCH_VIEW_ICONIFIED, true) initialSearchViewQuery = savedInstanceState.getString(STATE_SEARCH_VIEW_QUERY) } @@ -774,9 +774,6 @@ open class MessageList : ) { showPreviousMessage() return true - } else if (displayMode != DisplayMode.MESSAGE_VIEW && K9.isUseVolumeKeysForListNavigation) { - messageListFragment!!.onMoveUp() - return true } } KeyEvent.KEYCODE_VOLUME_DOWN -> { @@ -785,9 +782,6 @@ open class MessageList : ) { showNextMessage() return true - } else if (displayMode != DisplayMode.MESSAGE_VIEW && K9.isUseVolumeKeysForListNavigation) { - messageListFragment!!.onMoveDown() - return true } } KeyEvent.KEYCODE_DEL -> { @@ -925,7 +919,7 @@ open class MessageList : override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { // Swallow these events too to avoid the audible notification of a volume change - if (K9.isUseVolumeKeysForListNavigation) { + if (K9.isUseVolumeKeysForNavigation) { if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { Timber.v("Swallowed key up.") return true @@ -995,8 +989,8 @@ open class MessageList : } }) - searchView.isIconified = initialSearchViewIconified searchView.setQuery(initialSearchViewQuery, false) + searchView.isIconified = initialSearchViewIconified this.searchView = searchView } @@ -1223,10 +1217,16 @@ open class MessageList : } private fun showLogicalNextMessage(): Boolean { - return when (lastDirection) { + val couldMoveInLastDirection = when (lastDirection) { Direction.NEXT -> showNextMessage() Direction.PREVIOUS -> showPreviousMessage() } + + return if (couldMoveInLastDirection) { + true + } else { + showNextMessage() || showPreviousMessage() + } } override fun setProgress(enable: Boolean) { diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.kt b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.kt index 9a40e5f937aef6180af43be2c13d3c0cb464e1f3..229d7ee2dccc0280dc6da9e3cac6bf4ccf9efb7c 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.kt @@ -39,6 +39,7 @@ import com.fsck.k9.ui.settings.ExtraAccountDiscovery import com.fsck.k9.view.ClientCertificateSpinner import com.google.android.material.textfield.TextInputEditText import com.lamonjush.fullscreenloadingdialog.FullScreenLoadingDialog +import com.lamonjush.fullscreenloadingdialog.SpinKitStyle import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.greenrobot.eventbus.EventBus @@ -286,6 +287,7 @@ class AccountSetupBasics : K9Activity() { private fun providersApiDiscoveryDiscover(email: String) { // We don't have predefine configuration, try to retrieve it by api call FullScreenLoadingDialog.getInstance() + .setSpinKitStyle(SpinKitStyle.PULSE) .setSpinKitColor(R.color.color_default_accent) .show(this) diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListAdapter.kt b/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListAdapter.kt index ee8452af784ce88676aa0803bee19200b5010028..1743963d93a32ea3a14bf955b42155367b8c162a 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListAdapter.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListAdapter.kt @@ -1,6 +1,6 @@ package com.fsck.k9.fragment -import android.content.Context +import android.annotation.SuppressLint import android.content.res.Resources import android.content.res.Resources.Theme import android.graphics.Typeface @@ -14,12 +14,15 @@ import android.view.View.GONE import android.view.View.INVISIBLE import android.view.View.OnClickListener import android.view.View.VISIBLE +import android.view.View.OnLongClickListener import android.view.ViewGroup -import android.widget.BaseAdapter import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.view.isVisible +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.NO_POSITION import com.fsck.k9.FontSizes import com.fsck.k9.contacts.ContactPictureLoader import com.fsck.k9.controller.MessageReference @@ -32,8 +35,12 @@ import com.fsck.k9.ui.resolveColorAttribute import com.fsck.k9.ui.resolveDrawableAttribute import kotlin.math.max +private const val FOOTER_ID = 1L + +private const val TYPE_MESSAGE = 0 +private const val TYPE_FOOTER = 1 + class MessageListAdapter internal constructor( - private val context: Context, theme: Theme, private val res: Resources, private val layoutInflater: LayoutInflater, @@ -41,21 +48,24 @@ class MessageListAdapter internal constructor( private val listItemListener: MessageListItemActionListener, private val appearance: MessageListAppearance, private val relativeDateTimeFormatter: RelativeDateTimeFormatter -) : BaseAdapter() { +) : RecyclerView.Adapter() { private val forwardedIcon: Drawable = theme.resolveDrawableAttribute(R.attr.messageListForwarded) private val answeredIcon: Drawable = theme.resolveDrawableAttribute(R.attr.messageListAnswered) private val forwardedAnsweredIcon: Drawable = theme.resolveDrawableAttribute(R.attr.messageListAnsweredForwarded) - private val activeItemBackgroundColor: Int = - theme.resolveColorAttribute(R.attr.messageListActiveItemBackgroundColor) - private val selectedItemBackgroundColor: Int = - theme.resolveColorAttribute(R.attr.messageListSelectedBackgroundColor) + private val activeItemBackgroundColor: Int = theme.resolveColorAttribute(R.attr.messageListActiveItemBackgroundColor) + private val selectedItemBackgroundColor: Int = theme.resolveColorAttribute(R.attr.messageListSelectedBackgroundColor) + private val previewTextColor: Int = theme.resolveColorAttribute(R.attr.messageListPreviewTextColor) + private val regularItemBackgroundColor: Int = theme.resolveColorAttribute(R.attr.messageListUnreadItemBackgroundColor) private val readItemBackgroundColor: Int = theme.resolveColorAttribute(R.attr.messageListReadItemBackgroundColor) private val unreadItemBackgroundColor: Int = theme.resolveColorAttribute(R.attr.messageListUnreadItemBackgroundColor) var messages: List = emptyList() + @SuppressLint("NotifyDataSetChanged") set(value) { + val oldMessageList = field + field = value messagesMap = value.associateBy { it.uniqueId } @@ -64,7 +74,16 @@ class MessageListAdapter internal constructor( selected = selected.intersect(uniqueIds) } - notifyDataSetChanged() + if (oldMessageList.isEmpty()) { + // While loading, only the footer view is showing. If we used DiffUtil, the footer view would be used as + // anchor element and the updated list would be scrolled all the way down. + notifyDataSetChanged() + } else { + val diffResult = DiffUtil.calculateDiff( + MessageListDiffCallback(oldMessageList = oldMessageList, newMessageList = value) + ) + diffResult.dispatchUpdatesTo(this) + } } private var isInSelectionMode: Boolean = false @@ -72,9 +91,40 @@ class MessageListAdapter internal constructor( private var messagesMap = emptyMap() var activeMessage: MessageReference? = null + set(value) { + if (value == field) return + + val oldPosition = getPosition(field) + val newPosition = getPosition(value) + + field = value + + oldPosition?.let { position -> notifyItemChanged(position) } + newPosition?.let { position -> notifyItemChanged(position) } + } var selected: Set = emptySet() private set(value) { + if (value == field) return + + // Selection removed + field.asSequence() + .filter { uniqueId -> uniqueId !in value } + .mapNotNull { uniqueId -> messagesMap[uniqueId] } + .mapNotNull { messageListItem -> getPosition(messageListItem) } + .forEach { position -> + notifyItemChanged(position) + } + + // Selection added + value.asSequence() + .filter { uniqueId -> uniqueId !in field } + .mapNotNull { uniqueId -> messagesMap[uniqueId] } + .mapNotNull { messageListItem -> getPosition(messageListItem) } + .forEach { position -> + notifyItemChanged(position) + } + field = value selectedCount = calculateSelectionCount() isInSelectionMode = (selectedCount != 0) @@ -90,6 +140,34 @@ class MessageListAdapter internal constructor( var selectedCount: Int = 0 private set + var footerText: String? = null + set(value) { + if (field == value) return + + val hadFooterText = field != null + val previousFooterPosition = footerPosition + field = value + + if (hadFooterText) { + if (value == null) { + notifyItemRemoved(previousFooterPosition) + } else { + notifyItemChanged(footerPosition) + } + } else { + notifyItemInserted(footerPosition) + } + } + + private val hasFooter: Boolean + get() = footerText != null + + private val lastMessagePosition: Int + get() = messages.lastIndex + + private val footerPosition: Int + get() = if (hasFooter) lastMessagePosition + 1 else NO_POSITION + private inline val subjectViewFontSize: Int get() = if (appearance.senderAboveSubject) { appearance.fontSizes.messageListSender @@ -97,34 +175,59 @@ class MessageListAdapter internal constructor( appearance.fontSizes.messageListSubject } + private val messageClickedListener = OnClickListener { view: View -> + val messageListItem = getItemFromView(view) + listItemListener.onMessageClicked(messageListItem) + } + + private val messageLongClickedListener = OnLongClickListener { view: View -> + val messageListItem = getItemFromView(view) + listItemListener.onToggleMessageSelection(messageListItem) + true + } + + private val footerClickListener = OnClickListener { + listItemListener.onFooterClicked() + } + private val flagClickListener = OnClickListener { view: View -> - val messageViewHolder = view.tag as MessageViewHolder - val messageListItem = getItemById(messageViewHolder.uniqueId) + val messageListItem = getItemFromView(view) listItemListener.onToggleMessageFlag(messageListItem) } private val contactPictureClickListener = OnClickListener { view: View -> val parentView = view.parent.parent as View - val messageViewHolder = parentView.tag as MessageViewHolder - val messageListItem = getItemById(messageViewHolder.uniqueId) + val messageListItem = getItemFromView(parentView) listItemListener.onToggleMessageSelection(messageListItem) } + init { + setHasStableIds(true) + } + private fun recipientSigil(toMe: Boolean, ccMe: Boolean) = when { toMe -> res.getString(R.string.messagelist_sent_to_me_sigil) + " " ccMe -> res.getString(R.string.messagelist_sent_cc_me_sigil) + " " else -> "" } - override fun hasStableIds(): Boolean = true + override fun getItemCount(): Int = messages.size + if (hasFooter) 1 else 0 - override fun getCount(): Int = messages.size + override fun getItemId(position: Int): Long { + return if (position <= lastMessagePosition) { + messages[position].uniqueId + } else { + FOOTER_ID + } + } - override fun getItemId(position: Int): Long = messages[position].uniqueId + override fun getItemViewType(position: Int): Int { + return if (position <= lastMessagePosition) TYPE_MESSAGE else TYPE_FOOTER + } - override fun getItem(position: Int): MessageListItem = messages[position] + private fun getItem(position: Int): MessageListItem = messages[position] - private fun getItemById(uniqueId: Long): MessageListItem { + fun getItemById(uniqueId: Long): MessageListItem { return messagesMap[uniqueId]!! } @@ -140,17 +243,26 @@ class MessageListAdapter internal constructor( return messages.indexOf(messageListItem).takeIf { it != -1 } } - override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { - val message = getItem(position) - val view: View = convertView ?: newView(parent) + private fun getPosition(messageReference: MessageReference?): Int? { + if (messageReference == null) return null - bindView(view, context, message) + return messages.indexOfFirst { + messageReference.equals(it.account.uuid, it.folderId, it.messageUid) + }.takeIf { it != -1 } + } - return view + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageListViewHolder { + return when (viewType) { + TYPE_MESSAGE -> createMessageViewHolder(parent) + TYPE_FOOTER -> createFooterViewHolder(parent) + else -> error("Unsupported type: $viewType") + } } - private fun newView(parent: ViewGroup?): View { + private fun createMessageViewHolder(parent: ViewGroup?): MessageViewHolder { val view = layoutInflater.inflate(R.layout.message_list_item, parent, false) + view.setOnClickListener(messageClickedListener) + view.setOnLongClickListener(messageLongClickedListener) val holder = MessageViewHolder(view) @@ -172,22 +284,42 @@ class MessageListAdapter internal constructor( view.tag = holder - return view + return holder + } + + private fun createFooterViewHolder(parent: ViewGroup): MessageListViewHolder { + val view = layoutInflater.inflate(R.layout.message_list_item_footer, parent, false) + view.setOnClickListener(footerClickListener) + return FooterViewHolder(view) } - private fun bindView(view: View, context: Context, message: MessageListItem) { + override fun onBindViewHolder(holder: MessageListViewHolder, position: Int) { + when (val viewType = getItemViewType(position)) { + TYPE_MESSAGE -> { + val messageListItem = getItem(position) + bindMessageViewHolder(holder as MessageViewHolder, messageListItem) + } + TYPE_FOOTER -> { + bindFooterViewHolder(holder as FooterViewHolder) + } + else -> { + error("Unsupported type: $viewType") + } + } + } - if (message.displayName.trim().toString().equals(res.getString(R.string.unknown_sender)) - && message.subject?.trim().toString().equals(res.getString(R.string.general_no_subject)) + private fun bindMessageViewHolder(holder: MessageViewHolder, messageListItem: MessageListItem) { + if (messageListItem.displayName.trim().toString() == res.getString(R.string.unknown_sender) + && messageListItem.subject?.trim().toString() == res.getString(R.string.general_no_subject) ) { - view.setVisibility(View.GONE) + holder.itemView.visibility = GONE return } - view.setVisibility(View.VISIBLE) - val isSelected = selected.contains(message.uniqueId) - val isActive = isActiveMessage(message) - val holder = view.tag as MessageViewHolder + holder.itemView.visibility = VISIBLE + + val isSelected = selected.contains(messageListItem.uniqueId) + val isActive = isActiveMessage(messageListItem) if (isInSelectionMode) { if (isSelected) { @@ -209,7 +341,7 @@ class MessageListAdapter internal constructor( holder.endDivider.setBackgroundResource(R.color.color_default_divider) } - with(message) { + with(messageListItem) { val maybeBoldTypeface = if (isRead) Typeface.NORMAL else Typeface.BOLD val displayDate = relativeDateTimeFormatter.formatDate(messageDate) val displayThreadCount = if (appearance.showingThreadedList) threadCount else 0 @@ -221,7 +353,7 @@ class MessageListAdapter internal constructor( holder.flagged.isVisible = false } holder.uniqueId = uniqueId - setBackgroundColor(view, isSelected, isActive) + setBackgroundColor(holder.itemView, isSelected, isActive) holder.unreadMessageIndicator.visibility = if (isRead) INVISIBLE else VISIBLE val beforePreviewText = if (appearance.senderAboveSubject) subject else displayName holder.displayName.setText(beforePreviewText, TextView.BufferType.SPANNABLE) @@ -256,11 +388,17 @@ class MessageListAdapter internal constructor( } } - private fun formatDisplayText( - display: TextView, + private fun bindFooterViewHolder(holder: FooterViewHolder) { + holder.text.text = footerText + } + + private fun formatPreviewText( + preview: TextView, + beforePreviewText: CharSequence, + sigil: String, messageRead: Boolean ) { - val displayText = display.text as Spannable + val displayText = preview.text as Spannable addBeforePreviewSpan(displayText, displayText.length, messageRead) } @@ -394,9 +532,33 @@ class MessageListAdapter internal constructor( .filter { it.uniqueId in selected } .sumOf { it.threadCount.coerceAtLeast(1) } } + + private fun getItemFromView(view: View): MessageListItem { + val messageViewHolder = view.tag as MessageViewHolder + return getItemById(messageViewHolder.uniqueId) + } +} + +private class MessageListDiffCallback( + private val oldMessageList: List, + private val newMessageList: List +) : DiffUtil.Callback() { + override fun getOldListSize(): Int = oldMessageList.size + + override fun getNewListSize(): Int = newMessageList.size + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return oldMessageList[oldItemPosition].uniqueId == newMessageList[newItemPosition].uniqueId + } + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return oldMessageList[oldItemPosition] == newMessageList[newItemPosition] + } } interface MessageListItemActionListener { + fun onMessageClicked(messageListItem: MessageListItem) fun onToggleMessageSelection(item: MessageListItem) fun onToggleMessageFlag(item: MessageListItem) + fun onFooterClicked() } diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListFragment.kt b/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListFragment.kt index eb49e9b1493453a0ae344fcd69350eab705fdcea..5d6593901aecb30a221529ab5a916149bd7c4ea1 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListFragment.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListFragment.kt @@ -11,15 +11,14 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.view.ViewGroup -import android.widget.AdapterView -import android.widget.AdapterView.OnItemClickListener -import android.widget.AdapterView.OnItemLongClickListener -import android.widget.ListView -import android.widget.TextView import android.widget.Toast import androidx.appcompat.view.ActionMode import androidx.core.os.bundleOf import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.DefaultItemAnimator +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.fsck.k9.Account import com.fsck.k9.Account.Expunge @@ -65,8 +64,6 @@ private const val MAXIMUM_MESSAGE_SORT_OVERRIDES = 3 class MessageListFragment : Fragment(), - OnItemClickListener, - OnItemLongClickListener, ConfirmationDialogFragmentListener, MessageListItemActionListener { @@ -85,12 +82,9 @@ class MessageListFragment : private lateinit var fragmentListener: MessageListFragmentListener - private lateinit var listView: ListView + private lateinit var recyclerView: RecyclerView private lateinit var swipeRefreshLayout: SwipeRefreshLayout private lateinit var adapter: MessageListAdapter - private var footerView: View? = null - - private var savedListState: Parcelable? = null private lateinit var accountUuids: Array private var account: Account? = null @@ -123,6 +117,7 @@ class MessageListFragment : private set private var isSingleFolderMode = false private var isRemoteSearch = false + private var initialMessageListLoad = true private val isUnifiedInbox: Boolean get() = localSearch.id == SearchAccount.UNIFIED_INBOX @@ -193,7 +188,6 @@ class MessageListFragment : activeMessages = savedInstanceState.getStringArray(STATE_ACTIVE_MESSAGES)?.map { MessageReference.parse(it)!! } restoreSelectedMessages(savedInstanceState) isRemoteSearch = savedInstanceState.getBoolean(STATE_REMOTE_SEARCH_PERFORMED) - savedListState = savedInstanceState.getParcelable(STATE_MESSAGE_LIST) val messageReferenceString = savedInstanceState.getString(STATE_ACTIVE_MESSAGE) activeMessage = MessageReference.parse(messageReferenceString) } @@ -203,7 +197,7 @@ class MessageListFragment : } fun restoreListState(savedListState: Parcelable) { - listView.onRestoreInstanceState(savedListState) + recyclerView.layoutManager?.onRestoreInstanceState(savedListState) } private fun decodeArguments(): MessageListFragment? { @@ -243,7 +237,7 @@ class MessageListFragment : override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.message_list_fragment, container, false).apply { initializeSwipeRefreshLayout(this) - initializeListView(this) + initializeRecyclerView(this) } } @@ -260,16 +254,13 @@ class MessageListFragment : swipeRefreshLayout.isEnabled = false } - private fun initializeListView(view: View) { - listView = view.findViewById(R.id.message_list) - with(listView) { - scrollBarStyle = View.SCROLLBARS_INSIDE_OVERLAY - isLongClickable = true - isFastScrollEnabled = false - isVerticalFadingEdgeEnabled = false - isScrollingCacheEnabled = false - onItemClickListener = this@MessageListFragment - onItemLongClickListener = this@MessageListFragment + private fun initializeRecyclerView(view: View) { + recyclerView = view.findViewById(R.id.message_list) + + val itemDecoration = DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + recyclerView.addItemDecoration(itemDecoration) + recyclerView.itemAnimator = DefaultItemAnimator().apply { + supportsChangeAnimations = false } } @@ -285,7 +276,6 @@ class MessageListFragment : private fun initializeMessageList() { adapter = MessageListAdapter( - context = requireContext(), theme = requireActivity().theme, res = resources, layoutInflater = layoutInflater, @@ -297,12 +287,7 @@ class MessageListFragment : adapter.activeMessage = activeMessage - if (isSingleFolderMode) { - listView.addFooterView(getFooterView(listView)) - updateFooter(null) - } - - listView.adapter = adapter + recyclerView.adapter = adapter } private fun initializeSortSettings() { @@ -335,10 +320,9 @@ class MessageListFragment : currentFolder?.let { if (it.databaseId == folderId) { it.loading = loading + updateFooterText() } } - - updateFooterView() } fun updateTitle() { @@ -400,16 +384,7 @@ class MessageListFragment : fragmentListener.setMessageListProgressEnabled(progress) } - override fun onItemClick(parent: AdapterView<*>?, view: View, position: Int, id: Long) { - if (view === footerView) { - handleFooterClick() - } else { - val messageListItem = adapter.getItem(position) - handleListItemClick(messageListItem) - } - } - - private fun handleFooterClick() { + override fun onFooterClicked() { val currentFolder = this.currentFolder ?: return if (currentFolder.moreMessages && !localSearch.isManualSearch) { @@ -428,7 +403,7 @@ class MessageListFragment : } else { extraSearchResults = null loadSearchResults = additionalSearchResults - updateFooter(null) + updateFooterText(null) } messagingController.loadSearchResults( @@ -440,7 +415,7 @@ class MessageListFragment : } } - private fun handleListItemClick(messageListItem: MessageListItem) { + override fun onMessageClicked(messageListItem: MessageListItem) { if (adapter.selectedCount > 0) { toggleMessageSelect(messageListItem) } else { @@ -452,28 +427,17 @@ class MessageListFragment : } } - override fun onItemLongClick(parent: AdapterView<*>?, view: View, position: Int, id: Long): Boolean { - if (view === footerView) return false - - val messageListItem = adapter.getItem(position) - toggleMessageSelect(messageListItem) - - return true - } - override fun onDestroyView() { if (isNewMessagesView && !requireActivity().isChangingConfigurations) { messagingController.clearNewMessages(account) } - savedListState = listView.onSaveInstanceState() super.onDestroyView() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - saveListState(outState) outState.putLongArray(STATE_SELECTED_MESSAGES, adapter.selected.toLongArray()) outState.putBoolean(STATE_REMOTE_SEARCH_PERFORMED, isRemoteSearch) outState.putStringArray( @@ -485,15 +449,6 @@ class MessageListFragment : } } - private fun saveListState(outState: Bundle) { - if (savedListState != null) { - // The previously saved state was never restored, so just use that. - outState.putParcelable(STATE_MESSAGE_LIST, savedListState) - } else { - outState.putParcelable(STATE_MESSAGE_LIST, listView.onSaveInstanceState()) - } - } - private val messageListAppearance: MessageListAppearance get() = MessageListAppearance( fontSizes = K9.fontSizes, @@ -817,26 +772,15 @@ class MessageListFragment : messagingController.sendPendingMessages(account, null) } - private fun getFooterView(parent: ViewGroup?): View? { - return footerView ?: createFooterView(parent).also { footerView = it } - } - - private fun createFooterView(parent: ViewGroup?): View { - return layoutInflater.inflate(R.layout.message_list_item_footer, parent, false).apply { - tag = FooterViewHolder(this) - } - } - - private fun updateFooterView() { + private fun updateFooterText() { val currentFolder = this.currentFolder val account = this.account - if (localSearch.isManualSearch || currentFolder == null || account == null) { - updateFooter(null) - return - } - - val footerText = if (currentFolder.loading) { + val footerText = if (initialMessageListLoad) { + null + } else if (localSearch.isManualSearch || currentFolder == null || account == null) { + null + } else if (currentFolder.loading) { getString(R.string.status_loading_more) } else if (!currentFolder.moreMessages) { null @@ -846,24 +790,11 @@ class MessageListFragment : getString(R.string.load_more_messages_fmt, account.displayCount) } - updateFooter(footerText) + updateFooterText(footerText) } - fun updateFooter(text: String?) { - val footerView = this.footerView ?: return - - val shouldHideFooter = text == null - if (shouldHideFooter) { - listView.removeFooterView(footerView) - } else { - val isFooterViewAddedToListView = listView.footerViewsCount > 0 - if (!isFooterViewAddedToListView) { - listView.addFooterView(footerView) - } - } - - val holder = footerView.tag as FooterViewHolder - holder.main.text = text + fun updateFooterText(text: String?) { + adapter.footerText = text } private fun selectAll() { @@ -1220,28 +1151,6 @@ class MessageListFragment : super.onStop() } - fun onMoveUp() { - var currentPosition = listView.selectedItemPosition - if (currentPosition == AdapterView.INVALID_POSITION || listView.isInTouchMode) { - currentPosition = listView.firstVisiblePosition - } - - if (currentPosition > 0) { - listView.setSelection(currentPosition - 1) - } - } - - fun onMoveDown() { - var currentPosition = listView.selectedItemPosition - if (currentPosition == AdapterView.INVALID_POSITION || listView.isInTouchMode) { - currentPosition = listView.firstVisiblePosition - } - - if (currentPosition < listView.count) { - listView.setSelection(currentPosition + 1) - } - } - fun openMessage(messageReference: MessageReference) { fragmentListener.openMessage(messageReference) } @@ -1255,8 +1164,9 @@ class MessageListFragment : private val selectedMessageListItem: MessageListItem? get() { - val position = listView.selectedItemPosition - return if (position !in 0 until adapter.count) null else adapter.getItem(position) + val focusedView = recyclerView.focusedChild ?: return null + val viewHolder = recyclerView.findContainingViewHolder(focusedView) as? MessageViewHolder ?: return null + return adapter.getItemById(viewHolder.uniqueId) } private val selectedMessages: List @@ -1393,16 +1303,13 @@ class MessageListFragment : resetActionMode() computeBatchDirection() - if (savedListState != null) { - handler.restoreListPosition(savedListState) - savedListState = null - } - invalidateMenu() + initialMessageListLoad = false + currentFolder?.let { currentFolder -> currentFolder.moreMessages = messageListInfo.hasMoreMessages - updateFooterView() + updateFooterText() } adapter.checkSelectedMode() } @@ -1445,7 +1352,6 @@ class MessageListFragment : // Redraw list immediately if (::adapter.isInitialized) { adapter.activeMessage = activeMessage - adapter.notifyDataSetChanged() if (messageReference != null) { scrollToMessage(messageReference) @@ -1488,8 +1394,11 @@ class MessageListFragment : val messageListItem = adapter.getItem(messageReference) ?: return val position = adapter.getPosition(messageListItem) ?: return - if (position <= listView.firstVisiblePosition || position >= listView.lastVisiblePosition) { - listView.smoothScrollToPosition(position) + val linearLayoutManager = recyclerView.layoutManager as LinearLayoutManager + val firstVisiblePosition = linearLayoutManager.findFirstCompletelyVisibleItemPosition() + val lastVisiblePosition = linearLayoutManager.findLastCompletelyVisibleItemPosition() + if (position !in firstVisiblePosition..lastVisiblePosition) { + recyclerView.smoothScrollToPosition(position) } } @@ -1865,10 +1774,6 @@ class MessageListFragment : } } - internal class FooterViewHolder(view: View) { - val main: TextView = view.findViewById(R.id.main_text) - } - private enum class FolderOperation { COPY, MOVE } @@ -1902,7 +1807,6 @@ class MessageListFragment : private const val STATE_ACTIVE_MESSAGES = "activeMessages" private const val STATE_ACTIVE_MESSAGE = "activeMessage" private const val STATE_REMOTE_SEARCH_PERFORMED = "remoteSearchPerformed" - private const val STATE_MESSAGE_LIST = "listState" fun newInstance(search: LocalSearch, isThreadDisplay: Boolean, threadedList: Boolean): MessageListFragment { return MessageListFragment().apply { diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListHandler.java b/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListHandler.java index d62e7b138ba1659fd231d9e33c6101c20d9e3d0f..72252cf15fb8cbd2886082e6b0693dd295a5b5a8 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListHandler.java +++ b/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListHandler.java @@ -57,7 +57,7 @@ public class MessageListHandler extends Handler { public void run() { MessageListFragment fragment = mFragment.get(); if (fragment != null) { - fragment.updateFooter(message); + fragment.updateFooterText(message); } } }); diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageViewHolder.kt b/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageViewHolder.kt index 18e84b2012b67faef4c20de069003a475ce39edd..471648f053724b7628dc8fdf1771c828d3bcbe65 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageViewHolder.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageViewHolder.kt @@ -5,9 +5,12 @@ import android.widget.CheckBox import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.fsck.k9.ui.R -class MessageViewHolder(view: View) { +sealed class MessageListViewHolder(view: View) : ViewHolder(view) + +class MessageViewHolder(view: View) : MessageListViewHolder(view) { var uniqueId: Long = -1L val selected: ImageView = view.findViewById(R.id.selected) @@ -24,3 +27,7 @@ class MessageViewHolder(view: View) { val rightCheveron : View = view.findViewById(R.id.right_chevron) val endDivider : View = view.findViewById(R.id.end_divider) } + +class FooterViewHolder(view: View) : MessageListViewHolder(view) { + val text: TextView = view.findViewById(R.id.main_text) +} diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/K9Drawer.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/K9Drawer.kt index d2659f13ad850f4fafe51d0b548455f5097b8af3..74562e2b8e0f06845d68deec7089c3b5f4dc737b 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/K9Drawer.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/K9Drawer.kt @@ -57,6 +57,8 @@ import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.component.KoinComponent import org.koin.core.component.inject import org.koin.core.parameter.parametersOf +import com.fsck.k9.core.R as CoreR +import com.mikepenz.materialdrawer.R as MaterialDrawerR private const val UNREAD_SYMBOL = "\u2B24" private const val STARRED_SYMBOL = "\u2605" @@ -106,7 +108,7 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K drawer.addDrawerListener(parent.createDrawerListener()) sliderView.tintStatusBar = true - val drawerPadding = parent.resources.getDimension(R.dimen.material_drawer_vertical_padding).toInt() + val drawerPadding = parent.resources.getDimension(MaterialDrawerR.dimen.material_drawer_vertical_padding).toInt() sliderView.recyclerView.setPadding( (-1) * drawerPadding, 0, @@ -534,11 +536,11 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K private fun Context.obtainDrawerTextColor(): Int { val styledAttributes = obtainStyledAttributes( null, - R.styleable.MaterialDrawerSliderView, - R.attr.materialDrawerStyle, - R.style.Widget_MaterialDrawerStyle + MaterialDrawerR.styleable.MaterialDrawerSliderView, + MaterialDrawerR.attr.materialDrawerStyle, + MaterialDrawerR.style.Widget_MaterialDrawerStyle ) - val textColor = styledAttributes.getColor(R.styleable.MaterialDrawerSliderView_materialDrawerPrimaryText, 0) + val textColor = styledAttributes.getColor(MaterialDrawerR.styleable.MaterialDrawerSliderView_materialDrawerPrimaryText, 0) styledAttributes.recycle() return textColor diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/account/OpenPgpAppSelectDialog.java b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/account/OpenPgpAppSelectDialog.java index 18af4fcf6df8c16543a120529c20ebf5f587da71..512f385ddc5f8e317f6d9a1d8c523136d348606a 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/account/OpenPgpAppSelectDialog.java +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/account/OpenPgpAppSelectDialog.java @@ -110,8 +110,8 @@ public class OpenPgpAppSelectDialog extends K9Activity { Context context = getActivity(); OpenPgpProviderEntry noneEntry = new OpenPgpProviderEntry(null, - context.getString(R.string.openpgp_list_preference_none), - getResources().getDrawable(R.drawable.ic_action_cancel_launchersize_light)); + context.getString(org.openintents.openpgp.R.string.openpgp_list_preference_none), + getResources().getDrawable(org.openintents.openpgp.R.drawable.ic_action_cancel_launchersize_light)); openPgpProviderList.add(noneEntry); // search for OpenPGP providers... @@ -144,8 +144,9 @@ public class OpenPgpAppSelectDialog extends K9Activity { Drawable icon = resolveInfo.activityInfo.loadIcon(context.getPackageManager()); String marketName = String.valueOf(resolveInfo.activityInfo.applicationInfo .loadLabel(context.getPackageManager())); - String simpleName = String.format(context.getString(R.string - .openpgp_install_openkeychain_via), marketName); + String simpleName = String.format( + context.getString(org.openintents.openpgp.R.string.openpgp_install_openkeychain_via), + marketName); openPgpProviderList.add(new OpenPgpProviderEntry(OPENKEYCHAIN_PACKAGE, simpleName, icon, marketIntent)); } diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt index a38bed60c202efa329c5702b445551d8e643d300..fe0b5a2062194603562ee497352a194199f855d8 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt @@ -42,6 +42,7 @@ class GeneralSettingsDataStore( "privacy_hide_timezone" -> K9.isHideTimeZone "debug_logging" -> K9.isDebugLoggingEnabled "sensitive_logging" -> K9.isSensitiveDebugLoggingEnabled + "volume_navigation" -> K9.isUseVolumeKeysForNavigation else -> defValue } } @@ -72,6 +73,7 @@ class GeneralSettingsDataStore( "privacy_hide_timezone" -> K9.isHideTimeZone = value "debug_logging" -> K9.isDebugLoggingEnabled = value "sensitive_logging" -> K9.isSensitiveDebugLoggingEnabled = value + "volume_navigation" -> K9.isUseVolumeKeysForNavigation = value else -> return } @@ -191,12 +193,6 @@ class GeneralSettingsDataStore( if (K9.isMessageViewSpamActionVisible) add("spam") } } - "volume_navigation" -> { - mutableSetOf().apply { - if (K9.isUseVolumeKeysForNavigation) add("message") - if (K9.isUseVolumeKeysForListNavigation) add("list") - } - } else -> defValues } } @@ -219,10 +215,6 @@ class GeneralSettingsDataStore( K9.isMessageViewCopyActionVisible = "copy" in checkedValues K9.isMessageViewSpamActionVisible = "spam" in checkedValues } - "volume_navigation" -> { - K9.isUseVolumeKeysForNavigation = "message" in checkedValues - K9.isUseVolumeKeysForListNavigation = "list" in checkedValues - } else -> return } diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsFragment.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsFragment.kt index f8d31ccab3d0f6b41c01b2df12c02b297e2f04d6..bf27905f4685ea333a650e1c1c47aa709dc1bbe4 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsFragment.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsFragment.kt @@ -14,6 +14,7 @@ import com.google.android.material.snackbar.Snackbar import com.takisoft.preferencex.PreferenceFragmentCompat import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel +import com.fsck.k9.core.R as CoreR class GeneralSettingsFragment : PreferenceFragmentCompat() { private val viewModel: GeneralSettingsViewModel by viewModel() @@ -74,7 +75,7 @@ class GeneralSettingsFragment : PreferenceFragmentCompat() { (findPreference(PREFERENCE_THEME) as? ListPreference)?.apply { if (Build.VERSION.SDK_INT < 28) { setEntries(R.array.theme_entries_legacy) - setEntryValues(R.array.theme_values_legacy) + setEntryValues(CoreR.array.theme_values_legacy) } } } diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/LanguagePreference.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/LanguagePreference.kt index f83487f81bf94420331607d446a6f571bf7d5528..8884c2f7302df4a4dc0105a2a446626503842190 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/LanguagePreference.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/LanguagePreference.kt @@ -5,7 +5,7 @@ import android.content.Context import android.util.AttributeSet import androidx.core.content.res.TypedArrayUtils import androidx.preference.ListPreference -import com.fsck.k9.ui.R +import com.fsck.k9.core.R class LanguagePreference @JvmOverloads diff --git a/app/ui/legacy/src/main/res/drawable/drawer_account_fallback.xml b/app/ui/legacy/src/main/res/drawable/drawer_account_fallback.xml new file mode 100644 index 0000000000000000000000000000000000000000..a3b91800c4044beb0100447ddf70caa2cf672790 --- /dev/null +++ b/app/ui/legacy/src/main/res/drawable/drawer_account_fallback.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/ui/legacy/src/main/res/drawable/ic_launcher_monochrome.xml b/app/ui/legacy/src/main/res/drawable/ic_launcher_monochrome.xml new file mode 100644 index 0000000000000000000000000000000000000000..7ff75784ea4b1ebc859455c8749a9b928d31f6dc --- /dev/null +++ b/app/ui/legacy/src/main/res/drawable/ic_launcher_monochrome.xml @@ -0,0 +1,70 @@ + + + + + + + + + + diff --git a/app/ui/legacy/src/main/res/drawable/message_list_item_footer_background.xml b/app/ui/legacy/src/main/res/drawable/message_list_item_footer_background.xml deleted file mode 100644 index 6606c0bb5f17093c2be07925b5e9161089b5d6d6..0000000000000000000000000000000000000000 --- a/app/ui/legacy/src/main/res/drawable/message_list_item_footer_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - diff --git a/app/ui/legacy/src/main/res/layout/message_list_fragment.xml b/app/ui/legacy/src/main/res/layout/message_list_fragment.xml index 8e7d0dd727c1153af540c96744d7296af10ea123..e5d9f7e7392fe62851058c7a56e3737353551d17 100644 --- a/app/ui/legacy/src/main/res/layout/message_list_fragment.xml +++ b/app/ui/legacy/src/main/res/layout/message_list_fragment.xml @@ -1,19 +1,24 @@ - - diff --git a/app/ui/legacy/src/main/res/layout/message_list_item_footer.xml b/app/ui/legacy/src/main/res/layout/message_list_item_footer.xml index bb118bf7804afd7cc934e9fa8edb9f6b074531e5..e0a2a76f5d001542b5d79140bb44fa581cdf28a0 100644 --- a/app/ui/legacy/src/main/res/layout/message_list_item_footer.xml +++ b/app/ui/legacy/src/main/res/layout/message_list_item_footer.xml @@ -4,7 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight" - android:background="@drawable/message_list_item_footer_background" + android:background="@color/color_default_background" + android:foreground="?attr/selectableItemBackground" android:gravity="center" android:orientation="horizontal"> /changelog.xml. --> + + Fixed the message list background color in the dark theme + Fixed a small display issue where "Load up to X more" could have been displayed when it shouldn't have been + Updated translations + + + Added a monochromatic app icon for Android 13 + Changed the UI component used for the message list; now changes to the list will be animated + Removed the volume key navigation for list views because it doesn't play nice with the above change + Fixed a bug that lead to the search input field being focused on app start on some devices + Restored the previous behavior of "show next message after delete" + A lot of internal changes and some minor performance improvements + Fixed a bug that could lead to a crash when opening the message list diff --git a/app/ui/legacy/src/main/res/values-ar/strings.xml b/app/ui/legacy/src/main/res/values-ar/strings.xml index 13ac633234c621edb07addbae6a15282a250aefe..7048a855b1a532eceef4bd2af85c03840630e07b 100644 --- a/app/ui/legacy/src/main/res/values-ar/strings.xml +++ b/app/ui/legacy/src/main/res/values-ar/strings.xml @@ -547,8 +547,6 @@ 1000 مجلد الحركة التصفح عبر أزرار التحكم في الصوت - - غير المقروءة - كل الرسائل البريد الوارد الموحَّد كل الرسائل في مجلدات موحَّدة التوحيد diff --git a/app/ui/legacy/src/main/res/values-be/strings.xml b/app/ui/legacy/src/main/res/values-be/strings.xml index 9f2082bef171c4f1b3bbb8a25de58ecc47fec9b3..9aaa9d41442b0e6d3950ad3bb22a50f20f6812db 100644 --- a/app/ui/legacy/src/main/res/values-be/strings.xml +++ b/app/ui/legacy/src/main/res/values-be/strings.xml @@ -605,9 +605,6 @@ 1000 каталогаў Анімацыя Анімацыя інтэрфейсу - Навігацыя клавішамі гучнасці - У лісце - У спісе Агульная скрыня ўваходных лістоў для ўсіх акаўнтаў Усе атрыманыя Усе лісты са ўсіх каталогаў diff --git a/app/ui/legacy/src/main/res/values-bg/strings.xml b/app/ui/legacy/src/main/res/values-bg/strings.xml index 288c25d96dcee58b72299df3fd742427828836e8..768846e2e8323ed1849b829ac82fcd618e20c622 100644 --- a/app/ui/legacy/src/main/res/values-bg/strings.xml +++ b/app/ui/legacy/src/main/res/values-bg/strings.xml @@ -601,9 +601,6 @@ 1000 папки Анимация Изплозване на ярки виулани ефекти - Навигация с клавиш за звука - В преглед на съобщението - В списъка със съобщения Покажи унифицирана папка Входящи Обща входяща кутия Всички съобщения в общата входяща кутия diff --git a/app/ui/legacy/src/main/res/values-br/strings.xml b/app/ui/legacy/src/main/res/values-br/strings.xml index 58f4f51c7db6dfe3f8b17f0dcbac6a9e547a09dd..02d40db15a0225db958978b15dabe7535283c3d6 100644 --- a/app/ui/legacy/src/main/res/values-br/strings.xml +++ b/app/ui/legacy/src/main/res/values-br/strings.xml @@ -581,9 +581,6 @@ 1000 teuliad Bliverezh Ober gant efedoù gwel gaudy - Merdeiñ dre afelloù an ampled - Er gwel kemennadenn - Er gwel roll Boest degemer unanet Holl gemennadennoù an teuliadoù unanet Unanañ diff --git a/app/ui/legacy/src/main/res/values-ca/strings.xml b/app/ui/legacy/src/main/res/values-ca/strings.xml index 5f9ae6ad8a1559dcb7487c256d89638dcebb1a01..40444f4b469b6c2b5e87966b82b022720a51ad5a 100644 --- a/app/ui/legacy/src/main/res/values-ca/strings.xml +++ b/app/ui/legacy/src/main/res/values-ca/strings.xml @@ -654,9 +654,6 @@ 1000 carpetes Animació Utilitza efectes visuals cridaners - Navegació amb botons de volum - Vista del missatge - A la vista de llistes Mostra la safata d\'entrada unificada Bústia unificada Tots els missatges en carpetes unificades diff --git a/app/ui/legacy/src/main/res/values-cs/strings.xml b/app/ui/legacy/src/main/res/values-cs/strings.xml index 4db2e74bc21a49b602bd756d08b3e30ad567dff9..4381f4ddf44cd625eb0ea88fd1e75c5c5140022b 100644 --- a/app/ui/legacy/src/main/res/values-cs/strings.xml +++ b/app/ui/legacy/src/main/res/values-cs/strings.xml @@ -71,7 +71,7 @@ Odeslat… Přesměrovat… Hotovo - Zrušit + Zahodit Uložit jako koncept Zkontrolovat poštu Odeslat zprávy @@ -662,9 +662,6 @@ 1000 složek Animace Používat okázalé vizuální efekty - Navigace tlačítky hlasitosti - Zobrazení zpráv - Různá zobrazení seznamů Ukázat sjednocený pohled na doručenou poštu Zobrazit počet označených hvězdičkou Integrovaná doručená pošta diff --git a/app/ui/legacy/src/main/res/values-cy/strings.xml b/app/ui/legacy/src/main/res/values-cy/strings.xml index f864081190b9bf9036431d0265f3038e17949cfa..cd062d9f37f4984a81f9f7bd7b79ef841801e680 100644 --- a/app/ui/legacy/src/main/res/values-cy/strings.xml +++ b/app/ui/legacy/src/main/res/values-cy/strings.xml @@ -655,9 +655,6 @@ 1000 o ffolderi Animeiddiad Defnyddio effeithiau gweledol dros ben llestri - Pori gyda\'r botymau sain - Wrth edrych ar neges - Wrth edrych ar restr Dangos mewnflwch unedig Mewnflwch Unedig Holl negeseuon pob cyfrif mewn un ffolder unedig diff --git a/app/ui/legacy/src/main/res/values-da/strings.xml b/app/ui/legacy/src/main/res/values-da/strings.xml index 2083a127fa20332a3f8fa3a99146fa21eeaa0aee..8fc95e1ef30237dd04da9a4a1234ce0967210dc1 100644 --- a/app/ui/legacy/src/main/res/values-da/strings.xml +++ b/app/ui/legacy/src/main/res/values-da/strings.xml @@ -630,9 +630,6 @@ 1000 mapper Animation Anvend visuelle effekter - Volume-knap navigation - Mail-visning - Diverse listevisninger Vis Fælles Indbakke Fælles indbakke Alle mails i fælles mapper diff --git a/app/ui/legacy/src/main/res/values-de/strings.xml b/app/ui/legacy/src/main/res/values-de/strings.xml index 0a7fb5f0e3f5627813a9f8fd2abdb279095a6f75..e805537d547ac4c654be5bb87faee10c48ceaaec 100644 --- a/app/ui/legacy/src/main/res/values-de/strings.xml +++ b/app/ui/legacy/src/main/res/values-de/strings.xml @@ -679,8 +679,6 @@ Bitte senden Sie Fehlerberichte, Ideen für neue Funktionen und stellen Sie Frag Animationen Aufwendige visuelle Effekte benutzen Lauter/Leiser-Navigation - Nachrichtenansicht - Diverse Listenansichten Gemeinsamen Posteingang anzeigen Anzahl der Sterne anzeigen Gemeinsamer Posteingang diff --git a/app/ui/legacy/src/main/res/values-el/strings.xml b/app/ui/legacy/src/main/res/values-el/strings.xml index 3064cc558954f7a4b1321a95176451d971714474..c630a892c50a443331245164fcb8ad3df26d269b 100644 --- a/app/ui/legacy/src/main/res/values-el/strings.xml +++ b/app/ui/legacy/src/main/res/values-el/strings.xml @@ -9,10 +9,12 @@ The Mail Dog Walkers Πηγαίος κώδικας - Άδεια χρήσης Apache, έκδοση 2.0. - Έργο Ανοιχτού Κώδικα + Άδεια χρήσης Apache, έκδοση 2.0 + Έργο ανοικτού κώδικα Ιστότοπος - Χώρος συζητήσεων χρηστών + Οδηγός χρήστη + Λήψη βοήθειας + Φόρουμ χρηστών Fediverse Twitter Βιβλιοθήκες @@ -46,12 +48,14 @@ Προώθηση ως συνημμένο Επιλογή Λογαριασμού Επιλογή φακέλου + Μετακίνηση σε… + Αντιγραφή σε… %d επιλέχθηκαν Επόμενο Προηγούμενο OK - Άκυρο + Ακύρωση Αποστολή Το θέμα είναι κενό, πατήστε επανάληψη για αποστολή Απάντηση @@ -78,17 +82,19 @@ Αναζήτηση Αναζήτηση παντού Αποτελέσματα αναζήτησης + Νέα μηνύματα Ρυθμίσεις Διαχείριση φακέλων Ρυθμίσεις λογαριασμού Διαγραφή λογαριασμού Σήμανση ως αναγνωσμένου - Διανομή + Κοινοποίηση Επιλογή αποστολέα Προσθήκη αστεριού Αφαίρεση αστεριού Αντιγραφή - Προβολή επικεφαλίδων + Κατάργηση συνδρομής + Προβολή κεφαλίδων Η διεύθυνση αντιγράφηκε στο πρόχειρο Οι διευθύνσεις αντιγράφηκαν στο πρόχειρο @@ -101,19 +107,19 @@ Θα ζητηθεί απόδειξη ανάγνωσης Δε θα ζητηθεί αποδεικτικό ανάγνωσης Προσθήκη συνημμένου - Άδειασμα σκουπιδιών + Άδειασμα απορριμμάτων Εξάλειψη - Περί + Πληροφορίες Ρυθμίσεις (Χωρίς θέμα) Χωρίς αποστολέα Φόρτωση μηνυμάτων\u2026 Σφάλμα σύνδεσης - Δε βρέθηκε το μήνυμα - Σφάλμα φόρτωση μηνύματος - Φόρτωση - έως %d περισσότερων + Δεν βρέθηκε το μήνυμα + Σφάλμα φόρτωσης μηνύματος + Φόρτωση έως + %d περισσότερων %.1f GB %.1f MB %.1f kB @@ -126,19 +132,22 @@ %1$d μη αναγνωσμένα (%2$s) + %1$d περισσότερα για %2$s Απάντηση - Ανάγνωση - Σήμανση όλων των αναγνωσμένων + Σήμανση ως αναγνωσμένο + Σήμανση όλων ως αναγνωσμένων Διαγραφή Διαγραφή όλων - Αρχειοθήκη + Αρχειοθέτηση Αρχειοθέτηση όλων Ανεπιθύμητα + Σφάλμα πιστοποιητικού Σφάλμα πιστοποιητικού για %s - Ελέγξτε τις ρυθμίσεις του εξυπηρετητή + Ελέγξτε τις ρυθμίσεις του διακομιστή σας Αποτυχία πιστοποίησης Αποτυχία πιστοποίησης %s. Ενημερώστε τις ρυθμίσεις του εξυπηρετητή σας. + Σφάλμα ειδοποίησης + Σφάλμα στην προσπάθεια δημιουργίας ειδοποίησης συστήματος για νέο μήνυμα. Η ατία είναι μάλλον λείπει ο ήχος της ειδοπίησης.\n\nΠατήστε για να ανοίξετε τις ρυθμίσεων των ειδοποιήσεων. Έλεγχος μηνύματος: %1$s:%2$s Έλεγχος μηνύματος Αποστολή μηνύματος: %s @@ -161,6 +170,9 @@ Καταγραφή πρόσθετων διαγνωστικών πληροφοριών Καταγραφή ευαίσθητων πληροφοριών Συνθηματικά μπορεί να εμφανιστούν στις καταγραφές. + Καταγραφές εξαγωγών + Επιτυχής εξαγωγή. Οι καταγραφές ίσως περιέχουν ευαίσθητες πληροφορίες. Προσέχετε σε ποιον/ποια τις στέλνετε. + Αποτυχία εξαγωγής Φόρτωση περισσότερων μηνυμάτων Προς:%s Θέμα @@ -172,11 +184,11 @@ Από: Προς: Κοιν: - %s έγραψε: + Ο/Η %s έγραψε: Στις %1$s, ο/η %2$s έγραψε: - Πρέπει να συμπεριλάβετε τουλάχιστον έναν παραλήπτη. + Πρέπει να προσθέσετε τουλάχιστον έναν παραλήπτη. Το πεδίο παραλήπτη περιέχει ελλιπή στοιχεία! - Δε βρέθηκαν διευθύνσεις ηλεκτρονικού ταχυδρομείου. + Δεν βρέθηκαν διευθύνσεις ηλεκτρονικού ταχυδρομείου. Μερικά συνημμένα δεν μπορούν να προωθηθούν γιατί δεν έχουν ληφθεί. Το μήνυμα δεν μπορεί να προωθηθεί επειδή μερικά συνημμένα δεν έχουν ληφθεί. Συμπερίληψη του παραθετιμένου μηνύματος @@ -186,20 +198,20 @@ Από: %1$s <%2$s> Προς: Κοιν: - Κρυφή Κοιν: + Κρυφή κοιν: Αδυναμία αποθήκευσης συνημμένου. - Προβολή εικόνων + Εμφάνιση εικόνων Δεν υπάρχει πρόγραμμα προβολής για %s. Λήψη πλήρους μηνύματος μέσω %1$s Από τον ίδιο αποστολέα Από %s - Το μήνυμα αγνοήθηκε. - Το μήνυμα αποθηκεύτηκε στα πρόχειρα. - Προβολή αστεριών + Το μήνυμα απορρίφθηκε + Το μήνυμα αποθηκεύτηκε ως πρόχειρο + Εμφάνιση αστεριών Τα αστέρια υποδηλώνουν σημαντικά μηνύματα - Προεπισκόπηση μηνυμάτων + Γραμμές προεπισκόπησης Εμφάνιση ονομάτων επιστολογράφων Εμφάνιση των ονομάτων των επιστολογράφων αντί των διευθύνσεων ηλεκτρονικού ταχυδρομείου Αποστολέας πάνω από το θέμα @@ -208,14 +220,15 @@ Χρήση ονομάτων επιστολογράφων από Επαφές όταν είναι διαθέσιμο Χρωματισμός Επαφών Να χρωματίζονται τα ονόματα στη λίστα επαφών + Χρώμα ονόματος επαφής Γραμματοσειρά σταθερού πλάτους Να χρησιμοποιείται γραμματοσειρά σταθερού πλάτους όταν προβάλλονται μηνύματα απλού κειμένου Αυτόματη προσαρμογή Ρύθμιση μεγέθους μηνύματος για να χωρά στην οθόνη Επιστροφή στη λίστα Επιστροφή στη λίστα μηνυμάτων μετά τη διαγραφή ενός μηνύματος - Προβολή επόμενου - Προβολή επόμενου μηνύματος μετά τη διαγραφή ενός μηνύματος + Εμφάνιση επόμενου μηνύματος μετά τη διαγραφή + Εμφάνιση επόμενου μηνύματος μετά τη διαγραφή ενός μηνύματος Επιβεβαίωση ενεργειών Προβολή διαλόγου όποτε εκτελούνται επιλεγμένες ενέργειες Διαγραφή @@ -231,14 +244,14 @@ Εμφάνιση κουμπιού «Διαγραφή» Ποτέ Για ειδοποίηση ενός μηνύματος - Πάντοτε + Πάντα Ειδοποιήσεις οθόνης κλειδώματος Χωρίς ειδοποιήσεις οθόνης κλειδώματος Όνομα εφαρμογής - Αριθμός μη αναγνωσμένων μηνυμάτων + Αριθμός νέων μηνυμάτων Αριθμός μηνυμάτων και αποστολείς Ομοίως με τότε που η οθόνη είναι ξεκλείδωτη - Ώρες Ησυχίας + Ώρες ησυχίας Απενεργοποιηση κουδουνίσματος, βουητού και αναβοσβησίματος τη νύχτα Απενεργοποίηση ειδοποιήσεων Πλήρης απενεργοποίηση ειδοποιήσεων για όσο διαρκούν οι Ώρες Ησυχίας @@ -247,8 +260,11 @@ Ρύθμιση νέου λογαριασμού Διεύθυνση ηλ. ταχυδρομείου Συνθηματικό + Αν θέλετε να χρησιμοποιήσετε αυτόν τον λογαριασμό ηλεκτρονικού ταχυδρομείου με το K-9 Mail πρέπει να συνδεθείτε και να παραχωρήσετε στην εφαρμογή πρόσβαση στα ηλεκτρονικά μηνύματά σας. + Σύνδεση + Σύνδεση μέσω Google Για να δείτε τον κωδικό σας εδώ, ενεργοποιήστε το κλείδωμα οθόνης σε αυτή την συσκευή. Επαλήθευση ταυτότητας @@ -272,6 +288,7 @@ Συνθηματικό, μεταβιβασμένο χωρίς ασφάλεια Κρυπτογραφημένο συνθηματικό Πιστοποιητικό πελάτη + OAuth 2.0 Ρυθμίσεις εισερχόμενης αλληλογραφίας Όνομα χρήστη Συνθηματικό @@ -290,6 +307,7 @@ Να μη διαγράφεται στον εξυπηρετητή Να διαγράφεται άμεσα από τον εξυπηρετητή Επισήμανση ως αναγνωσμένο στον εξυπηρετητή + Χρήση συμπίεσης Εξάλειψη διαγραμμένων μηνυμάτων Αμέσως Κατά την ενημέρωση @@ -354,6 +372,9 @@ Το όνομα χρήστη ή ο κωδικός πρόσβασης δεν είναι σωστά.\n(%s) Ο εξυπηρετητής παρουσίασε ένα μη εγκυρο πιστοποιητικό SSL. Κάποιες φορές αυτό συμβαίνει λόγω κακής ρύθμισής του. Άλλες φορές γιατί κάποιος προσπαθεί να επιτεθεί σε εσάς ή τον εξυπηρετητή ταχυδρομείου σας. Αν δεν είστε βέβαιοι τι συμβαίνει, επιλέξτε Απόρριψη και επικοινωνήστε με τους διαχειριστές του εξυπηρετητή ταχυδρομείου σας.\n\n(%s) Αδύνατη η σύνδεση στον εξυπηρετητή.\n(%s) + Η εξακρίβωση ακυρώθηκε + Η εξακρίβωση απέτυχε με το εξής σφάλμα: %s + Το πρωτόκολο OAuth 2.0 αυτή τη στιγμή δεν υποστηρίζεται από τον συγκεκριμένο πάροχο. Διόρθωση λεπτομερειών Συνέχεια Προχωρημένα @@ -505,17 +526,24 @@ Όνομα λογαριασμού Το όνομά σου Ειδοποιήσεις + Δόνηση Δόνηση - Τρόπος δόνησης + Μοτίβο δόνησης Εξ ορισμού - Τύπος 1 - Τύπος 2 - Τύπος 3 - Τύπος 4 - Τύπος 5 + Μοτίβο 1 + Μοτίβο 2 + Μοτίβο 3 + Μοτίβο 4 + Μοτίβο 5 Επανάληψη δόνησης Κουδούνισμα με νέο μήνυμα Χρώμα λογαριασμού + Προεπιλεγμένο χρώμα συστήματος + Λευκό + Κόκκινο + Πράσινο + Μπλε + Κίτρινο Επιλογές σύνθεσης μηνύματος Εξ ορισμού σύνθεση Ορισμός εξ ορισμού Αποστολέα, Ιδιωτικής κοινοποίησης και υπογραφής @@ -622,9 +650,6 @@ 1000 φάκελοι Κινούμενα σχέδια Χρήση οπτικών εφέ gaudy - Πλοήγηση με πλήκτρο έντασης - Προβολή μηνύματος - Διάφορες προβολές λίστας Εμφάνιση Ενιαία Εισερχόμενα Ενιαία Εισερχόμενα Όλα τα μηνύματα στους ενοποιημένους φακέλους @@ -724,6 +749,7 @@ Η εισαγωγή ολοκληρώθηκε με επιτυχία Απαιτείται κωδικός πρόσβασης + Απαιτείται σύνδεση Δεν έχει εισαχθεί Αποτυχία εισαγωγής Αργότερα @@ -830,6 +856,7 @@ Κρυφή Κοιν: Προς Από: + Απάντηση σε <Άγνωστος Παραλήπτης> <Άγνωστος Αποστολέας> Οικία diff --git a/app/ui/legacy/src/main/res/values-eo/strings.xml b/app/ui/legacy/src/main/res/values-eo/strings.xml index 75ac3c9ef14682c137d82a51942f756c7b56eb2e..b657f41332e19b96099f553bca224ddc26b8a47f 100644 --- a/app/ui/legacy/src/main/res/values-eo/strings.xml +++ b/app/ui/legacy/src/main/res/values-eo/strings.xml @@ -619,9 +619,6 @@ Maksimume 1000 mesaĝujoj Movbildoj Uzas afablajn vidajn efektojn - Navigado per sonfortecaj butonoj - En vido de mesaĝoj - En vidoj de listoj Montri unuigitan ricevujon Montri nombron da steletoj Unuigita ricevujo diff --git a/app/ui/legacy/src/main/res/values-es/strings.xml b/app/ui/legacy/src/main/res/values-es/strings.xml index 46aaea9afe641d6b90da19c078bb860cf1957324..a36fd29266b78b0e51bb111d5679d9ef4baf6980 100644 --- a/app/ui/legacy/src/main/res/values-es/strings.xml +++ b/app/ui/legacy/src/main/res/values-es/strings.xml @@ -649,9 +649,7 @@ 1000 carpetas Animaciones Utilizar animaciones - Navegación con teclas de volumen - Vista de mensaje - Listas de mensajes + Navegar con las teclas de volumen al leer el correo Mostrar bandeja de entrada unificada Entrada unificada Todos los mensajes en la Entrada unificada diff --git a/app/ui/legacy/src/main/res/values-et/strings.xml b/app/ui/legacy/src/main/res/values-et/strings.xml index 08d94957b90c1bc153b0f07c5e5d0b719bd5c6f0..719a11c94a15ac16ee02ebe230204552695e14db 100644 --- a/app/ui/legacy/src/main/res/values-et/strings.xml +++ b/app/ui/legacy/src/main/res/values-et/strings.xml @@ -645,8 +645,8 @@ Animatsioon Kasuta erinevaid visuaalseid efekte Helitugevuse nupuga liikumine - Sõnumite vaadetes - Nimekirja vaadetes + Näita koondsisendkausta + Näita tärniga tähistatud kirjade arvu Koondsisendkaust Kõik sõnumid koondkaustades Koonda diff --git a/app/ui/legacy/src/main/res/values-eu/strings.xml b/app/ui/legacy/src/main/res/values-eu/strings.xml index bffdcb77c03d59a1de689a4739ae12dc9b01c850..e9c4f8248bf9cc8d2a9ce27afcde4944a9544bfd 100644 --- a/app/ui/legacy/src/main/res/values-eu/strings.xml +++ b/app/ui/legacy/src/main/res/values-eu/strings.xml @@ -657,9 +657,6 @@ 1000 karpeta Animazioak Erabili bistaratze efektu nabarmenak - Bolumen teklekin nabigatu - Mezu barruko ikuspegiak - Zerrenda barruko ikuspegiak Erakutsi Sarrera Ontzi Bateratua Erakutsi kontu izardunak Sarrerako ontzi bateratua diff --git a/app/ui/legacy/src/main/res/values-fa/strings.xml b/app/ui/legacy/src/main/res/values-fa/strings.xml index 9a906f4c3085b5d7c74a9f9663738b960689898e..773b457c5c8f89fa62c84ab1f9ce09119d2b039e 100644 --- a/app/ui/legacy/src/main/res/values-fa/strings.xml +++ b/app/ui/legacy/src/main/res/values-fa/strings.xml @@ -647,8 +647,8 @@ پویانمایی استفاده از جلوه‌های پُرزرق‌وبرق جابه‌جایی با کلیدهای تنظیم صدا - در نماهای پیام - در نماهای لیستی + نمایش صندوق یکپارچه + نمایش تعداد ستاره‌دارها صندوق ورودی یکپارچه همهٔ پیام‌های صندوق ورودی یکپارچه یکپارچگی diff --git a/app/ui/legacy/src/main/res/values-fi/strings.xml b/app/ui/legacy/src/main/res/values-fi/strings.xml index 900ea5b2506d1488377ab51fc3501010ffba2f40..e063c2c63bcbb55fff5b60d06e47a3f73d1e80cc 100644 --- a/app/ui/legacy/src/main/res/values-fi/strings.xml +++ b/app/ui/legacy/src/main/res/values-fi/strings.xml @@ -681,9 +681,7 @@ Ilmoita virheistä, ota osaa sovelluskehitykseen ja esitä kysymyksiä osoittees 1000 kansiota Animaatio Käytä koreita visuaalisia tehosteita - Navigointi äänenvoimakkuusnäppäimillä - Viestinäkymä - Erilaisia listanäkymiä + Liikkuminen äänipainikkeilla viestinäkymässä Näytä \"Yhdistetty saapuneet\" Näytä tähdellä merkittyjen viestien määrä Yhdistetty saapuneet diff --git a/app/ui/legacy/src/main/res/values-fr/strings.xml b/app/ui/legacy/src/main/res/values-fr/strings.xml index b3d85e0d444f5b5eb961b18c95286a5b3156b4ba..34dbb96a670b40055c5ae66ada722870e4fd9c05 100644 --- a/app/ui/legacy/src/main/res/values-fr/strings.xml +++ b/app/ui/legacy/src/main/res/values-fr/strings.xml @@ -657,9 +657,6 @@ jusqu’à %d de plus 1 000 dossiers Animation Utiliser des effets visuels voyants - Navigation à l’aide de la touche de volume - Dans les vues des courriels - Dans les vues en liste Afficher la boîte de réception unifiée Boîte de réception unifiée Tous les courriels dans les dossiers unifiés diff --git a/app/ui/legacy/src/main/res/values-fy/strings.xml b/app/ui/legacy/src/main/res/values-fy/strings.xml index b28849f4ec5d9172f2e352457ff68b89975f8c52..250163e32502a12a5ed420fd03baebc764daa29e 100644 --- a/app/ui/legacy/src/main/res/values-fy/strings.xml +++ b/app/ui/legacy/src/main/res/values-fy/strings.xml @@ -677,9 +677,7 @@ Graach flaterrapporten stjoere, bydragen foar nije funksjes en fragen stelle op 1000 mappen Animaasje Opsichtige fisuele effekten brûke - Folumetoetsnavigaasje - Berjochtbyld - Fariabele listwerjefte + Folumetoetsnavigaasje yn berjochtbyld Kombinearre Postfek Yn werjaan It oantal berjochten mei in stjer werjaan Kombinearre Postfek Yn diff --git a/app/ui/legacy/src/main/res/values-gd/strings.xml b/app/ui/legacy/src/main/res/values-gd/strings.xml index 1b3c63b25dab1daa9104329c061900f34e0ec2b3..8edda28a2c84d4fde7d8f079a97944756df566d9 100644 --- a/app/ui/legacy/src/main/res/values-gd/strings.xml +++ b/app/ui/legacy/src/main/res/values-gd/strings.xml @@ -617,9 +617,6 @@ 1,000 pasgan Beòthachadh Cleachd èifeachdan lèirsinneach leòmach - Seòladaireachd le putanan àirde na fuaime - Ann an seallaidhean theachdaireachdan - Ann an seallaidhean liostaichean Seall an t-oll-bhogsa An t-oll-bhogsa Na h-uile teachdaireachd ann am pasganan co-aonaichte diff --git a/app/ui/legacy/src/main/res/values-gl-rES/strings.xml b/app/ui/legacy/src/main/res/values-gl-rES/strings.xml index 17cf504789792c8119824f024768275f3a7e89b0..e331bad4d1df4ede7e2679e7173fbcfa77c59d3d 100644 --- a/app/ui/legacy/src/main/res/values-gl-rES/strings.xml +++ b/app/ui/legacy/src/main/res/values-gl-rES/strings.xml @@ -504,9 +504,6 @@ 1000 cartafoles Animación Utilizar animacións - Navegación coas teclas de volume - Na vista de mensaxes - Nas listaxes Caixa de entrada unificada Todas as mensaxes en cartafoles unificados Unificar diff --git a/app/ui/legacy/src/main/res/values-gl/strings.xml b/app/ui/legacy/src/main/res/values-gl/strings.xml index e0c24ed3efca965b3017212f508badafc5841bdc..fefd8abf30474bce3ba1ee517b2573c04bc048f7 100644 --- a/app/ui/legacy/src/main/res/values-gl/strings.xml +++ b/app/ui/legacy/src/main/res/values-gl/strings.xml @@ -604,8 +604,8 @@ Animacións Usar animacións Navegación con teclas de volume - Vista de mensaxe - Listas de mensaxes + Amosar a caixa de entrada unificada + Amosar o reconto das estrelas Entrada unificada Mensajes na Entrada unificada Unificar diff --git a/app/ui/legacy/src/main/res/values-hr/strings.xml b/app/ui/legacy/src/main/res/values-hr/strings.xml index 6b067ea6acafc18fa6d165ec6870577f47646a37..315d9a6272edb3fb9d8a20ec39e1c96f6a581ae3 100644 --- a/app/ui/legacy/src/main/res/values-hr/strings.xml +++ b/app/ui/legacy/src/main/res/values-hr/strings.xml @@ -600,9 +600,6 @@ 1000 mapa Animacija Koristi šarolike vizualne efekte - Navigacija tipkama glasnoće - U pregledu poruka - U pregledu popisa Objedinjena Dolazna Pošta Sve poruke u objedinjenim mapama Objedini diff --git a/app/ui/legacy/src/main/res/values-hu/strings.xml b/app/ui/legacy/src/main/res/values-hu/strings.xml index ff9c7eeac4f536f22577e469bdead3d383d6bdf3..87c2dfda4dde05cdbab69a384b4bc4f1f647dd69 100644 --- a/app/ui/legacy/src/main/res/values-hu/strings.xml +++ b/app/ui/legacy/src/main/res/values-hu/strings.xml @@ -654,9 +654,8 @@ Animációk Rikító látható hatások használata Hangerő gomb navigáció - Üzenetnézetekben - Listanézetekben - Egységesített Beérkezett üzenetek mutatása + Egységes beérkezett üzenetek megjelenítése + Csillagszámláló megjelenítése Egységes beérkezett üzenetek Az összes üzenet egységes mappákban Egyesítés diff --git a/app/ui/legacy/src/main/res/values-in/strings.xml b/app/ui/legacy/src/main/res/values-in/strings.xml index 0d5fbfda9becd8699268a0609295c12ea7ec0cf9..54c414fa5656baf3f6ebf7d1770919d788a6efee 100644 --- a/app/ui/legacy/src/main/res/values-in/strings.xml +++ b/app/ui/legacy/src/main/res/values-in/strings.xml @@ -607,9 +607,6 @@ 1000 folder Animasi Gunakan efek visual mencolok - Navigasi tombol volume - Dalam tampilan pesan - Dalam tampilan daftar Tampilkan Kotak Masuk Terpadu Inbox terpadu Semua pesan dalam folder terpadu diff --git a/app/ui/legacy/src/main/res/values-is/strings.xml b/app/ui/legacy/src/main/res/values-is/strings.xml index ce666398ebe31f7482f67717bc8f73cdfe26d4ad..8b84e327ddfda6b05b5d8f06c898f3c0cb2f14b0 100644 --- a/app/ui/legacy/src/main/res/values-is/strings.xml +++ b/app/ui/legacy/src/main/res/values-is/strings.xml @@ -619,9 +619,6 @@ 1000 möppur Hreyfingar Nota skrautlegar sjónbrellur - Flakk með hljóðstyrkshnöppum - Í skilaboðasýnum - Í listasýnum Birta sameinað innhólf Birta fjölda stjarna Sameinað innhólf diff --git a/app/ui/legacy/src/main/res/values-it/strings.xml b/app/ui/legacy/src/main/res/values-it/strings.xml index 76f43cd5ca93e5dd3951689e2690465fadaac3a9..279a822c53c5ab6d7e891eed3e040d3c5bf3ff63 100644 --- a/app/ui/legacy/src/main/res/values-it/strings.xml +++ b/app/ui/legacy/src/main/res/values-it/strings.xml @@ -677,8 +677,6 @@ Invia segnalazioni di bug, contribuisci con nuove funzionalità e poni domande s Animazione Utilizza effetti visivi vistosi Navigazione con tasti volume - In visualizzazione messaggi - In visualizzazione elenco Mostra tutta la posta in arrivo Mostra il numero dei messaggi con stella Tutta la Posta in arrivo @@ -1018,7 +1016,6 @@ Invia segnalazioni di bug, contribuisci con nuove funzionalità e poni domande s Messaggio di configurazione di Autocrypt Questo messaggio contiene tutte le informazioni per trasferire in modo sicuro le tue impostazioni di Autocrypt insieme alla tua chiave segreta dal tuo dispositivo originale. Per configurare il tuo nuovo dispositivo per Autocrypt, segui le istruzioni che dovrebbero essere presentate dal nuovo dispositivo. - Puoi conservare questo messaggio e utilizza come una copia di sicurezza della tua chiave segreta. Se intendi farlo, dovresti annotare la password e conservarla in modo sicuro. Si è verificato un errore durante l\'invio del messaggio. Controlla la tua connessione di rete e la configurazione del server di uscita. diff --git a/app/ui/legacy/src/main/res/values-iw/strings.xml b/app/ui/legacy/src/main/res/values-iw/strings.xml index 3536d10463b83727576134a5abc7822661c5b388..ec98662a72c38797bdd1173cf7d481dbb61f6f9a 100644 --- a/app/ui/legacy/src/main/res/values-iw/strings.xml +++ b/app/ui/legacy/src/main/res/values-iw/strings.xml @@ -498,9 +498,6 @@ 1000 תיקיות אנימציה השתמש באפקטים חזותיים ססגונים - נייוט באמצעות מקשי הווליום - הצגת הודעה - רשימת תצוגות שונות תיבת דואר נכנס אחידה כל ההודעות בתיקיות המאוחדות לאחד diff --git a/app/ui/legacy/src/main/res/values-ja/strings.xml b/app/ui/legacy/src/main/res/values-ja/strings.xml index 76a90311002b449b22a23786fab127e4493e3525..39c6fc4abc98a638355fb2478112584dfcb98ef7 100644 --- a/app/ui/legacy/src/main/res/values-ja/strings.xml +++ b/app/ui/legacy/src/main/res/values-ja/strings.xml @@ -655,9 +655,7 @@ 1000 フォルダ アニメーション 派手な視覚効果を使用する - ボリュームキー操作 - メッセージ表示 - 一覧表示 + メッセージビューでの音量キー操作 統合フォルダを表示 フラグの数を表示する 統合フォルダ diff --git a/app/ui/legacy/src/main/res/values-ko/strings.xml b/app/ui/legacy/src/main/res/values-ko/strings.xml index 582512ad63d3c60ada5b05f6a0d28e7af95045d5..b4d99375ddc9d49b04ce87dbbdcacc9983821a8c 100644 --- a/app/ui/legacy/src/main/res/values-ko/strings.xml +++ b/app/ui/legacy/src/main/res/values-ko/strings.xml @@ -539,9 +539,6 @@ 1000개 폴더 애니메이션 매끄러운 시각 효과 사용 - 볼륨 키 탐색 - 메시지 뷰 - 다양한 리스트 뷰 통합 편지함 통합된 폴더의 모든 이메일 통합 diff --git a/app/ui/legacy/src/main/res/values-lt/strings.xml b/app/ui/legacy/src/main/res/values-lt/strings.xml index 4d2da79b8dffdef132154990809d42caa6840c26..a696cd7463801dc9299f8271493c89893583ca2a 100644 --- a/app/ui/legacy/src/main/res/values-lt/strings.xml +++ b/app/ui/legacy/src/main/res/values-lt/strings.xml @@ -651,9 +651,6 @@ 1000 aplankų Animacija Naudoti įmantrius vizualinius efektus - Navigacija garso klavišais - Pranešimų rodinyje - Sąrašo rodiniuose Rodyti suvestinius gautuosius Rodyti žvaigždučių skaičių Suvestiniai gautieji diff --git a/app/ui/legacy/src/main/res/values-lv/strings.xml b/app/ui/legacy/src/main/res/values-lv/strings.xml index bf06a5d8a905a422e6550a1eda672a4c667c0c07..ea9ab4952ff073fa121497761bc7511ef7af5447 100644 --- a/app/ui/legacy/src/main/res/values-lv/strings.xml +++ b/app/ui/legacy/src/main/res/values-lv/strings.xml @@ -625,9 +625,6 @@ pat %d vairāk 1000 mapes Animācija Izmantot spilgtus vizuālos efektus - Skaļuma pogas navigācija - Vēstuļu skatā - Saraksta skatā Rādīt apvienoto pastkasti Parādīt atzīmēto vēstuļu skaitu Apvienotā pastkaste diff --git a/app/ui/legacy/src/main/res/values-ml/strings.xml b/app/ui/legacy/src/main/res/values-ml/strings.xml index 22e7e1b7a673ea5b68508a58a2dfff671b537d5e..f4695bc387d05bbfb7ab8d245d27af303b16a60a 100644 --- a/app/ui/legacy/src/main/res/values-ml/strings.xml +++ b/app/ui/legacy/src/main/res/values-ml/strings.xml @@ -632,9 +632,6 @@ 1000 ഫോൾഡറുകൾ ആനിമേഷൻ ഭംഗിയുള്ള വിഷ്വൽ ഇഫക്റ്റുകൾ ഉപയോഗിക്കുക - ശബ്ദ കീ നാവിഗേഷൻ - സന്ദേശ കാഴ്‌ചകളിൽ - ലിസ്റ്റ് കാഴ്‌ചകളിൽ ഏകീകൃത ഇൻ‌ബോക്സ് കാണിക്കുക ഏകീകൃത ഇൻ‌ബോക്സ് ഏകീകൃത ഫോൾഡറുകളിലെ എല്ലാ സന്ദേശങ്ങളും diff --git a/app/ui/legacy/src/main/res/values-nb/strings.xml b/app/ui/legacy/src/main/res/values-nb/strings.xml index af7c004a0cd492570b999c53c9318efd25ab2935..d1947321d4af182ba9f36bc9216cf185e7ffcb90 100644 --- a/app/ui/legacy/src/main/res/values-nb/strings.xml +++ b/app/ui/legacy/src/main/res/values-nb/strings.xml @@ -598,9 +598,6 @@ til %d flere 1000 mapper Animering Bruk glorete visuelle effekter - Navigering med lydstyrkeknapp - I meldingsvisninger - I listevisninger Samlet innboks Alle meldinger i samlede mapper Samle diff --git a/app/ui/legacy/src/main/res/values-nl/strings.xml b/app/ui/legacy/src/main/res/values-nl/strings.xml index d074866944a696bacecf51dcc3b7dab9e1f9f833..141791b36daac082da43f5d3340b5efca1e4c8bf 100644 --- a/app/ui/legacy/src/main/res/values-nl/strings.xml +++ b/app/ui/legacy/src/main/res/values-nl/strings.xml @@ -620,8 +620,6 @@ Animatie Gebruik opzichtige visuele effecten Volume op/neer navigatie - Bericht beeld - Variabele lijst weergave Toon alle Inboxen Alle Inboxen Alle berichten in gecombineerde mappen @@ -956,7 +954,6 @@ Autocrypt Setup bericht Dit bericht bevat alle informatie om jouw Autocrypt instellingen met geheime sleutel beveiligd over te brengen vanaf jouw oorspronkelijke apparaat. Volg de instructies op uw nieuwe apparaat om daarop Autocrypt in te stellen. - U kunt dit bericht bewaren als backup voor uw geheime sleutel. Als u dit wilt doen, schrijf dan het wachtwoord op en bewaar het op een veilige plek. Er is een fout opgetreden tijdens het verzenden van het bericht. Controleer uw netwerk verbinding en uitgaande server configuratie. diff --git a/app/ui/legacy/src/main/res/values-pl/strings.xml b/app/ui/legacy/src/main/res/values-pl/strings.xml index c64e8e560345ae0f67d3c3840cdcff304d8c5329..c9a22044ce6a9d055421f5237e053a7c832a3b30 100644 --- a/app/ui/legacy/src/main/res/values-pl/strings.xml +++ b/app/ui/legacy/src/main/res/values-pl/strings.xml @@ -657,9 +657,7 @@ Do 1000 folderów Animacje Używaj efektów wizualnych - Nawigacja przyciskiem głośności - Wygląd wiadomości - Różne widoki list + Nawigacja klawiszem głośności w widoku wiadomości Pokaż zintegrowaną skrzynkę odbiorczą Pokaż liczbę oznaczonych gwiazdką Zintegrowana odbiorcza diff --git a/app/ui/legacy/src/main/res/values-pt-rBR/strings.xml b/app/ui/legacy/src/main/res/values-pt-rBR/strings.xml index 37d56b6febe6f5fb4b47e6b47e281e831c896c43..52a4f8a64e83206c0d4332137335bc2117ae2ce2 100644 --- a/app/ui/legacy/src/main/res/values-pt-rBR/strings.xml +++ b/app/ui/legacy/src/main/res/values-pt-rBR/strings.xml @@ -659,9 +659,6 @@ 1000 pastas Animação Utilizar efeitos visuais extravagantes - Navegação com os botões de volume - Nas visualizações das mensagens - Nas visualizações das listas Exibir a caixa de entrada unificada Mostrar a contagem de sinalizadas Caixa de Entrada Unificada diff --git a/app/ui/legacy/src/main/res/values-pt-rPT/strings.xml b/app/ui/legacy/src/main/res/values-pt-rPT/strings.xml index 861f2ca74c5d661c5d4538b8550dacd919f8fede..a82b5fa85ec9f10ebc042d0413069f3802e53474 100644 --- a/app/ui/legacy/src/main/res/values-pt-rPT/strings.xml +++ b/app/ui/legacy/src/main/res/values-pt-rPT/strings.xml @@ -593,9 +593,6 @@ 1000 pastas Animação Usar efeitos visuais exuberantes - Navegação com as teclas de volume - Na vista de mensagens - Nas vistas em lista Caixa de entrada unificada Todas as mensagens em pastas unificadas Unificar diff --git a/app/ui/legacy/src/main/res/values-ro/strings.xml b/app/ui/legacy/src/main/res/values-ro/strings.xml index 42f3dc9e78448b1bff0ee8d7daa53aa5f20a369b..345a52ec002e04223e2cc0cb01f708ba18ce9699 100644 --- a/app/ui/legacy/src/main/res/values-ro/strings.xml +++ b/app/ui/legacy/src/main/res/values-ro/strings.xml @@ -9,15 +9,17 @@ K-9 Dog Walkers Codul sursă - Licență Apache, Versiune 2.0 + Licență Apache, Versiunea 2.0 Proiect Open Source Website + Manualul utilizatorului + Obțineți ajutor Forum utilizatori Fediverse Twitter Biblioteci Licență - Jurnal de schimbări + Jurnal de modificări Nu s-a putut încărca jurnalul de modificări. Versiune %s Ce este nou @@ -91,6 +93,7 @@ Adaugă steluță Șterge steluță Copiază + Dezabonare Arată antete Adresa a fost copiată în clipboard @@ -144,7 +147,9 @@ cel mult încă %d Autentificarea a eșuat Authentificare eșuată pentru %s. Actualizează setările serverului. + Eroare de notificare + S-a produs o eroare în timpul încercării de a crea o notificare de sistem pentru un mesaj nou. Motivul este cel mai probabil lipsa unui sunet de notificare.\n\nApăsați pentru a deschide setările de notificare. Se verifică emailul: %1$s:%2$s Se verifică emailul Se trimite emailul: %s @@ -256,8 +261,11 @@ cel mult încă %d Configurarează un cont nou Adresa e-mail Parolă + Pentru a utiliza acest cont de e-mail cu K-9 Mail, trebuie să vă conectați și să acordați aplicației acces la e-mailurile dumneavoastră. + Conectați-vă + Conectați-vă cu Google Pentru a vă vedea parola aici, activați blocarea ecranului pe acest dispozitiv. Verifică-ți identitatea @@ -281,6 +289,7 @@ cel mult încă %d Parolă, transmisă nesecurizat Parolă criptată Certificat client + OAuth 2.0 Setări server de primire Utilizator Parolă @@ -299,6 +308,7 @@ cel mult încă %d Nu şterge de pe server Şterge de pe server Marchează ca citit pe server + Utilizați compresia Elimină mesajele şterse de pe server Imediat Când interoghează @@ -365,6 +375,10 @@ cel mult încă %d Uneori acest lucru se întâmplă din cauza unei erori de configurare pe sever. Uneori datorită faptului că cineva încearcă să te atace pe tine sau serverul tău de mail. Dacă nu ești sigur ce se întâmplă, apasă Respinge și contactează-i pe cei care iți administrează serverul de mail.\n\n(%s) Nu se poate conecta cu serverul.\n(%s) + Autorizație anulată + Autorizarea a eșuat cu următoarea eroare: %s + OAuth 2.0 nu este acceptat în prezent cu acest furnizor. + Aplicația nu a putut găsi un browser pe care să îl folosească pentru a vă acorda acces la cont. Modifică detalii Continuă Avansat @@ -648,9 +662,7 @@ Uneori datorită faptului că cineva încearcă să te atace pe tine sau serveru 1000 de dosare Animații Folosește efecte vizuale gaudi - Navigare prin butonu de volum - Vizualizări în mesaj - Vizualizări în listă + Navigarea prin butoanele de volum in afișarea tip mesaj Afișați Cutia poștală de intrare unificată Afișați numărul de stele Căsuță poștală unificată @@ -746,13 +758,16 @@ Uneori datorită faptului că cineva încearcă să te atace pe tine sau serveru Te rog introduce parolele + Vă rugăm să vă înregistrați + Vă rugăm să vă conectați și să introduceți parolele Importarea setărilor a eșuat Citirea fișierului cu setări a eșuat Importarea unor setări a eșuat Importat cu succes Parola necesară + Înregistrare necesară Nu a fost importat Eșuare la import Mai târziu @@ -977,7 +992,7 @@ Uneori datorită faptului că cineva încearcă să te atace pe tine sau serveru Eroare internă: Cont invalid! Eroare la conectarea la %s! Trimite Mesaj Setare Autocriptare - Împarte în siguranță setarea punct-la-punct cu alte dispozitive + Distribuie în siguranță setarea punct-la-punct cu alte dispozitive Mesaj Setare Autocriptare Un Mesaj Setare Autocriptare împarte în siguranță setările tale punct-la-punct cu alte dispozitive. Trimite Mesaj Setare diff --git a/app/ui/legacy/src/main/res/values-ru/strings.xml b/app/ui/legacy/src/main/res/values-ru/strings.xml index db665000d032e681e4e7ec6ac2695cfcba5f96f1..f6faa5f283b2f84a84e6f057bd565bf793fbdfcc 100644 --- a/app/ui/legacy/src/main/res/values-ru/strings.xml +++ b/app/ui/legacy/src/main/res/values-ru/strings.xml @@ -681,9 +681,6 @@ Mail — почтовый клиент для Android. 1000 папок Анимация Анимация интерфейса - Прокрутка кнопками Vol+/- - В сообщении - В списке Показывать общий ящик для входящих Cчетчик важных Входящие diff --git a/app/ui/legacy/src/main/res/values-sk/strings.xml b/app/ui/legacy/src/main/res/values-sk/strings.xml index 9e42ea5cc13d93b087d5eb2efef65e7942c94e8d..4a17078c98233fd9119a41274a8ae619803abcd3 100644 --- a/app/ui/legacy/src/main/res/values-sk/strings.xml +++ b/app/ui/legacy/src/main/res/values-sk/strings.xml @@ -604,9 +604,6 @@ 1000 priečinkov Animácie Používať krikľavý vizuálny efekt - Navigácia tlačidlami hlasitosti - V zobrazení správ - V zobrazení zoznamu Ukázať jednotnú schránku Jednotná schránka Všetky správy v zjednotených priečinkoch diff --git a/app/ui/legacy/src/main/res/values-sl/strings.xml b/app/ui/legacy/src/main/res/values-sl/strings.xml index f9a0be9b99abbe06d5fb55f8f4503cd638957585..1a2f332e7bc1d9fdfa6a0d79e6a83722ed888c8e 100644 --- a/app/ui/legacy/src/main/res/values-sl/strings.xml +++ b/app/ui/legacy/src/main/res/values-sl/strings.xml @@ -662,9 +662,6 @@ dodatnih %d sporočil 1000 map Pokaži animirane učinke vmesnika Prehodi dejanj in različni učinki delovanja vmesnika so animirani - Dovoli upravljanje programa s tipko za glasnost - V pogledu sporočil - V pogledu seznamov Pokaži skupno mapo prejetih sporočil Pokaži število označb z zvezdico Skupna mapa prejetih sporočil diff --git a/app/ui/legacy/src/main/res/values-sq/strings.xml b/app/ui/legacy/src/main/res/values-sq/strings.xml index 6cddae61d2517417cb24b97c210a0069f981d8d9..621ac885d178b1c4dce86492a1c6028cd35f6e58 100644 --- a/app/ui/legacy/src/main/res/values-sq/strings.xml +++ b/app/ui/legacy/src/main/res/values-sq/strings.xml @@ -658,9 +658,6 @@ 1000 dosje Animacion Përdor efekteve pamore Gaudy - Lëvizje me buton volumi - Në skenë mesazhi - Në skenë liste Shfaq Kuti Poste të Njësuar Shfaq llogari me yll Kuti Poste e Njësuar diff --git a/app/ui/legacy/src/main/res/values-sr/strings.xml b/app/ui/legacy/src/main/res/values-sr/strings.xml index cec3fa94dbb9574187157ce1a19cd3480a529e31..901528cbc1ba1630c8da7849b93806f0620b7a58 100644 --- a/app/ui/legacy/src/main/res/values-sr/strings.xml +++ b/app/ui/legacy/src/main/res/values-sr/strings.xml @@ -603,9 +603,6 @@ 1000 фасцикли Анимација Користи гиздаве визуелне ефекте - Навигација тастерима за јачину звука - у приказу порука - у приказу спискова Прикажи обједињено сандуче Обједињено сандуче Све поруке у једном сандучету diff --git a/app/ui/legacy/src/main/res/values-sv/strings.xml b/app/ui/legacy/src/main/res/values-sv/strings.xml index 01e4bd3932b9eb998db3fb5e1e93f10ce146d745..7bd2052d48f078b93f68a671285985c1a31358a1 100644 --- a/app/ui/legacy/src/main/res/values-sv/strings.xml +++ b/app/ui/legacy/src/main/res/values-sv/strings.xml @@ -659,9 +659,7 @@ 1000 mappar Animering Använd snygga visuella effekter - Navigering med volymknapp - I meddelandelistor - I listvyer + Volymknappnavigering i meddelandevyn Visa samlad inkorg Visa antalet stjärnmarkerade Samlad inkorg diff --git a/app/ui/legacy/src/main/res/values-tr/strings.xml b/app/ui/legacy/src/main/res/values-tr/strings.xml index 80a23753ed06a538b430928dda54ebd6776b30ad..2bd65f753b2aab0c6ce64bf92c152cfe90e50b53 100644 --- a/app/ui/legacy/src/main/res/values-tr/strings.xml +++ b/app/ui/legacy/src/main/res/values-tr/strings.xml @@ -640,9 +640,6 @@ 1000 klasör Animasyon Gösterişli görsel efektleri kullan - Ses Düğmesi ile dolaşma - İleti görünümlerinde - liste görünümlerinde Birleşik Gelen Kutusunu Göster Yıldızlanan sayısını göster Birleşik Gelen Kutusu diff --git a/app/ui/legacy/src/main/res/values-uk/strings.xml b/app/ui/legacy/src/main/res/values-uk/strings.xml index fc684c2f2e5db4510f3ae28ef45a5993b641fbb0..14c661c9c777b66995f9380eb68a969459c8a630 100644 --- a/app/ui/legacy/src/main/res/values-uk/strings.xml +++ b/app/ui/legacy/src/main/res/values-uk/strings.xml @@ -662,9 +662,6 @@ 1000 тек Анімація Використовувати яскраві візуальні ефекти - Навігація кнопками зміни гучності - при перегляді повідомлень - у списках Показувати Об\'єднані Вхідні Показати лічильник зірочок Об\'єднані Вхідні diff --git a/app/ui/legacy/src/main/res/values-zh-rCN/strings.xml b/app/ui/legacy/src/main/res/values-zh-rCN/strings.xml index 354a7d13db78acaa4eb599590606f6d0a31a0492..144b1cd30e6288589aa431397426bbc8ff30265b 100644 --- a/app/ui/legacy/src/main/res/values-zh-rCN/strings.xml +++ b/app/ui/legacy/src/main/res/values-zh-rCN/strings.xml @@ -655,9 +655,7 @@ 1000 个文件夹 动画 使用绚丽的视觉特效 - 音量键导航 - 信息视图 - 不同的列表视图 + 消息视图中音量键导航 显示全局收件箱 显示星标邮件数 全局收件箱 diff --git a/app/ui/legacy/src/main/res/values-zh-rTW/strings.xml b/app/ui/legacy/src/main/res/values-zh-rTW/strings.xml index 83b9877976aa455223bd5226353a5e1418e25bd1..8d6cac07de23910d08e8252b15fbbb677540c58b 100644 --- a/app/ui/legacy/src/main/res/values-zh-rTW/strings.xml +++ b/app/ui/legacy/src/main/res/values-zh-rTW/strings.xml @@ -378,8 +378,8 @@ 新郵件通知 通知信件匣 全部 - 僅上層信件匣 - 上層與下層信件匣 + 僅第一類信件匣 + 第一類與第二類信件匣 不包括下層信件匣 同步通知 @@ -469,25 +469,25 @@ 一年內 顯示的信件匣 全部 - 僅上層信件匣 - 上層與下層信件匣 + 僅第一類信件匣 + 第一類與第二類信件匣 不包括下層文件匣 檢查信件匣 全部 - 僅上層信件匣 - 上層與下層信件匣 + 僅第一類信件匣 + 第一類與第二類信件匣 不包括下層信件匣 推送信件匣 全部 - 僅上層信件匣 - 上層與下層信件匣 + 僅第一類信件匣 + 第一類與第二類信件匣 不包括下層信件匣 可以移動/複製到的文件匣 全部 - 僅上層信件匣 - 上層與下層信件匣 + 僅第一類信件匣 + 第一類與第二類信件匣 不包括下層信件匣 同步伺服器上的刪除 刪除在伺服器上被刪除的郵件的本地複製 @@ -497,21 +497,21 @@ 顯示在置頂的組之後 信件匣顯示層別 不分類 - 上層 + 第一類 下層 提取分類信件匣 - 上層 + 第一類 下層 使用與顯示層別相同的層別 信件匣推送層別 不分類 - 上層 + 第一類 下層 與分類層別相同 信件匣提醒層別 不分類 - 上層 + 第一類 下層 與推送層別相同 清除本地郵件 @@ -607,8 +607,8 @@ 信件匣名稱包括 信件匣 顯示全部信件匣 - 只顯示上層信件匣 - 顯示上層和下層信件匣 + 只顯示第一類信件匣 + 顯示第一類和第二類信件匣 不包括下層信件匣 簽名位置 在引用的本文之前 @@ -651,9 +651,6 @@ 1000個信件匣 動畫 使用絢麗的視覺特效 - 音量鍵導航 - 訊息檢視 - 不同的訊息檢視列表 顯示全域收件匣 全域收件匣 將所有郵件集中到全域收件匣 diff --git a/app/ui/legacy/src/main/res/values/arrays_general_settings_strings.xml b/app/ui/legacy/src/main/res/values/arrays_general_settings_strings.xml index 328f4cce3bd66d86abcd97ddaebc20ee615bfe63..45bf2174c22f628645d958f1647ec16b282a4584 100644 --- a/app/ui/legacy/src/main/res/values/arrays_general_settings_strings.xml +++ b/app/ui/legacy/src/main/res/values/arrays_general_settings_strings.xml @@ -157,9 +157,4 @@ @string/spam_action - - @string/volume_navigation_message - @string/volume_navigation_list - - diff --git a/app/ui/legacy/src/main/res/values/attrs.xml b/app/ui/legacy/src/main/res/values/attrs.xml index 9c695e98122e35d8d059777ae94ba996b6982a71..bc4ab1d25a48f358624613ae0787e884094b4a21 100644 --- a/app/ui/legacy/src/main/res/values/attrs.xml +++ b/app/ui/legacy/src/main/res/values/attrs.xml @@ -66,6 +66,7 @@ + diff --git a/app/ui/legacy/src/main/res/values/colors.xml b/app/ui/legacy/src/main/res/values/colors.xml index 294072159903a20f3b67ee336cd61b09ca1a5d81..0538558a905eac1fa3acd2b6aa4b80a4a15042d1 100644 --- a/app/ui/legacy/src/main/res/values/colors.xml +++ b/app/ui/legacy/src/main/res/values/colors.xml @@ -19,8 +19,6 @@ #444444 - #eeeeee - #888 #f44336 #7bad45 diff --git a/app/ui/legacy/src/main/res/values/strings.xml b/app/ui/legacy/src/main/res/values/strings.xml index 72168bf6e17912b78b21767af3c335c918a6a2b2..378a5b7afd4f4e03f84de28c216222068d708a2d 100644 --- a/app/ui/legacy/src/main/res/values/strings.xml +++ b/app/ui/legacy/src/main/res/values/strings.xml @@ -797,9 +797,7 @@ Animation Use gaudy visual effects - Volume key navigation - In message views - In list views + Volume key navigation in message view Show All Inboxes Show starred count diff --git a/app/ui/legacy/src/main/res/xml/general_settings.xml b/app/ui/legacy/src/main/res/xml/general_settings.xml index b072dc7c412d1ec6304225b5aa0a65360cc5e1cd..a5777368a1cb20d7a539f00ce15bd29e69280885 100644 --- a/app/ui/legacy/src/main/res/xml/general_settings.xml +++ b/app/ui/legacy/src/main/res/xml/general_settings.xml @@ -400,11 +400,8 @@ android:title="@string/interaction_preferences" search:ignore="true"> - diff --git a/app/ui/legacy/src/test/java/com/fsck/k9/fragment/MessageListAdapterTest.kt b/app/ui/legacy/src/test/java/com/fsck/k9/fragment/MessageListAdapterTest.kt index 168f2bc6888e830b4617afdc938c0fd4a221c979..095eb681595e1778c92d0b7ef5e5967924bc6f28 100644 --- a/app/ui/legacy/src/test/java/com/fsck/k9/fragment/MessageListAdapterTest.kt +++ b/app/ui/legacy/src/test/java/com/fsck/k9/fragment/MessageListAdapterTest.kt @@ -457,7 +457,6 @@ class MessageListAdapterTest : RobolectricTest() { ) return MessageListAdapter( - context = context, theme = context.theme, res = context.resources, layoutInflater = LayoutInflater.from(context), @@ -518,7 +517,9 @@ class MessageListAdapterTest : RobolectricTest() { fun MessageListAdapter.createAndBindView(item: MessageListItem = createMessageListItem()): View { messages = listOf(item) - return getView(0, null, LinearLayout(context)) + val holder = onCreateViewHolder(LinearLayout(context), 0) + onBindViewHolder(holder, 0) + return holder.itemView } fun secondLine(senderOrSubject: String, preview: String) = "$senderOrSubject $preview" diff --git a/app/ui/legacy/src/test/java/com/fsck/k9/ui/K9DrawerTest.kt b/app/ui/legacy/src/test/java/com/fsck/k9/ui/K9DrawerTest.kt index 48c04348c1f0dff43677290cf857760afc478696..7db67cbf5b769df8f29b244b684ca494400b31e3 100644 --- a/app/ui/legacy/src/test/java/com/fsck/k9/ui/K9DrawerTest.kt +++ b/app/ui/legacy/src/test/java/com/fsck/k9/ui/K9DrawerTest.kt @@ -1,6 +1,7 @@ package com.fsck.k9.ui import com.fsck.k9.RobolectricTest +import com.fsck.k9.core.R import org.junit.Assert.assertEquals import org.junit.Test import org.robolectric.RuntimeEnvironment diff --git a/app/ui/setup/build.gradle b/app/ui/setup/build.gradle index a4279c21e0b1a09906d5ddd45e407ba1a931ae34..aa9bdd7985d43501f0fe4ae869f2aee902d31203 100644 --- a/app/ui/setup/build.gradle +++ b/app/ui/setup/build.gradle @@ -27,6 +27,8 @@ dependencies { } android { + namespace 'com.fsck.k9.ui.setup' + compileSdkVersion buildConfig.compileSdk buildToolsVersion buildConfig.buildTools diff --git a/app/ui/setup/src/main/AndroidManifest.xml b/app/ui/setup/src/main/AndroidManifest.xml deleted file mode 100644 index a770e75ee241b239482ff48ffd0b2036198e4045..0000000000000000000000000000000000000000 --- a/app/ui/setup/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/backend/api/build.gradle b/backend/api/build.gradle index 639fc33317062f32aa1caec37f52ec4735b04891..ce98344e01023ac59477b8984ffdc040b642cb88 100644 --- a/backend/api/build.gradle +++ b/backend/api/build.gradle @@ -1,29 +1,12 @@ -apply plugin: 'com.android.library' -apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'java-library' +apply plugin: 'kotlin' +apply plugin: 'com.android.lint' -dependencies { - api project(":mail:common") +java { + sourceCompatibility = javaVersion + targetCompatibility = javaVersion } -android { - compileSdkVersion buildConfig.compileSdk - buildToolsVersion buildConfig.buildTools - - defaultConfig { - minSdkVersion buildConfig.minSdk - } - - lintOptions { - abortOnError false - lintConfig file("$rootProject.projectDir/config/lint/lint.xml") - } - - compileOptions { - sourceCompatibility javaVersion - targetCompatibility javaVersion - } - - kotlinOptions { - jvmTarget = kotlinJvmVersion - } +dependencies { + api project(":mail:common") } diff --git a/backend/api/src/main/AndroidManifest.xml b/backend/api/src/main/AndroidManifest.xml deleted file mode 100644 index a5723f2fd9c28c6ed87d5c1afb8824cbab4a7300..0000000000000000000000000000000000000000 --- a/backend/api/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/backend/demo/build.gradle b/backend/demo/build.gradle index 62e0bd34fdd5f22e75a0afa7bef0447522bfde05..ce88d022db55eb47ec9c84c1eea514c9a8b2f54c 100644 --- a/backend/demo/build.gradle +++ b/backend/demo/build.gradle @@ -1,16 +1,17 @@ -apply plugin: 'com.android.library' -apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'java-library' +apply plugin: 'kotlin' apply plugin: 'kotlin-kapt' +apply plugin: 'com.android.lint' -if (rootProject.testCoverage) { - apply plugin: 'jacoco' +java { + sourceCompatibility = javaVersion + targetCompatibility = javaVersion } dependencies { api project(":backend:api") implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:${versions.kotlinCoroutines}" - implementation "com.jakewharton.timber:timber:${versions.timber}" implementation "com.squareup.moshi:moshi:${versions.moshi}" kapt "com.squareup.moshi:moshi-kotlin-codegen:${versions.moshi}" @@ -19,32 +20,3 @@ dependencies { testImplementation "org.mockito:mockito-core:${versions.mockito}" testImplementation "com.google.truth:truth:${versions.truth}" } - -android { - compileSdkVersion buildConfig.compileSdk - buildToolsVersion buildConfig.buildTools - - defaultConfig { - minSdkVersion buildConfig.minSdk - } - - buildTypes { - debug { - testCoverageEnabled rootProject.testCoverage - } - } - - lintOptions { - abortOnError false - lintConfig file("$rootProject.projectDir/config/lint/lint.xml") - } - - compileOptions { - sourceCompatibility javaVersion - targetCompatibility javaVersion - } - - kotlinOptions { - jvmTarget = kotlinJvmVersion - } -} diff --git a/backend/demo/src/main/AndroidManifest.xml b/backend/demo/src/main/AndroidManifest.xml deleted file mode 100644 index d9551f0716026c19508d893cd3e8c63525b4aaec..0000000000000000000000000000000000000000 --- a/backend/demo/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/backend/imap/build.gradle b/backend/imap/build.gradle index a854f9234c550890a0e97927753677840688c472..80388aa67c2aa416f0c9d5b8bee98446f0ed37f9 100644 --- a/backend/imap/build.gradle +++ b/backend/imap/build.gradle @@ -1,8 +1,10 @@ -apply plugin: 'com.android.library' -apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'java-library' +apply plugin: 'kotlin' +apply plugin: 'com.android.lint' -if (rootProject.testCoverage) { - apply plugin: 'jacoco' +java { + sourceCompatibility = javaVersion + targetCompatibility = javaVersion } dependencies { @@ -11,7 +13,6 @@ dependencies { api project(":mail:protocols:smtp") implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:${versions.kotlinCoroutines}" - implementation "com.jakewharton.timber:timber:${versions.timber}" testImplementation project(":mail:testing") testImplementation project(":backend:testing") @@ -21,32 +22,3 @@ dependencies { testImplementation "com.google.truth:truth:${versions.truth}" testImplementation "org.apache.james:apache-mime4j-dom:${versions.mime4j}" } - -android { - compileSdkVersion buildConfig.compileSdk - buildToolsVersion buildConfig.buildTools - - defaultConfig { - minSdkVersion buildConfig.minSdk - } - - buildTypes { - debug { - testCoverageEnabled rootProject.testCoverage - } - } - - lintOptions { - abortOnError false - lintConfig file("$rootProject.projectDir/config/lint/lint.xml") - } - - compileOptions { - sourceCompatibility javaVersion - targetCompatibility javaVersion - } - - kotlinOptions { - jvmTarget = kotlinJvmVersion - } -} diff --git a/backend/imap/src/main/AndroidManifest.xml b/backend/imap/src/main/AndroidManifest.xml deleted file mode 100644 index f987abbd17d9f6d936c39588684e271a7f69565e..0000000000000000000000000000000000000000 --- a/backend/imap/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/backend/imap/src/main/java/com/fsck/k9/backend/imap/CommandExpunge.kt b/backend/imap/src/main/java/com/fsck/k9/backend/imap/CommandExpunge.kt index 465873150973dd5ecac5b6f082d81998ba4a907a..1b9178c9020fd13a4abd88d82c58f93bf4d48310 100644 --- a/backend/imap/src/main/java/com/fsck/k9/backend/imap/CommandExpunge.kt +++ b/backend/imap/src/main/java/com/fsck/k9/backend/imap/CommandExpunge.kt @@ -1,8 +1,8 @@ package com.fsck.k9.backend.imap +import com.fsck.k9.logging.Timber import com.fsck.k9.mail.store.imap.ImapStore import com.fsck.k9.mail.store.imap.OpenMode -import timber.log.Timber internal class CommandExpunge(private val imapStore: ImapStore) { diff --git a/backend/imap/src/main/java/com/fsck/k9/backend/imap/CommandMoveOrCopyMessages.kt b/backend/imap/src/main/java/com/fsck/k9/backend/imap/CommandMoveOrCopyMessages.kt index 54559f747576b6c32ed29462312389b767261dd6..c3b92903aa5ed4a34192b5a61d6a1028aa61c434 100644 --- a/backend/imap/src/main/java/com/fsck/k9/backend/imap/CommandMoveOrCopyMessages.kt +++ b/backend/imap/src/main/java/com/fsck/k9/backend/imap/CommandMoveOrCopyMessages.kt @@ -1,10 +1,10 @@ package com.fsck.k9.backend.imap +import com.fsck.k9.logging.Timber import com.fsck.k9.mail.MessagingException import com.fsck.k9.mail.store.imap.ImapFolder import com.fsck.k9.mail.store.imap.ImapStore import com.fsck.k9.mail.store.imap.OpenMode -import timber.log.Timber internal class CommandMoveOrCopyMessages(private val imapStore: ImapStore) { diff --git a/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapBackendPusher.kt b/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapBackendPusher.kt index 96c68da54ee006477e0fbb861818963f9f5ae51d..f08c4a88b57ddebce113daa6d336bedc5aad50ee 100644 --- a/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapBackendPusher.kt +++ b/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapBackendPusher.kt @@ -2,6 +2,7 @@ package com.fsck.k9.backend.imap import com.fsck.k9.backend.api.BackendPusher import com.fsck.k9.backend.api.BackendPusherCallback +import com.fsck.k9.logging.Timber import com.fsck.k9.mail.AuthenticationFailedException import com.fsck.k9.mail.MessagingException import com.fsck.k9.mail.power.PowerManager @@ -14,9 +15,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.cancel -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch -import timber.log.Timber private const val IO_ERROR_TIMEOUT = 5 * 60 * 1000L private const val UNEXPECTED_ERROR_TIMEOUT = 60 * 60 * 1000L diff --git a/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapFolderPusher.kt b/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapFolderPusher.kt index f9c4c4516b55ebdc5c7d0730ab077c314d38fa08..ef3ffe03207ef3e845388821194ddf99c7150a0f 100644 --- a/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapFolderPusher.kt +++ b/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapFolderPusher.kt @@ -1,5 +1,6 @@ package com.fsck.k9.backend.imap +import com.fsck.k9.logging.Timber import com.fsck.k9.mail.power.PowerManager import com.fsck.k9.mail.store.imap.IdleRefreshManager import com.fsck.k9.mail.store.imap.IdleRefreshTimeoutProvider @@ -7,7 +8,6 @@ import com.fsck.k9.mail.store.imap.IdleResult import com.fsck.k9.mail.store.imap.ImapFolderIdler import com.fsck.k9.mail.store.imap.ImapStore import kotlin.concurrent.thread -import timber.log.Timber /** * Listens for changes to an IMAP folder in a dedicated thread. diff --git a/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapSync.kt b/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapSync.kt index 8b67a6ea0dbd148f259e97aa752aba65fd72ff3d..1d62f180d86bc4acc4b7662bca69ddd69af1aee5 100644 --- a/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapSync.kt +++ b/backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapSync.kt @@ -7,6 +7,7 @@ import com.fsck.k9.backend.api.SyncConfig import com.fsck.k9.backend.api.SyncConfig.ExpungePolicy import com.fsck.k9.backend.api.SyncListener import com.fsck.k9.helper.ExceptionHelper +import com.fsck.k9.logging.Timber import com.fsck.k9.mail.AuthenticationFailedException import com.fsck.k9.mail.BodyFactory import com.fsck.k9.mail.DefaultBodyFactory @@ -23,7 +24,6 @@ import java.util.Collections import java.util.Date import java.util.concurrent.atomic.AtomicInteger import kotlin.math.max -import timber.log.Timber internal class ImapSync( private val accountName: String, diff --git a/backend/jmap/build.gradle b/backend/jmap/build.gradle index 344412a661365d352a9315bfd1f92c056e4a5eee..6f5416753ec893152e93b05ffc3143f4ddf0b5fe 100644 --- a/backend/jmap/build.gradle +++ b/backend/jmap/build.gradle @@ -1,9 +1,11 @@ -apply plugin: 'com.android.library' -apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'java-library' +apply plugin: 'kotlin' apply plugin: 'kotlin-kapt' +apply plugin: 'com.android.lint' -if (rootProject.testCoverage) { - apply plugin: 'jacoco' +java { + sourceCompatibility = javaVersion + targetCompatibility = javaVersion } dependencies { @@ -11,7 +13,6 @@ dependencies { api "com.squareup.okhttp3:okhttp:${versions.okhttp}" implementation "rs.ltt.jmap:jmap-client:0.3.1" - implementation "com.jakewharton.timber:timber:${versions.timber}" implementation "com.squareup.moshi:moshi:${versions.moshi}" kapt "com.squareup.moshi:moshi-kotlin-codegen:${versions.moshi}" @@ -20,32 +21,3 @@ dependencies { testImplementation "org.mockito:mockito-core:${versions.mockito}" testImplementation("com.squareup.okhttp3:mockwebserver:${versions.okhttp}") } - -android { - compileSdkVersion buildConfig.compileSdk - buildToolsVersion buildConfig.buildTools - - defaultConfig { - minSdkVersion buildConfig.minSdk - } - - buildTypes { - debug { - testCoverageEnabled rootProject.testCoverage - } - } - - lintOptions { - abortOnError false - lintConfig file("$rootProject.projectDir/config/lint/lint.xml") - } - - compileOptions { - sourceCompatibility javaVersion - targetCompatibility javaVersion - } - - kotlinOptions { - jvmTarget = kotlinJvmVersion - } -} diff --git a/backend/jmap/src/main/AndroidManifest.xml b/backend/jmap/src/main/AndroidManifest.xml deleted file mode 100644 index 82de6eb7f4fefb3de93778255cf0a9289d035209..0000000000000000000000000000000000000000 --- a/backend/jmap/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandDelete.kt b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandDelete.kt index f6c1564c5b66b3e4657d1593376a631714d73abe..0db6100f6d7fbcc28f7ea8bdba62d62b8e6239e9 100644 --- a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandDelete.kt +++ b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandDelete.kt @@ -1,5 +1,6 @@ package com.fsck.k9.backend.jmap +import com.fsck.k9.logging.Timber import rs.ltt.jmap.client.JmapClient import rs.ltt.jmap.common.Request.Invocation.ResultReference import rs.ltt.jmap.common.entity.filter.EmailFilterCondition @@ -7,7 +8,6 @@ import rs.ltt.jmap.common.method.call.email.QueryEmailMethodCall import rs.ltt.jmap.common.method.call.email.SetEmailMethodCall import rs.ltt.jmap.common.method.response.email.QueryEmailMethodResponse import rs.ltt.jmap.common.method.response.email.SetEmailMethodResponse -import timber.log.Timber class CommandDelete( private val jmapClient: JmapClient, diff --git a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandMove.kt b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandMove.kt index 086ac5b22ffaf6513049a6cb72a7a5f3b8fb9829..f45461c64a3157f81db8c44bfa396c079826adf5 100644 --- a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandMove.kt +++ b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandMove.kt @@ -1,10 +1,10 @@ package com.fsck.k9.backend.jmap +import com.fsck.k9.logging.Timber import rs.ltt.jmap.client.JmapClient import rs.ltt.jmap.common.method.call.email.SetEmailMethodCall import rs.ltt.jmap.common.method.response.email.SetEmailMethodResponse import rs.ltt.jmap.common.util.Patches -import timber.log.Timber class CommandMove( private val jmapClient: JmapClient, diff --git a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandSetFlag.kt b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandSetFlag.kt index 3dfd648cdefe41b7b7e4bb546fd9a5fa84c3e0a7..1a1646337e0d7fa39df39362f5cab96298cb3def 100644 --- a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandSetFlag.kt +++ b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandSetFlag.kt @@ -1,5 +1,6 @@ package com.fsck.k9.backend.jmap +import com.fsck.k9.logging.Timber import com.fsck.k9.mail.Flag import rs.ltt.jmap.client.JmapClient import rs.ltt.jmap.common.entity.filter.EmailFilterCondition @@ -8,7 +9,6 @@ import rs.ltt.jmap.common.method.call.email.SetEmailMethodCall import rs.ltt.jmap.common.method.response.email.QueryEmailMethodResponse import rs.ltt.jmap.common.method.response.email.SetEmailMethodResponse import rs.ltt.jmap.common.util.Patches -import timber.log.Timber class CommandSetFlag( private val jmapClient: JmapClient, diff --git a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandSync.kt b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandSync.kt index 2c26dc30e32cfe54df43885d753fff75fcce0478..876d3b8ef6ea0e2bd028e4f3707f8aa22f5f6ec9 100644 --- a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandSync.kt +++ b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandSync.kt @@ -4,6 +4,7 @@ import com.fsck.k9.backend.api.BackendFolder import com.fsck.k9.backend.api.BackendStorage import com.fsck.k9.backend.api.SyncConfig import com.fsck.k9.backend.api.SyncListener +import com.fsck.k9.logging.Timber import com.fsck.k9.mail.AuthenticationFailedException import com.fsck.k9.mail.Flag import com.fsck.k9.mail.MessageDownloadState @@ -26,7 +27,6 @@ import rs.ltt.jmap.common.method.call.email.QueryEmailMethodCall import rs.ltt.jmap.common.method.response.email.GetEmailMethodResponse import rs.ltt.jmap.common.method.response.email.QueryChangesEmailMethodResponse import rs.ltt.jmap.common.method.response.email.QueryEmailMethodResponse -import timber.log.Timber class CommandSync( private val backendStorage: BackendStorage, diff --git a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandUpload.kt b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandUpload.kt index 2b767675698c161e6c68e45b8e62011d7976028e..89da6e6f414fbc4459ffe4f869a995a8ad5f9b83 100644 --- a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandUpload.kt +++ b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/CommandUpload.kt @@ -1,5 +1,6 @@ package com.fsck.k9.backend.jmap +import com.fsck.k9.logging.Timber import com.fsck.k9.mail.Message import com.fsck.k9.mail.MessagingException import com.squareup.moshi.Moshi @@ -14,7 +15,6 @@ import rs.ltt.jmap.client.http.HttpAuthentication import rs.ltt.jmap.common.entity.EmailImport import rs.ltt.jmap.common.method.call.email.ImportEmailMethodCall import rs.ltt.jmap.common.method.response.email.ImportEmailMethodResponse -import timber.log.Timber class CommandUpload( private val jmapClient: JmapClient, diff --git a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/JmapAccountDiscovery.kt b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/JmapAccountDiscovery.kt index 5a4946d4a3d197f1becd7f2b7f051373744810fc..c3f4bf8a94b7593a71f426abb8594ef8f900a8ce 100644 --- a/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/JmapAccountDiscovery.kt +++ b/backend/jmap/src/main/java/com/fsck/k9/backend/jmap/JmapAccountDiscovery.kt @@ -1,11 +1,11 @@ package com.fsck.k9.backend.jmap +import com.fsck.k9.logging.Timber import java.net.UnknownHostException import rs.ltt.jmap.client.JmapClient import rs.ltt.jmap.client.api.EndpointNotFoundException import rs.ltt.jmap.client.api.UnauthorizedException import rs.ltt.jmap.common.entity.capability.MailAccountCapability -import timber.log.Timber class JmapAccountDiscovery { fun discover(emailAddress: String, password: String): JmapDiscoveryResult { diff --git a/backend/pop3/build.gradle b/backend/pop3/build.gradle index fb58ae2aca5a809d1b089dfb45c3cfd1e66f5852..8bd73c72cb0d3330e789e30163684c689c2e666e 100644 --- a/backend/pop3/build.gradle +++ b/backend/pop3/build.gradle @@ -1,8 +1,10 @@ -apply plugin: 'com.android.library' -apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'java-library' +apply plugin: 'kotlin' +apply plugin: 'com.android.lint' -if (rootProject.testCoverage) { - apply plugin: 'jacoco' +java { + sourceCompatibility = javaVersion + targetCompatibility = javaVersion } dependencies { @@ -10,38 +12,7 @@ dependencies { api project(":mail:protocols:pop3") api project(":mail:protocols:smtp") - implementation "com.jakewharton.timber:timber:${versions.timber}" - testImplementation project(":mail:testing") testImplementation "junit:junit:${versions.junit}" testImplementation "org.mockito:mockito-core:${versions.mockito}" } - -android { - compileSdkVersion buildConfig.compileSdk - buildToolsVersion buildConfig.buildTools - - defaultConfig { - minSdkVersion buildConfig.minSdk - } - - buildTypes { - debug { - testCoverageEnabled rootProject.testCoverage - } - } - - lintOptions { - abortOnError false - lintConfig file("$rootProject.projectDir/config/lint/lint.xml") - } - - compileOptions { - sourceCompatibility javaVersion - targetCompatibility javaVersion - } - - kotlinOptions { - jvmTarget = kotlinJvmVersion - } -} diff --git a/backend/pop3/src/main/AndroidManifest.xml b/backend/pop3/src/main/AndroidManifest.xml deleted file mode 100644 index f2d8069189511cc19db12de5cd822d5118e150ec..0000000000000000000000000000000000000000 --- a/backend/pop3/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/backend/pop3/src/main/java/com/fsck/k9/backend/pop3/Pop3Sync.java b/backend/pop3/src/main/java/com/fsck/k9/backend/pop3/Pop3Sync.java index 136364eba244dee4d7da886a33605a05dccd258e..3ba740fb32fabf980861ebe55ac5c96d90db5d66 100644 --- a/backend/pop3/src/main/java/com/fsck/k9/backend/pop3/Pop3Sync.java +++ b/backend/pop3/src/main/java/com/fsck/k9/backend/pop3/Pop3Sync.java @@ -7,6 +7,7 @@ import com.fsck.k9.backend.api.BackendStorage; import com.fsck.k9.backend.api.SyncConfig; import com.fsck.k9.backend.api.SyncListener; import com.fsck.k9.helper.ExceptionHelper; +import com.fsck.k9.logging.Timber; import com.fsck.k9.mail.AuthenticationFailedException; import com.fsck.k9.mail.FetchProfile; import com.fsck.k9.mail.Flag; @@ -26,8 +27,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; -import timber.log.Timber; - class Pop3Sync { private static final String EXTRA_LATEST_OLD_MESSAGE_SEEN_TIME = "latestOldMessageSeenTime"; diff --git a/backend/testing/build.gradle b/backend/testing/build.gradle index 85e01489be6ffe00ac5833824277c251d6da9169..38dbc9e21fa39bed7b64652435f5d6206f0358be 100644 --- a/backend/testing/build.gradle +++ b/backend/testing/build.gradle @@ -1,31 +1,15 @@ -apply plugin: 'com.android.library' -apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'java-library' +apply plugin: 'kotlin' +apply plugin: 'com.android.lint' + +java { + sourceCompatibility = javaVersion + targetCompatibility = javaVersion +} dependencies { implementation project(":backend:api") + implementation "com.squareup.okio:okio:${versions.okio}" implementation "junit:junit:${versions.junit}" } - -android { - compileSdkVersion buildConfig.compileSdk - buildToolsVersion buildConfig.buildTools - - defaultConfig { - minSdkVersion buildConfig.minSdk - } - - lintOptions { - abortOnError false - lintConfig file("$rootProject.projectDir/config/lint/lint.xml") - } - - compileOptions { - sourceCompatibility javaVersion - targetCompatibility javaVersion - } - - kotlinOptions { - jvmTarget = kotlinJvmVersion - } -} diff --git a/backend/testing/src/main/AndroidManifest.xml b/backend/testing/src/main/AndroidManifest.xml deleted file mode 100644 index 5c32387bbfb643a931af09975ad51302d9865ab8..0000000000000000000000000000000000000000 --- a/backend/testing/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/backend/webdav/build.gradle b/backend/webdav/build.gradle index b4801f303257aabffa6f5e868059a320fc98e62f..02cb2a8085ef275035ee50b6ed38de9f1420e6d0 100644 --- a/backend/webdav/build.gradle +++ b/backend/webdav/build.gradle @@ -1,49 +1,17 @@ -apply plugin: 'com.android.library' -apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'java-library' +apply plugin: 'kotlin' +apply plugin: 'com.android.lint' -if (rootProject.testCoverage) { - apply plugin: 'jacoco' +java { + sourceCompatibility = javaVersion + targetCompatibility = javaVersion } dependencies { api project(":backend:api") api project(":mail:protocols:webdav") - implementation "com.jakewharton.timber:timber:${versions.timber}" - testImplementation project(":mail:testing") testImplementation "junit:junit:${versions.junit}" testImplementation "org.mockito:mockito-core:${versions.mockito}" } - -android { - compileSdkVersion buildConfig.compileSdk - buildToolsVersion buildConfig.buildTools - - defaultConfig { - minSdkVersion buildConfig.minSdk - } - - // for using Apache HTTP Client - useLibrary 'org.apache.http.legacy' - - buildTypes { - debug { - testCoverageEnabled rootProject.testCoverage - } - } - - lintOptions { - abortOnError false - lintConfig file("$rootProject.projectDir/config/lint/lint.xml") - } - - compileOptions { - sourceCompatibility javaVersion - targetCompatibility javaVersion - } - - kotlinOptions { - jvmTarget = kotlinJvmVersion - } -} diff --git a/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/CommandMoveOrCopyMessages.java b/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/CommandMoveOrCopyMessages.java index 1afa7a12a5d487e92e4f82d3c3796cd0fc23c883..b6638c8c387ddecf1ee78f8f6d7cde3acd9337c4 100644 --- a/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/CommandMoveOrCopyMessages.java +++ b/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/CommandMoveOrCopyMessages.java @@ -6,12 +6,12 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import com.fsck.k9.logging.Timber; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.store.webdav.WebDavFolder; import com.fsck.k9.mail.store.webdav.WebDavMessage; import com.fsck.k9.mail.store.webdav.WebDavStore; import org.jetbrains.annotations.NotNull; -import timber.log.Timber; class CommandMoveOrCopyMessages { diff --git a/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/WebDavBackend.kt b/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/WebDavBackend.kt index e0321d60a0e779bdd748cd30305e322c2e6e37cb..6e855653a55336c239ac12738067209489d14b02 100644 --- a/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/WebDavBackend.kt +++ b/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/WebDavBackend.kt @@ -6,6 +6,7 @@ import com.fsck.k9.backend.api.BackendPusherCallback import com.fsck.k9.backend.api.BackendStorage import com.fsck.k9.backend.api.SyncConfig import com.fsck.k9.backend.api.SyncListener +import com.fsck.k9.logging.Timber import com.fsck.k9.mail.BodyFactory import com.fsck.k9.mail.Flag import com.fsck.k9.mail.Message @@ -13,7 +14,6 @@ import com.fsck.k9.mail.MessagingException import com.fsck.k9.mail.Part import com.fsck.k9.mail.store.webdav.WebDavStore import com.fsck.k9.mail.transport.WebDavTransport -import timber.log.Timber class WebDavBackend( accountName: String, diff --git a/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/WebDavSync.java b/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/WebDavSync.java index ca400431f3d7842e5c93e81d5ef87e6a23ba7c66..e3bfff2030e34961b53065ebcb35d5d10f1cc553 100644 --- a/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/WebDavSync.java +++ b/backend/webdav/src/main/java/com/fsck/k9/backend/webdav/WebDavSync.java @@ -1,12 +1,23 @@ package com.fsck.k9.backend.webdav; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; + import com.fsck.k9.backend.api.BackendFolder; import com.fsck.k9.backend.api.BackendFolder.MoreMessages; import com.fsck.k9.backend.api.BackendStorage; import com.fsck.k9.backend.api.SyncConfig; import com.fsck.k9.backend.api.SyncListener; import com.fsck.k9.helper.ExceptionHelper; +import com.fsck.k9.logging.Timber; import com.fsck.k9.mail.AuthenticationFailedException; import com.fsck.k9.mail.FetchProfile; import com.fsck.k9.mail.Flag; @@ -17,18 +28,6 @@ import com.fsck.k9.mail.store.webdav.WebDavFolder; import com.fsck.k9.mail.store.webdav.WebDavMessage; import com.fsck.k9.mail.store.webdav.WebDavStore; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; - -import timber.log.Timber; - class WebDavSync { private final String accountName; diff --git a/build.gradle b/build.gradle index d1dae12636d8a51552135199cc0264e68560009f..2a02b88fc35b201df4e0f09f35066425c0ae4c4e 100644 --- a/build.gradle +++ b/build.gradle @@ -16,18 +16,18 @@ buildscript { 'kotlin': '1.7.10', 'kotlinCoroutines': '1.6.4', 'jetbrainsAnnotations': '23.0.0', - 'androidxAppCompat': '1.5.0', + 'androidxAppCompat': '1.5.1', 'androidxActivity': '1.5.1', 'androidxRecyclerView': '1.2.1', 'androidxLifecycle': '2.5.1', 'androidxAnnotation': '1.4.0', 'androidxBiometric': '1.1.0', - 'androidxNavigation': '2.5.1', + 'androidxNavigation': '2.5.2', 'androidxConstraintLayout': '2.1.4', 'androidxWorkManager': '2.7.1', 'androidxFragment': '1.5.2', 'androidxLocalBroadcastManager': '1.1.0', - 'androidxCore': '1.8.0', + 'androidxCore': '1.9.0', 'androidxCardView': '1.0.0', 'androidxPreference': '1.2.0', 'androidxTestCore': '1.4.0', @@ -35,9 +35,9 @@ buildscript { 'fastAdapter': '5.6.0', 'preferencesFix': '1.1.0', 'okio': '3.2.0', - 'moshi': '1.13.0', + 'moshi': '1.14.0', 'timber': '5.0.1', - 'koin': '3.2.0', + 'koin': '3.2.1', // We can't upgrade Commons IO beyond this version because starting with 2.7 it is using Java 8 API // that is not available until Android API 26 (even with desugaring enabled). // See https://issuetracker.google.com/issues/160484830 @@ -53,10 +53,10 @@ buildscript { 'androidxTestRunner': '1.4.0', 'junit': '4.13.2', 'robolectric': '4.8.2', - 'mockito': '4.7.0', + 'mockito': '4.8.0', 'mockitoKotlin': '4.0.0', 'truth': '1.1.3', - 'turbine': '0.9.0', + 'turbine': '0.10.0', 'leakcanary': '2.9.1', 'ktlint': '0.44.0' ] diff --git a/fastlane/metadata/android/en-US/changelogs/33006.txt b/fastlane/metadata/android/en-US/changelogs/33006.txt new file mode 100644 index 0000000000000000000000000000000000000000..f03b46b82ef1ec8c1bfc4e732408b844aa22c47c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/33006.txt @@ -0,0 +1,6 @@ +- Added a monochromatic app icon for Android 13 +- Changed the UI component used for the message list; now changes to the list will be animated +- Removed the volume key navigation for list views because it doesn't play nice with the above change +- Fixed a bug that lead to the search input field being focused on app start on some devices +- Restored the previous behavior of "show next message after delete" +- A lot of internal changes and some minor performance improvements diff --git a/fastlane/metadata/android/en-US/changelogs/33007.txt b/fastlane/metadata/android/en-US/changelogs/33007.txt new file mode 100644 index 0000000000000000000000000000000000000000..8292b473fc4f435510cb0771b393b9436c5bb0a7 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/33007.txt @@ -0,0 +1,3 @@ +- Fixed the message list background color in the dark theme +- Fixed a small display issue where "Load up to X more" could have been displayed when it shouldn't have been +- Updated translations diff --git a/gradle.properties b/gradle.properties index fa694f82cb7e894a8d9e081cd38a2fc8c67c1aa7..cb02e7dc44d12371f0cf16d15b270453d066ac9d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,3 +2,4 @@ android.useAndroidX=true android.enableJetifier=true org.gradle.jvmargs=-Xmx1400m org.gradle.parallel=true +android.nonTransitiveRClass=true diff --git a/images/drawable-src/ic_launcher_monochrome.svg b/images/drawable-src/ic_launcher_monochrome.svg new file mode 100644 index 0000000000000000000000000000000000000000..9fc60f1de9d8025599c32e621e31eb08f223383d --- /dev/null +++ b/images/drawable-src/ic_launcher_monochrome.svg @@ -0,0 +1,133 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/plugins/openpgp-api-lib/openpgp-api/build.gradle b/plugins/openpgp-api-lib/openpgp-api/build.gradle index 302e7267a213ddcde5dfa4a9765add30d684f537..ce8cf248e4aef02d479b270999891d9ab2d60009 100644 --- a/plugins/openpgp-api-lib/openpgp-api/build.gradle +++ b/plugins/openpgp-api-lib/openpgp-api/build.gradle @@ -1,6 +1,8 @@ apply plugin: 'com.android.library' android { + namespace 'org.openintents.openpgp' + compileSdkVersion buildConfig.compileSdk buildToolsVersion buildConfig.buildTools diff --git a/plugins/openpgp-api-lib/openpgp-api/src/main/AndroidManifest.xml b/plugins/openpgp-api-lib/openpgp-api/src/main/AndroidManifest.xml deleted file mode 100644 index f1f29cf3c46efe511ab5420ad87817f4a22b34a6..0000000000000000000000000000000000000000 --- a/plugins/openpgp-api-lib/openpgp-api/src/main/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file