diff --git a/README.md b/README.md
index 60de626c1..6986408bb 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
Installs and updates the following browsers:
-Browsers from Mozilla or based on Firefox:
+Software from Mozilla or based on Firefox:
- [Fennec F-Droid](https://f-droid.org/packages/org.mozilla.fennec_fdroid/)
- [Firefox Browser](https://play.google.com/store/apps/details?id=org.mozilla.firefox),
@@ -22,6 +22,9 @@ Browsers from Mozilla or based on Firefox:
- [Iceraven](https://github.com/fork-maintainers/iceraven-browser)
- [Tor Browser](https://www.torproject.org/download),
[Tor Browser Alpha](https://www.torproject.org/download/alpha/)
+- [Thunderbird for Android](https://play.google.com/store/apps/details?id=net.thunderbird.android),
+ [Thunderbird for Android Beta](https://play.google.com/store/apps/details?id=net.thunderbird.android.beta)
+ ([GitHub Repository](https://github.com/thunderbird/thunderbird-android/))
Good privacy browsers:
@@ -44,7 +47,7 @@ Browser which are better than Google Chrome:
Other applications:
- [FairEmail](https://github.com/M66B/FairEmail)
-- [K-9 Mail / Thunderbird Android](https://github.com/k9mail/k9mail.app)
+- [K-9 Mail](https://k9mail.app)
- [Orbot](https://github.com/guardianproject/orbot)
FFUpdater checks for updates in the background and downloads them as well. Apps can be updated without user
diff --git a/ffupdater/src/main/AndroidManifest.xml b/ffupdater/src/main/AndroidManifest.xml
index 655a2bc21..4b8f8bbc7 100644
--- a/ffupdater/src/main/AndroidManifest.xml
+++ b/ffupdater/src/main/AndroidManifest.xml
@@ -59,6 +59,8 @@
+
+
diff --git a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/App.kt b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/App.kt
index 5d157e073..a84539081 100644
--- a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/App.kt
+++ b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/App.kt
@@ -26,6 +26,8 @@ import de.marmaro.krt.ffupdater.app.impl.MullFromRepo
import de.marmaro.krt.ffupdater.app.impl.Orbot
import de.marmaro.krt.ffupdater.app.impl.PrivacyBrowser
import de.marmaro.krt.ffupdater.app.impl.Thorium
+import de.marmaro.krt.ffupdater.app.impl.ThunderbirdRelease
+import de.marmaro.krt.ffupdater.app.impl.ThunderbirdBeta
import de.marmaro.krt.ffupdater.app.impl.TorBrowser
import de.marmaro.krt.ffupdater.app.impl.TorBrowserAlpha
import de.marmaro.krt.ffupdater.app.impl.Vivaldi
@@ -56,6 +58,8 @@ enum class App {
ORBOT,
PRIVACY_BROWSER,
THORIUM,
+ THUNDERBIRD,
+ THUNDERBIRD_BETA,
TOR_BROWSER,
TOR_BROWSER_ALPHA,
VIVALDI,
@@ -88,6 +92,8 @@ enum class App {
ORBOT -> Orbot
PRIVACY_BROWSER -> PrivacyBrowser
THORIUM -> Thorium
+ THUNDERBIRD -> ThunderbirdRelease
+ THUNDERBIRD_BETA -> ThunderbirdBeta
TOR_BROWSER -> TorBrowser
TOR_BROWSER_ALPHA -> TorBrowserAlpha
VIVALDI -> Vivaldi
diff --git a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxBeta.kt b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxBeta.kt
index 7540a116f..d56ef9c22 100644
--- a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxBeta.kt
+++ b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxBeta.kt
@@ -24,8 +24,8 @@ object FirefoxBeta : AppBase() {
override val packageName = "org.mozilla.firefox_beta"
override val title = R.string.firefox_beta__title
override val description = R.string.firefox_beta__description
- override val installationWarning = R.string.firefox_beta__warning
- override val downloadSource = "Github"
+ override val installationWarning = R.string.generic_beta__warning
+ override val downloadSource = "Mozilla Archive"
override val icon = R.drawable.ic_logo_firefox_beta
override val minApiLevel = Build.VERSION_CODES.LOLLIPOP
override val supportedAbis = ARM32_ARM64_X86_X64
diff --git a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxFocus.kt b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxFocus.kt
index 49b097a37..9aaab5965 100644
--- a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxFocus.kt
+++ b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxFocus.kt
@@ -24,7 +24,7 @@ object FirefoxFocus : AppBase() {
override val packageName = "org.mozilla.focus"
override val title = R.string.firefox_focus__title
override val description = R.string.firefox_focus__description
- override val downloadSource = "GitHub"
+ override val downloadSource = "Mozilla Archive"
override val icon = R.drawable.ic_logo_firefox_focus_klar
override val minApiLevel = Build.VERSION_CODES.LOLLIPOP
override val supportedAbis = ARM32_ARM64_X86_X64
diff --git a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxFocusBeta.kt b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxFocusBeta.kt
index 9fb14075b..aff3b8f09 100644
--- a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxFocusBeta.kt
+++ b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxFocusBeta.kt
@@ -25,7 +25,7 @@ object FirefoxFocusBeta : AppBase() {
override val title = R.string.firefox_focus_beta__title
override val description = R.string.firefox_focus_beta__description
override val installationWarning = R.string.generic_app_warning__beta_version
- override val downloadSource = "GitHub"
+ override val downloadSource = "Mozilla Archive"
override val icon = R.drawable.ic_logo_firefox_focus_beta
override val minApiLevel = Build.VERSION_CODES.LOLLIPOP
override val supportedAbis = ARM32_ARM64_X86_X64
diff --git a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxKlar.kt b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxKlar.kt
index 23b861604..cc43f30ae 100644
--- a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxKlar.kt
+++ b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxKlar.kt
@@ -24,7 +24,7 @@ object FirefoxKlar : AppBase() {
override val packageName = "org.mozilla.klar"
override val title = R.string.firefox_klar__title
override val description = R.string.firefox_klar__description
- override val downloadSource = "GitHub"
+ override val downloadSource = "Mozilla Archive"
override val icon = R.drawable.ic_logo_firefox_focus_klar
override val minApiLevel = Build.VERSION_CODES.LOLLIPOP
override val supportedAbis = ARM32_ARM64_X86_X64
diff --git a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxRelease.kt b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxRelease.kt
index 8cae27c8c..d61a9b324 100644
--- a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxRelease.kt
+++ b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/FirefoxRelease.kt
@@ -25,7 +25,7 @@ object FirefoxRelease : AppBase() {
override val title = R.string.firefox_release__title
override val description = R.string.firefox_release__description
override val installationWarning = R.string.firefox_release__warning
- override val downloadSource = "GitHub"
+ override val downloadSource = "Mozilla Archive"
override val icon = R.drawable.ic_logo_firefox_release
override val minApiLevel = Build.VERSION_CODES.LOLLIPOP
override val supportedAbis = ARM32_ARM64_X86_X64
diff --git a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/ThunderbirdBeta.kt b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/ThunderbirdBeta.kt
new file mode 100644
index 000000000..032b7c1a1
--- /dev/null
+++ b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/ThunderbirdBeta.kt
@@ -0,0 +1,61 @@
+package de.marmaro.krt.ffupdater.app.impl
+
+import android.content.Context
+import android.os.Build
+import androidx.annotation.Keep
+import androidx.annotation.MainThread
+import de.marmaro.krt.ffupdater.R
+import de.marmaro.krt.ffupdater.app.App
+import de.marmaro.krt.ffupdater.app.entity.DisplayCategory.FROM_MOZILLA
+import de.marmaro.krt.ffupdater.app.entity.LatestVersion
+import de.marmaro.krt.ffupdater.app.entity.Version
+import de.marmaro.krt.ffupdater.device.DeviceAbiExtractor
+import de.marmaro.krt.ffupdater.network.exceptions.NetworkException
+import de.marmaro.krt.ffupdater.network.github.GithubConsumer
+import de.marmaro.krt.ffupdater.network.website.MozillaArchiveConsumer
+import de.marmaro.krt.ffupdater.settings.DeviceSettingsHelper
+
+/**
+ * https://github.com/k9mail/k9mail.app
+ * https://github.com/thunderbird/thunderbird-android/releases
+ * https://api.github.com/repos/thunderbird/thunderbird-android/releases
+ */
+@Keep
+object ThunderbirdBeta : AppBase() {
+ override val app = App.THUNDERBIRD_BETA
+ override val packageName = "net.thunderbird.android.beta"
+ override val title = R.string.thunderbird_beta__title
+ override val description = R.string.thunderbird__description
+ override val installationWarning = R.string.generic_beta__warning
+ override val downloadSource = "Mozilla Archive"
+ override val icon = R.drawable.ic_logo_thunderbird_beta
+ override val minApiLevel = Build.VERSION_CODES.LOLLIPOP
+ override val supportedAbis = ARM32_ARM64_X86_X64
+ override val signatureHash = "056bfafb450249502fd9226228704c2529e1b822da06760d47a85c9557741fbd"
+ override val projectPage = "https://github.com/thunderbird/thunderbird-android"
+ override val displayCategory = listOf(FROM_MOZILLA)
+ override val hostnameForInternetCheck = "https://api.github.com"
+
+ @MainThread
+ @Throws(NetworkException::class)
+ override suspend fun fetchLatestUpdate(context: Context): LatestVersion {
+ val version = findLatestVersion()
+ val page = "https://archive.mozilla.org/pub/thunderbird-mobile/android/releases/$version/"
+ val downloadUrl = "${page}thunderbird-$version.apk"
+ val dateTime = MozillaArchiveConsumer.findDateTimeFromPage(page)
+ return LatestVersion(
+ downloadUrl = downloadUrl,
+ version = Version(version),
+ publishDate = dateTime.toString(),
+ exactFileSizeBytesOfDownload = null,
+ fileHash = null,
+ )
+ }
+
+ private suspend fun findLatestVersion(): String {
+ val url = "https://archive.mozilla.org/pub/thunderbird-mobile/android/releases/"
+ val versionRegex = Regex("""(\d+)\.(\d+b\d+)""")
+ val version = MozillaArchiveConsumer.findLatestVersion(url, versionRegex)
+ return version
+ }
+}
\ No newline at end of file
diff --git a/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/ThunderbirdRelease.kt b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/ThunderbirdRelease.kt
new file mode 100644
index 000000000..ff2af675a
--- /dev/null
+++ b/ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/ThunderbirdRelease.kt
@@ -0,0 +1,61 @@
+package de.marmaro.krt.ffupdater.app.impl
+
+import android.content.Context
+import android.os.Build
+import androidx.annotation.Keep
+import androidx.annotation.MainThread
+import de.marmaro.krt.ffupdater.R
+import de.marmaro.krt.ffupdater.app.App
+import de.marmaro.krt.ffupdater.app.entity.DisplayCategory.FROM_MOZILLA
+import de.marmaro.krt.ffupdater.app.entity.LatestVersion
+import de.marmaro.krt.ffupdater.app.entity.Version
+import de.marmaro.krt.ffupdater.device.DeviceAbiExtractor
+import de.marmaro.krt.ffupdater.network.exceptions.NetworkException
+import de.marmaro.krt.ffupdater.network.github.GithubConsumer
+import de.marmaro.krt.ffupdater.network.website.MozillaArchiveConsumer
+import de.marmaro.krt.ffupdater.settings.DeviceSettingsHelper
+
+/**
+ * https://github.com/k9mail/k9mail.app
+ * https://github.com/thunderbird/thunderbird-android/releases
+ * https://api.github.com/repos/thunderbird/thunderbird-android/releases
+ */
+@Keep
+object ThunderbirdRelease : AppBase() {
+ override val app = App.THUNDERBIRD
+ override val packageName = "net.thunderbird.android"
+ override val title = R.string.thunderbird__title
+ override val description = R.string.thunderbird__description
+ override val installationWarning: Int? = null
+ override val downloadSource = "Mozilla Archive"
+ override val icon = R.drawable.ic_logo_thunderbird
+ override val minApiLevel = Build.VERSION_CODES.LOLLIPOP
+ override val supportedAbis = ARM32_ARM64_X86_X64
+ override val signatureHash = "b6524779b3dbbc5ac17a5ac271ddb29dcfbf723578c238e03c3c217811356dd1"
+ override val projectPage = "https://github.com/thunderbird/thunderbird-android"
+ override val displayCategory = listOf(FROM_MOZILLA)
+ override val hostnameForInternetCheck = "https://api.github.com"
+
+ @MainThread
+ @Throws(NetworkException::class)
+ override suspend fun fetchLatestUpdate(context: Context): LatestVersion {
+ val version = findLatestVersion()
+ val page = "https://archive.mozilla.org/pub/thunderbird-mobile/android/releases/$version/"
+ val downloadUrl = "${page}thunderbird-$version.apk"
+ val dateTime = MozillaArchiveConsumer.findDateTimeFromPage(page)
+ return LatestVersion(
+ downloadUrl = downloadUrl,
+ version = Version(version),
+ publishDate = dateTime.toString(),
+ exactFileSizeBytesOfDownload = null,
+ fileHash = null,
+ )
+ }
+
+ private suspend fun findLatestVersion(): String {
+ val url = "https://archive.mozilla.org/pub/thunderbird-mobile/android/releases/"
+ val versionRegex = Regex("""(\d+)\.(\d+)\.?(\d+)?""")
+ val version = MozillaArchiveConsumer.findLatestVersion(url, versionRegex)
+ return version
+ }
+}
\ No newline at end of file
diff --git a/ffupdater/src/main/res/drawable/ic_logo_thunderbird.png b/ffupdater/src/main/res/drawable/ic_logo_thunderbird.png
new file mode 100644
index 000000000..9fe8d0dbf
Binary files /dev/null and b/ffupdater/src/main/res/drawable/ic_logo_thunderbird.png differ
diff --git a/ffupdater/src/main/res/drawable/ic_logo_thunderbird_beta.png b/ffupdater/src/main/res/drawable/ic_logo_thunderbird_beta.png
new file mode 100644
index 000000000..784354ce7
Binary files /dev/null and b/ffupdater/src/main/res/drawable/ic_logo_thunderbird_beta.png differ
diff --git a/ffupdater/src/main/res/values/strings.xml b/ffupdater/src/main/res/values/strings.xml
index ddc50b5d6..e6e83f415 100644
--- a/ffupdater/src/main/res/values/strings.xml
+++ b/ffupdater/src/main/res/values/strings.xml
@@ -9,6 +9,7 @@
Available: %1$s
Please report this error. Click to view the error report.
Background update check failed
+ - This is a beta app, designed for developers and testers. It may contain various bugs that can affect your experience.
Privately browse the internet, for free! The Brave Private Browser App is your fast, free, and safe private web browser with ad blocker and pop-up blocker. Privately browse and search the internet without being tracked by advertisers, malware and pop-ups.
Brave Private Browser
- Brave uses the technical foundation of Google Chrome and thus indirectly supports the monopoly position of the Chromium render engine.\n- Due to its Basic Attention Token BAT on the Ethereum blockchain the project has ties with cryptocurrency. Blockchains have many problems and should be avoided in my view.
@@ -48,7 +49,6 @@
Background errors
Firefox Browser for Android is automatically private and incredibly fast. Thousands of online trackers are following you every day, collecting information about where you go online and slowing down your speed. Firefox blocks over 2000 of these trackers by default and there are ad blocker add-ons available if you want to customize your browser even more. With Firefox, you’ll get the security you deserve and the speed you need in a private, mobile browser.
Firefox for Android Beta
- - This app is designed for developers and testers. It may contain various bugs that can affect your usual work with the browser.
This is a modification of the Firefox browser aimed to increase privacy.
Firefox Focus
Firefox Klar is developed for Germany, Austria and Switzerland, but can be used by users in any country. It is very similar to Firefox Focus, but the name was changed in German-speaking countries to avoid confusion with the magazine Focus by Hubert Burda Media group. Unlike Firefox Focus, Firefox Klar has telemetry disabled by default due to strict German privacy laws.
@@ -295,6 +295,9 @@
- Thorium uses the technical foundation of Google Chrome and thus indirectly supports the monopoly position of the Chromium render engine.
K-9 Mail
Full-featured email client
+ Thunderbird: Free Your Inbox
+ Thunderbird Beta for Testers
+ Thunderbird is a powerful, privacy-focused email app. Effortlessly manage multiple email accounts from one app, with a Unified Inbox option for maximum productivity. Built on open-source technology and supported by a dedicated team of developers alongside a global community of volunteers, Thunderbird never treats your private data as a product. Supported solely by financial contributions from our users, so you never have to see ads mixed in with your emails again.
FairEmail
Fully featured, open source, privacy friendly email app for Android
Self description: