Repo created

This commit is contained in:
Fr4nz D13trich 2025-11-22 13:56:56 +01:00
parent 75dc487a7a
commit 39c29d175b
6317 changed files with 388324 additions and 2 deletions

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<application tools:ignore="MissingApplicationIcon">
<!-- This component is disabled by default (if possible). It will be enabled programmatically if necessary. -->
<!-- IMPORTANT: The component name must be -->
<!-- `net.thunderbird.feature.widget.message.list.MessageListWidgetReceiver` and can't be changed. -->
<receiver
android:name="net.thunderbird.feature.widget.message.list.MessageListWidgetReceiver"
android:exported="true"
android:label="@string/message_list_glance_widget_label"
>
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/message_list_glance_widget_info"
/>
</receiver>
</application>
</manifest>

View file

@ -0,0 +1,92 @@
package app.k9mail.auth
import com.fsck.k9.BuildConfig
import net.thunderbird.core.common.oauth.OAuthConfiguration
import net.thunderbird.core.common.oauth.OAuthConfigurationFactory
@Suppress("ktlint:standard:max-line-length")
class K9OAuthConfigurationFactory : OAuthConfigurationFactory {
override fun createConfigurations(): Map<List<String>, OAuthConfiguration> {
return mapOf(
createAolConfiguration(),
createFastmailConfiguration(),
createGmailConfiguration(),
createMicrosoftConfiguration(),
createYahooConfiguration(),
)
}
private fun createAolConfiguration(): Pair<List<String>, OAuthConfiguration> {
return listOf(
"imap.aol.com",
"smtp.aol.com",
) to OAuthConfiguration(
clientId = "dj0yJmk9cHYydkJkTUxHcXlYJmQ9WVdrOWVHZHhVVXN4VVV3bWNHbzlNQT09JnM9Y29uc3VtZXJzZWNyZXQmc3Y9MCZ4PTdm",
scopes = listOf("mail-w"),
authorizationEndpoint = "https://api.login.aol.com/oauth2/request_auth",
tokenEndpoint = "https://api.login.aol.com/oauth2/get_token",
redirectUri = "${BuildConfig.APPLICATION_ID}://oauth2redirect",
)
}
private fun createFastmailConfiguration(): Pair<List<String>, OAuthConfiguration> {
return listOf(
"imap.fastmail.com",
"smtp.fastmail.com",
) to OAuthConfiguration(
clientId = "353641ae",
scopes = listOf("https://www.fastmail.com/dev/protocol-imap", "https://www.fastmail.com/dev/protocol-smtp"),
authorizationEndpoint = "https://api.fastmail.com/oauth/authorize",
tokenEndpoint = "https://api.fastmail.com/oauth/refresh",
redirectUri = "${BuildConfig.APPLICATION_ID}://oauth2redirect",
)
}
private fun createGmailConfiguration(): Pair<List<String>, OAuthConfiguration> {
return listOf(
"imap.gmail.com",
"imap.googlemail.com",
"smtp.gmail.com",
"smtp.googlemail.com",
) to OAuthConfiguration(
clientId = "262622259280-5qb3vtj68d5dtudmaif4g9vd3cpar8r3.apps.googleusercontent.com",
scopes = listOf("https://mail.google.com/"),
authorizationEndpoint = "https://accounts.google.com/o/oauth2/v2/auth",
tokenEndpoint = "https://oauth2.googleapis.com/token",
redirectUri = "${BuildConfig.APPLICATION_ID}:/oauth2redirect",
)
}
private fun createMicrosoftConfiguration(): Pair<List<String>, OAuthConfiguration> {
return listOf(
"outlook.office365.com",
"smtp.office365.com",
"smtp-mail.outlook.com",
) to OAuthConfiguration(
clientId = "e647013a-ada4-4114-b419-e43d250f99c5",
scopes = listOf(
"openid",
"email",
"https://outlook.office.com/IMAP.AccessAsUser.All",
"https://outlook.office.com/SMTP.Send",
"offline_access",
),
authorizationEndpoint = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
tokenEndpoint = "https://login.microsoftonline.com/common/oauth2/v2.0/token",
redirectUri = "msauth://com.fsck.k9.debug/VZF2DYuLYAu4TurFd6usQB2JPts%3D",
)
}
private fun createYahooConfiguration(): Pair<List<String>, OAuthConfiguration> {
return listOf(
"imap.mail.yahoo.com",
"smtp.mail.yahoo.com",
) to OAuthConfiguration(
clientId = "dj0yJmk9ejRCRU1ybmZjQlVBJmQ9WVdrOVVrZEViak4xYmxZbWNHbzlNQT09JnM9Y29uc3VtZXJzZWNyZXQmc3Y9MCZ4PTZj",
scopes = listOf("mail-w"),
authorizationEndpoint = "https://api.login.yahoo.com/oauth2/request_auth",
tokenEndpoint = "https://api.login.yahoo.com/oauth2/get_token",
redirectUri = "${BuildConfig.APPLICATION_ID}://oauth2redirect",
)
}
}

View file

@ -0,0 +1,17 @@
package app.k9mail.dev
import app.k9mail.autodiscovery.api.AutoDiscovery
import app.k9mail.autodiscovery.demo.DemoAutoDiscovery
import com.fsck.k9.backend.BackendFactory
import org.koin.core.module.Module
import org.koin.core.qualifier.named
fun Module.developmentModuleAdditions() {
single { DemoBackendFactory(backendStorageFactory = get()) }
single<Map<String, BackendFactory>>(named("developmentBackends")) {
mapOf("demo" to get<DemoBackendFactory>())
}
single<List<AutoDiscovery>>(named("extraAutoDiscoveries")) {
listOf(DemoAutoDiscovery())
}
}

View file

@ -0,0 +1,14 @@
package app.k9mail.dev
import app.k9mail.backend.demo.DemoBackend
import com.fsck.k9.backend.BackendFactory
import com.fsck.k9.backend.api.Backend
import com.fsck.k9.mailstore.K9BackendStorageFactory
import net.thunderbird.core.android.account.LegacyAccount
class DemoBackendFactory(private val backendStorageFactory: K9BackendStorageFactory) : BackendFactory {
override fun createBackend(account: LegacyAccount): Backend {
val backendStorage = backendStorageFactory.createBackendStorage(account)
return DemoBackend(backendStorage)
}
}

View file

@ -0,0 +1,21 @@
package app.k9mail.featureflag
import net.thunderbird.core.featureflag.FeatureFlag
import net.thunderbird.core.featureflag.FeatureFlagFactory
import net.thunderbird.core.featureflag.FeatureFlagKey
import net.thunderbird.core.featureflag.toFeatureFlagKey
class K9FeatureFlagFactory : FeatureFlagFactory {
override fun createFeatureCatalog(): List<FeatureFlag> {
return listOf(
FeatureFlag("archive_marks_as_read".toFeatureFlagKey(), enabled = true),
FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = true),
FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = true),
FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = true),
FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = true),
FeatureFlag("enable_dropdown_drawer_ui".toFeatureFlagKey(), enabled = true),
FeatureFlag(FeatureFlagKey.DisplayInAppNotifications, enabled = true),
FeatureFlag(FeatureFlagKey.UseNotificationSenderForSystemNotifications, enabled = true),
)
}
}

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="app_logo_main">#5917ff</color>
<color name="app_logo_highlight_light">#7a45ff</color>
<color name="app_logo_highlight_dark">#531ad8</color>
<color name="launcher_icon_background">#e3d9ff</color>
</resources>

View file

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto"
>
<application
android:name="app.k9mail.K9App"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.K9.Startup"
tools:replace="android:theme"
>
<activity
android:name="com.fsck.k9.ui.settings.account.OpenPgpAppSelectDialog"
android:configChanges="locale"
android:theme="@style/Theme.K9.DayNight.Dialog.Translucent"
/>
<activity
android:name="com.fsck.k9.ui.notification.DeleteConfirmationActivity"
android:excludeFromRecents="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/Theme.K9.DayNight.Dialog.Translucent"
/>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge"
>
<!-- We're using on-demand initialization for WorkManager -->
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove"
/>
</provider>
<!-- This component is disabled by default (if possible). It will be enabled programmatically if necessary. -->
<!-- IMPORTANT: The component name must be `com.fsck.k9.widget.list.MessageListWidgetProvider` and can't be changed. -->
<receiver
android:name="com.fsck.k9.widget.list.MessageListWidgetProvider"
android:icon="@drawable/message_list_widget_preview"
android:label="@string/message_list_widget_label"
android:enabled="@bool/home_screen_widgets_enabled"
android:exported="false"
>
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/message_list_widget_info"
/>
</receiver>
<!-- This component is disabled by default (if possible). It will be enabled programmatically if necessary. -->
<!-- IMPORTANT: The component name must be `com.fsck.k9.provider.UnreadWidgetProvider` and can't be changed. -->
<receiver
android:name="com.fsck.k9.provider.UnreadWidgetProvider"
android:label="@string/unread_widget_label"
android:enabled="@bool/home_screen_widgets_enabled"
android:exported="false"
>
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/unread_widget_info"
/>
</receiver>
</application>
</manifest>

View file

@ -0,0 +1,8 @@
package app.k9mail
import net.thunderbird.app.common.BaseApplication
import org.koin.core.module.Module
class K9App : BaseApplication() {
override fun provideAppModule(): Module = appModule
}

View file

@ -0,0 +1,45 @@
package app.k9mail
import app.k9mail.auth.K9OAuthConfigurationFactory
import app.k9mail.dev.developmentModuleAdditions
import app.k9mail.feature.featureModule
import app.k9mail.feature.widget.shortcut.LauncherShortcutActivity
import app.k9mail.featureflag.K9FeatureFlagFactory
import app.k9mail.provider.providerModule
import app.k9mail.widget.widgetModule
import com.fsck.k9.AppConfig
import com.fsck.k9.BuildConfig
import com.fsck.k9.DefaultAppConfig
import com.fsck.k9.activity.MessageCompose
import com.fsck.k9.provider.UnreadWidgetProvider
import com.fsck.k9.widget.list.MessageListWidgetProvider
import net.thunderbird.app.common.appCommonModule
import net.thunderbird.core.common.oauth.OAuthConfigurationFactory
import net.thunderbird.core.featureflag.FeatureFlagFactory
import org.koin.core.qualifier.named
import org.koin.dsl.module
val appModule = module {
includes(appCommonModule)
includes(widgetModule)
includes(featureModule)
includes(providerModule)
single(named("ClientInfoAppName")) { BuildConfig.CLIENT_INFO_APP_NAME }
single(named("ClientInfoAppVersion")) { BuildConfig.VERSION_NAME }
single<AppConfig> { appConfig }
single<OAuthConfigurationFactory> { K9OAuthConfigurationFactory() }
single<FeatureFlagFactory> { K9FeatureFlagFactory() }
developmentModuleAdditions()
}
val appConfig = DefaultAppConfig(
componentsToDisable = listOf(
MessageCompose::class.java,
LauncherShortcutActivity::class.java,
UnreadWidgetProvider::class.java,
MessageListWidgetProvider::class.java,
),
)

View file

@ -0,0 +1,21 @@
package app.k9mail.feature
import app.k9mail.feature.funding.api.FundingSettings
import app.k9mail.feature.funding.featureFundingModule
import app.k9mail.feature.migration.launcher.featureMigrationModule
import app.k9mail.feature.onboarding.migration.onboardingMigrationModule
import app.k9mail.feature.telemetry.telemetryModule
import net.thunderbird.feature.account.settings.featureAccountSettingsModule
import net.thunderbird.feature.mail.message.list.featureMessageListModule
import org.koin.dsl.module
val featureModule = module {
includes(featureAccountSettingsModule)
includes(telemetryModule)
includes(featureFundingModule)
includes(onboardingMigrationModule)
includes(featureMigrationModule)
includes(featureMessageListModule)
single<FundingSettings> { K9FundingSettings() }
}

View file

@ -0,0 +1,27 @@
package app.k9mail.feature
import app.k9mail.feature.funding.api.FundingSettings
import com.fsck.k9.K9
internal class K9FundingSettings : FundingSettings {
override fun getReminderReferenceTimestamp(): Long = K9.fundingReminderReferenceTimestamp
override fun setReminderReferenceTimestamp(timestamp: Long) {
K9.fundingReminderReferenceTimestamp = timestamp
K9.saveSettingsAsync()
}
override fun getReminderShownTimestamp() = K9.fundingReminderShownTimestamp
override fun setReminderShownTimestamp(timestamp: Long) {
K9.fundingReminderShownTimestamp = timestamp
K9.saveSettingsAsync()
}
override fun getActivityCounterInMillis(): Long = K9.fundingActivityCounterInMillis
override fun setActivityCounterInMillis(activeTime: Long) {
K9.fundingActivityCounterInMillis = activeTime
K9.saveSettingsAsync()
}
}

View file

@ -0,0 +1,21 @@
package app.k9mail.provider
import android.content.Context
import com.fsck.k9.R
import com.fsck.k9.preferences.FilePrefixProvider
import net.thunderbird.core.common.provider.AppNameProvider
import net.thunderbird.core.common.provider.BrandNameProvider
internal class K9AppNameProvider(
context: Context,
) : AppNameProvider, BrandNameProvider, FilePrefixProvider {
override val appName: String by lazy {
context.getString(R.string.app_name)
}
override val brandName: String by lazy {
context.getString(R.string.app_name)
}
override val filePrefix: String = "k9"
}

View file

@ -0,0 +1,21 @@
package app.k9mail.provider
import androidx.compose.runtime.Composable
import app.k9mail.core.ui.compose.theme2.k9mail.K9MailTheme2
import net.thunderbird.core.ui.theme.api.FeatureThemeProvider
internal class K9FeatureThemeProvider : FeatureThemeProvider {
@Composable
override fun WithTheme(content: @Composable () -> Unit) {
K9MailTheme2 {
content()
}
}
@Composable
override fun WithTheme(darkTheme: Boolean, content: @Composable () -> Unit) {
K9MailTheme2(darkTheme = darkTheme) {
content()
}
}
}

View file

@ -0,0 +1,12 @@
package app.k9mail.provider
import com.fsck.k9.R
import net.thunderbird.core.ui.theme.api.ThemeProvider
internal class K9ThemeProvider : ThemeProvider {
override val appThemeResourceId = R.style.Theme_K9_DayNight
override val appLightThemeResourceId = R.style.Theme_K9_Light
override val appDarkThemeResourceId = R.style.Theme_K9_Dark
override val dialogThemeResourceId = R.style.Theme_K9_DayNight_Dialog
override val translucentDialogThemeResourceId = R.style.Theme_K9_DayNight_Dialog_Translucent
}

View file

@ -0,0 +1,20 @@
package app.k9mail.provider
import com.fsck.k9.preferences.FilePrefixProvider
import net.thunderbird.core.common.provider.AppNameProvider
import net.thunderbird.core.common.provider.BrandNameProvider
import net.thunderbird.core.ui.theme.api.FeatureThemeProvider
import net.thunderbird.core.ui.theme.api.ThemeProvider
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.binds
import org.koin.dsl.module
internal val providerModule = module {
single {
K9AppNameProvider(androidContext())
} binds arrayOf(AppNameProvider::class, BrandNameProvider::class, FilePrefixProvider::class)
single<ThemeProvider> { K9ThemeProvider() }
single<FeatureThemeProvider> { K9FeatureThemeProvider() }
}

View file

@ -0,0 +1,8 @@
package app.k9mail.widget
import app.k9mail.feature.widget.message.list.MessageListWidgetConfig
import com.fsck.k9.widget.list.MessageListWidgetProvider
class K9MessageListWidgetConfig : MessageListWidgetConfig {
override val providerClass = MessageListWidgetProvider::class.java
}

View file

@ -0,0 +1,8 @@
package app.k9mail.widget
import app.k9mail.feature.widget.unread.UnreadWidgetConfig
import com.fsck.k9.provider.UnreadWidgetProvider
class K9UnreadWidgetConfig : UnreadWidgetConfig {
override val providerClass = UnreadWidgetProvider::class.java
}

View file

@ -0,0 +1,13 @@
package app.k9mail.widget
import app.k9mail.feature.widget.message.list.MessageListWidgetConfig
import app.k9mail.feature.widget.unread.UnreadWidgetConfig
import net.thunderbird.feature.widget.message.list.featureWidgetMessageListModule
import org.koin.dsl.module
internal val widgetModule = module {
includes(featureWidgetMessageListModule)
single<MessageListWidgetConfig> { K9MessageListWidgetConfig() }
single<UnreadWidgetConfig> { K9UnreadWidgetConfig() }
}

View file

@ -0,0 +1,11 @@
package com.fsck.k9.provider
import app.k9mail.feature.widget.unread.BaseUnreadWidgetProvider
/**
* IMPORTANT: The fully qualified name for this class must be
* `com.fsck.k9.provider.UnreadWidgetProvider`.
* Otherwise widgets created with older versions of the app using a different name
* will stop working or disappear.
*/
class UnreadWidgetProvider : BaseUnreadWidgetProvider()

View file

@ -0,0 +1,11 @@
package com.fsck.k9.widget.list
import app.k9mail.feature.widget.message.list.BaseMessageListWidgetProvider
/**
* IMPORTANT: The fully qualified name for this class must be
* `com.fsck.k9.widget.list.MessageListWidgetProvider`.
* Otherwise widgets created with older versions of the app using a different name
* will stop working or disappear.
*/
class MessageListWidgetProvider : BaseMessageListWidgetProvider()

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">بريد K-9</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">Пошта K-9</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Поща</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">K-9 মেইল</string>
</resources>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Retpoŝtilo</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">نامهٔ کی۹</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">Courriel K-9</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">K-9 Post</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">Post K-9</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">કે-૯ મેલ</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">के-9 मेल</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Նամակ</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">Surel K-9</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 - Póstur</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 דוא\"ל</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Imayl K-9</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">K-9 Пошта</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 메일</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 paštas</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 pasts</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 E-post</string>
</resources>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.K9.DayNight" parent="Theme.K9.Dark" />
<style name="Theme.K9.DayNight.Dialog" parent="Theme.K9.Dark.Dialog" />
<style name="Theme.K9.DayNight.Dialog.Translucent" parent="Theme.K9.Dark.Dialog.Translucent" />
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 e-post</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Email K-9</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">Почта K-9</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">Pošta K-9</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 அஞ்சல்</string>
</resources>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Posta</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">Thư K-9</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_webpage_url" translatable="false">https://k9mail.app/</string>
<string name="user_forum_url" translatable="false">https://forum.k9mail.app/</string>
<string name="funding_url" translatable="false">https://www.thunderbird.net/donate/mobile/?form=k9mail&amp;utm_source=%s&amp;utm_medium=android_app&amp;utm_campaign=inapp_appeal_v2</string>
<string name="message_header_mua" translatable="false">K-9 Mail for Android</string>
<string name="thunderbird_website_domain" translatable="false">www.thunderbird.net</string>
<string name="thunderbird_website_url" translatable="false">https://www.thunderbird.net</string>
</resources>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- These are the funding feature overwrites that are K-9 specific -->
<string name="funding_googleplay_contribution_title">Support K-9 Mail</string>
<string name="funding_googleplay_contribution_header_title">Support K-9 Mail</string>
<string name="funding_googleplay_contribution_header_description">We never show ads or sell your data. We are entirely funded by individual contributions from users like you. If youre enjoying K-9 Mail, please help support it. We cant do this without you!</string>
<string name="funding_googleplay_contribution_header_thank_you_message">Your contribution furthers the development of secure, private and open-source email. We are truly grateful to have you with us!</string>
<string name="funding_googleplay_contribution_list_empty_message">K-9 Mail is developed by Thunderbird.\nVisit <xliff:g id="link_text">%s</xliff:g> for more ways to support our work.</string>
<string name="funding_googleplay_contribution_reminder_title">Support K-9 Mail</string>
<string name="funding_googleplay_contribution_reminder_statement">K-9 Mail is free and open source.</string>
</resources>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Please keep the K-9 Mail format and just localize the mail part if possible. -->
<string name="app_name">K-9 Mail</string>
</resources>

View file

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="Theme.K9.Startup" parent="Theme2.Main.Startup" />
<style name="Theme.K9.Light" parent="Theme2.K9.Light">
<item name="actionModeCloseDrawable">@drawable/ic_close</item>
<item name="actionBarPopupTheme">@style/Widget.App.ActionMode.PopupMenu</item>
<item name="toolbarStyle">@style/Widget.App.Toolbar</item>
<!-- Legacy styles -->
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
<item name="iconStarColor">#fbbc04</item>
<item name="textColorPrimaryRecipientDropdown">@android:color/primary_text_light</item>
<item name="textColorSecondaryRecipientDropdown">@android:color/secondary_text_light</item>
<item name="messageListSwipeSelectColor">@color/material_blue_600</item>
<item name="messageListSwipeToggleReadColor">@color/material_blue_600</item>
<item name="messageListSwipeToggleStarColor">@color/material_orange_600</item>
<item name="messageListSwipeArchiveColor">@color/material_green_600</item>
<item name="messageListSwipeDeleteColor">@color/material_red_600</item>
<item name="messageListSwipeSpamColor">@color/material_red_700</item>
<item name="messageListSwipeMoveColor">@color/material_purple_500</item>
<item name="contactPictureFallbackDefaultBackgroundColor">#ffababab</item>
<item name="contactPictureFallbackBackgroundColors">@array/contact_picture_fallback_background_colors_light</item>
<item name="contactTokenBackgroundColor">#ccc</item>
<item name="tintColorBulletPointPositive">#77aa22</item>
<item name="tintColorBulletPointNegative">#dd2222</item>
<item name="tintColorBulletPointNeutral">#888</item>
<item name="openpgp_black">#000</item>
<item name="openpgp_orange">#FF8800</item>
<item name="openpgp_red">#CC0000</item>
<item name="openpgp_green">#669900</item>
<item name="openpgp_blue">#336699</item>
<item name="openpgp_grey">#bbb</item>
<item name="openpgp_dark_grey">#888</item>
</style>
<style name="Theme.K9.Dark" parent="Theme2.K9.Dark">
<item name="actionModeCloseDrawable">@drawable/ic_close</item>
<item name="actionBarPopupTheme">@style/Widget.App.ActionMode.PopupMenu</item>
<item name="toolbarStyle">@style/Widget.App.Toolbar</item>
<!-- Legacy styles -->
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
<item name="iconStarColor">#fdd663</item>
<item name="textColorPrimaryRecipientDropdown">@android:color/primary_text_dark</item>
<item name="textColorSecondaryRecipientDropdown">@android:color/secondary_text_dark</item>
<item name="messageListSwipeSelectColor">@color/material_blue_700</item>
<item name="messageListSwipeToggleReadColor">@color/material_blue_700</item>
<item name="messageListSwipeToggleStarColor">@color/material_orange_700</item>
<item name="messageListSwipeArchiveColor">@color/material_green_700</item>
<item name="messageListSwipeDeleteColor">@color/material_red_700</item>
<item name="messageListSwipeSpamColor">@color/material_red_800</item>
<item name="messageListSwipeMoveColor">@color/material_purple_600</item>
<item name="contactTokenBackgroundColor">#313131</item>
<item name="contactPictureFallbackDefaultBackgroundColor">#ff606060</item>
<item name="contactPictureFallbackBackgroundColors">@array/contact_picture_fallback_background_colors_dark</item>
<item name="tintColorBulletPointPositive">#77aa22</item>
<item name="tintColorBulletPointNegative">#dd2222</item>
<item name="tintColorBulletPointNeutral">#bbb</item>
<item name="openpgp_black">#fff</item>
<item name="openpgp_orange">#ee7700</item>
<item name="openpgp_red">#CC0000</item>
<item name="openpgp_green">#77aa00</item>
<item name="openpgp_blue">#6699cc</item>
<item name="openpgp_grey">#888</item>
<item name="openpgp_dark_grey">#bbb</item>
</style>
<style name="Theme.K9.Light.Dialog.Translucent" parent="Theme.Material3.Light.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
<item name="tintColorBulletPointPositive">#77aa22</item>
<item name="tintColorBulletPointNegative">#dd2222</item>
<item name="tintColorBulletPointNeutral">#bbb</item>
</style>
<style name="Theme.K9.Light.Dialog" parent="Theme.K9.Light" />
<style name="Theme.K9.Dark.Dialog" parent="Theme.K9.Dark" />
<style name="Theme.K9.Dark.Dialog.Translucent" parent="Theme.Material3.Dark.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
<item name="tintColorBulletPointPositive">#77aa22</item>
<item name="tintColorBulletPointNegative">#dd2222</item>
<item name="tintColorBulletPointNeutral">#bbb</item>
</style>
<style name="Theme.K9.DayNight" parent="Theme.K9.Light" />
<style name="Theme.K9.DayNight.Dialog" parent="Theme.K9.Light.Dialog" />
<style name="Theme.K9.DayNight.Dialog.Translucent" parent="Theme.K9.Light.Dialog.Translucent" />
</resources>

View file

@ -0,0 +1,92 @@
package app.k9mail.auth
import com.fsck.k9.BuildConfig
import net.thunderbird.core.common.oauth.OAuthConfiguration
import net.thunderbird.core.common.oauth.OAuthConfigurationFactory
@Suppress("ktlint:standard:max-line-length")
class K9OAuthConfigurationFactory : OAuthConfigurationFactory {
override fun createConfigurations(): Map<List<String>, OAuthConfiguration> {
return mapOf(
createAolConfiguration(),
createFastmailConfiguration(),
createGmailConfiguration(),
createMicrosoftConfiguration(),
createYahooConfiguration(),
)
}
private fun createAolConfiguration(): Pair<List<String>, OAuthConfiguration> {
return listOf(
"imap.aol.com",
"smtp.aol.com",
) to OAuthConfiguration(
clientId = "dj0yJmk9dUNqYXZhYWxOYkdRJmQ9WVdrOU1YQnZVRFZoY1ZrbWNHbzlNQT09JnM9Y29uc3VtZXJzZWNyZXQmc3Y9MCZ4PWIw",
scopes = listOf("mail-w"),
authorizationEndpoint = "https://api.login.aol.com/oauth2/request_auth",
tokenEndpoint = "https://api.login.aol.com/oauth2/get_token",
redirectUri = "${BuildConfig.APPLICATION_ID}://oauth2redirect",
)
}
private fun createFastmailConfiguration(): Pair<List<String>, OAuthConfiguration> {
return listOf(
"imap.fastmail.com",
"smtp.fastmail.com",
) to OAuthConfiguration(
clientId = "353641ae",
scopes = listOf("https://www.fastmail.com/dev/protocol-imap", "https://www.fastmail.com/dev/protocol-smtp"),
authorizationEndpoint = "https://api.fastmail.com/oauth/authorize",
tokenEndpoint = "https://api.fastmail.com/oauth/refresh",
redirectUri = "${BuildConfig.APPLICATION_ID}://oauth2redirect",
)
}
private fun createGmailConfiguration(): Pair<List<String>, OAuthConfiguration> {
return listOf(
"imap.gmail.com",
"imap.googlemail.com",
"smtp.gmail.com",
"smtp.googlemail.com",
) to OAuthConfiguration(
clientId = "262622259280-hhmh92rhklkg2k1tjil69epo0o9a12jm.apps.googleusercontent.com",
scopes = listOf("https://mail.google.com/"),
authorizationEndpoint = "https://accounts.google.com/o/oauth2/v2/auth",
tokenEndpoint = "https://oauth2.googleapis.com/token",
redirectUri = "${BuildConfig.APPLICATION_ID}:/oauth2redirect",
)
}
private fun createMicrosoftConfiguration(): Pair<List<String>, OAuthConfiguration> {
return listOf(
"outlook.office365.com",
"smtp.office365.com",
"smtp-mail.outlook.com",
) to OAuthConfiguration(
clientId = "e647013a-ada4-4114-b419-e43d250f99c5",
scopes = listOf(
"openid",
"email",
"https://outlook.office.com/IMAP.AccessAsUser.All",
"https://outlook.office.com/SMTP.Send",
"offline_access",
),
authorizationEndpoint = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
tokenEndpoint = "https://login.microsoftonline.com/common/oauth2/v2.0/token",
redirectUri = "msauth://com.fsck.k9/Dx8yUsuhyU3dYYba1aA16Wxu5eM%3D",
)
}
private fun createYahooConfiguration(): Pair<List<String>, OAuthConfiguration> {
return listOf(
"imap.mail.yahoo.com",
"smtp.mail.yahoo.com",
) to OAuthConfiguration(
clientId = "dj0yJmk9aHNUb3d2MW5TQnpRJmQ9WVdrOWVYbHpaRWM0YkdnbWNHbzlNQT09JnM9Y29uc3VtZXJzZWNyZXQmc3Y9MCZ4PWIz",
scopes = listOf("mail-w"),
authorizationEndpoint = "https://api.login.yahoo.com/oauth2/request_auth",
tokenEndpoint = "https://api.login.yahoo.com/oauth2/get_token",
redirectUri = "${BuildConfig.APPLICATION_ID}://oauth2redirect",
)
}
}

View file

@ -0,0 +1,15 @@
package app.k9mail.dev
import app.k9mail.autodiscovery.api.AutoDiscovery
import com.fsck.k9.backend.BackendFactory
import org.koin.core.module.Module
import org.koin.core.qualifier.named
fun Module.developmentModuleAdditions() {
single<Map<String, BackendFactory>>(named("developmentBackends")) {
emptyMap()
}
single<List<AutoDiscovery>>(named("extraAutoDiscoveries")) {
emptyList()
}
}

View file

@ -0,0 +1,21 @@
package app.k9mail.featureflag
import net.thunderbird.core.featureflag.FeatureFlag
import net.thunderbird.core.featureflag.FeatureFlagFactory
import net.thunderbird.core.featureflag.FeatureFlagKey
import net.thunderbird.core.featureflag.toFeatureFlagKey
class K9FeatureFlagFactory : FeatureFlagFactory {
override fun createFeatureCatalog(): List<FeatureFlag> {
return listOf(
FeatureFlag("archive_marks_as_read".toFeatureFlagKey(), enabled = false),
FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = false),
FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = false),
FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = false),
FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = true),
FeatureFlag("enable_dropdown_drawer_ui".toFeatureFlagKey(), enabled = false),
FeatureFlag(FeatureFlagKey.DisplayInAppNotifications, enabled = false),
FeatureFlag(FeatureFlagKey.UseNotificationSenderForSystemNotifications, enabled = false),
)
}
}

View file

@ -0,0 +1,65 @@
package app.k9mail
import android.app.Application
import android.app.NotificationManager
import android.content.Context
import android.content.res.AssetManager
import android.content.res.Configuration
import android.content.res.Resources
import android.util.DisplayMetrics
import androidx.lifecycle.LifecycleOwner
import androidx.work.WorkerParameters
import app.k9mail.feature.account.common.domain.entity.InteractionMode
import com.fsck.k9.account.AccountRemoverWorker
import com.fsck.k9.job.MailSyncWorker
import com.fsck.k9.job.SyncDebugWorker
import com.fsck.k9.mailstore.AttachmentResolver
import com.fsck.k9.message.html.DisplayHtml
import com.fsck.k9.message.html.HtmlSettings
import com.fsck.k9.ui.changelog.ChangeLogMode
import com.fsck.k9.ui.changelog.ChangelogViewModel
import com.fsck.k9.view.K9WebViewClient
import com.fsck.k9.view.MessageWebView
import net.openid.appauth.AppAuthConfiguration
import net.thunderbird.core.preference.storage.Storage
import net.thunderbird.feature.account.AccountId
import net.thunderbird.feature.mail.message.list.ui.dialog.SetupArchiveFolderDialogContract
import org.junit.Test
import org.koin.core.annotation.KoinExperimentalAPI
import org.koin.test.verify.definition
import org.koin.test.verify.injectedParameters
import org.koin.test.verify.verify
import org.openintents.openpgp.OpenPgpApiManager
class DependencyInjectionTest {
@OptIn(KoinExperimentalAPI::class)
@Test
fun testDependencyTree() {
appModule.verify(
extraTypes = listOf(
AccountId::class,
AppAuthConfiguration::class,
Application::class,
AssetManager::class,
Configuration::class,
Context::class,
DisplayMetrics::class,
InteractionMode::class,
NotificationManager::class,
Resources::class,
Storage::class,
),
injections = injectedParameters(
definition<AccountRemoverWorker>(WorkerParameters::class),
definition<ChangelogViewModel>(ChangeLogMode::class),
definition<DisplayHtml>(HtmlSettings::class),
definition<K9WebViewClient>(AttachmentResolver::class, MessageWebView.OnPageFinishedListener::class),
definition<MailSyncWorker>(WorkerParameters::class),
definition<SyncDebugWorker>(WorkerParameters::class),
definition<OpenPgpApiManager>(LifecycleOwner::class),
definition<SetupArchiveFolderDialogContract.ViewModel>(SetupArchiveFolderDialogContract.State::class),
),
)
}
}