2 次代碼提交 f59b56549b ... b2abea64cb

作者 SHA1 備註 提交日期
  Tobi823 b2abea64cb - remove support for Bromite, BromiteSystemWebView, Lockwise and UngoogledChromium Tobi823/ffupdater#621 4 月之前
  Tobi823 f450837749 - Kiwi is now EOL Tobi823/ffupdater#621 4 月之前

+ 28 - 9
ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/App.kt

@@ -1,15 +1,40 @@
 package de.marmaro.krt.ffupdater.app
 
 import androidx.annotation.Keep
-import de.marmaro.krt.ffupdater.app.impl.*
+import de.marmaro.krt.ffupdater.app.impl.AppBase
+import de.marmaro.krt.ffupdater.app.impl.Brave
+import de.marmaro.krt.ffupdater.app.impl.BraveBeta
+import de.marmaro.krt.ffupdater.app.impl.BraveNightly
+import de.marmaro.krt.ffupdater.app.impl.Chromium
+import de.marmaro.krt.ffupdater.app.impl.Cromite
+import de.marmaro.krt.ffupdater.app.impl.DuckDuckGoAndroid
+import de.marmaro.krt.ffupdater.app.impl.FFUpdater
+import de.marmaro.krt.ffupdater.app.impl.FairEmail
+import de.marmaro.krt.ffupdater.app.impl.FennecFdroid
+import de.marmaro.krt.ffupdater.app.impl.FirefoxBeta
+import de.marmaro.krt.ffupdater.app.impl.FirefoxFocus
+import de.marmaro.krt.ffupdater.app.impl.FirefoxFocusBeta
+import de.marmaro.krt.ffupdater.app.impl.FirefoxKlar
+import de.marmaro.krt.ffupdater.app.impl.FirefoxNightly
+import de.marmaro.krt.ffupdater.app.impl.FirefoxRelease
+import de.marmaro.krt.ffupdater.app.impl.Iceraven
+import de.marmaro.krt.ffupdater.app.impl.K9Mail
+import de.marmaro.krt.ffupdater.app.impl.Kiwi
+import de.marmaro.krt.ffupdater.app.impl.Mulch
+import de.marmaro.krt.ffupdater.app.impl.MulchSystemWebView
+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.TorBrowser
+import de.marmaro.krt.ffupdater.app.impl.TorBrowserAlpha
+import de.marmaro.krt.ffupdater.app.impl.Vivaldi
 
 @Keep
 enum class App {
     BRAVE,
     BRAVE_BETA,
     BRAVE_NIGHTLY,
-    BROMITE,
-    BROMITE_SYSTEMWEBVIEW,
     CHROMIUM,
     CROMITE,
     DUCKDUCKGO_ANDROID,
@@ -25,7 +50,6 @@ enum class App {
     ICERAVEN,
     K9MAIL,
     KIWI,
-    LOCKWISE,
     MULCH,
     MULCH_SYSTEMWEBVIEW,
     MULL_FROM_REPO,
@@ -34,7 +58,6 @@ enum class App {
     THORIUM,
     TOR_BROWSER,
     TOR_BROWSER_ALPHA,
-    UNGOOGLED_CHROMIUM,
     VIVALDI,
     ;
 
@@ -44,8 +67,6 @@ enum class App {
             BRAVE -> Brave
             BRAVE_BETA -> BraveBeta
             BRAVE_NIGHTLY -> BraveNightly
-            BROMITE -> Bromite
-            BROMITE_SYSTEMWEBVIEW -> BromiteSystemWebView
             CHROMIUM -> Chromium
             CROMITE -> Cromite
             DUCKDUCKGO_ANDROID -> DuckDuckGoAndroid
@@ -61,7 +82,6 @@ enum class App {
             ICERAVEN -> Iceraven
             K9MAIL -> K9Mail
             KIWI -> Kiwi
-            LOCKWISE -> Lockwise
             MULCH -> Mulch
             MULCH_SYSTEMWEBVIEW -> MulchSystemWebView
             MULL_FROM_REPO -> MullFromRepo
@@ -70,7 +90,6 @@ enum class App {
             THORIUM -> Thorium
             TOR_BROWSER -> TorBrowser
             TOR_BROWSER_ALPHA -> TorBrowserAlpha
-            UNGOOGLED_CHROMIUM -> UngoogledChromium
             VIVALDI -> Vivaldi
         }
     }

+ 0 - 72
ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/Bromite.kt

@@ -1,72 +0,0 @@
-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.EOL
-import de.marmaro.krt.ffupdater.app.entity.DisplayCategory.GOOD_PRIVACY_BROWSER
-import de.marmaro.krt.ffupdater.app.entity.LatestVersion
-import de.marmaro.krt.ffupdater.app.entity.Version
-import de.marmaro.krt.ffupdater.device.ABI
-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.settings.DeviceSettingsHelper
-
-/**
- * https://github.com/bromite/bromite/releases
- * https://api.github.com/repos/bromite/bromite/releases
- * https://www.apkmirror.com/apk/bromite/bromite/
- */
-@Keep
-@Deprecated("latest release is too old")
-object Bromite : AppBase() {
-    override val app = App.BROMITE
-    override val packageName = "org.bromite.bromite"
-    override val title = R.string.bromite__title
-    override val description = R.string.bromite__description
-    override val installationWarning = R.string.bromite__warning
-    override val downloadSource = "GitHub"
-    override val icon = R.drawable.ic_logo_bromite
-    override val minApiLevel = Build.VERSION_CODES.LOLLIPOP
-    override val supportedAbis = ARM32_ARM64_X86_X64
-    override val eolReason = R.string.eol_reason__browser_no_longer_maintained
-    override val signatureHash = "e1ee5cd076d7b0dc84cb2b45fb78b86df2eb39a3b6c56ba3dc292a5e0c3b9504"
-    override val projectPage = "https://github.com/bromite/bromite"
-    override val displayCategory = listOf(GOOD_PRIVACY_BROWSER, EOL)
-    val REPOSITORY = GithubConsumer.GithubRepo("bromite", "bromite", 0)
-    override val hostnameForInternetCheck = "https://api.github.com"
-
-    @MainThread
-    @Throws(NetworkException::class)
-    override suspend fun fetchLatestUpdate(context: Context): LatestVersion {
-        val fileName = findFileName()
-        val result = GithubConsumer.findLatestRelease(
-            repository = REPOSITORY,
-            isValidRelease = { !it.isPreRelease },
-            isSuitableAsset = { it.name == fileName },
-            requireReleaseDescription = false,
-        )
-        return LatestVersion(
-            downloadUrl = result.url,
-            version = Version(result.tagName),
-            publishDate = result.releaseDate,
-            exactFileSizeBytesOfDownload = result.fileSizeBytes,
-            fileHash = null,
-        )
-    }
-
-    private fun findFileName(): String {
-        val fileName = when (DeviceAbiExtractor.findBestAbi(supportedAbis, DeviceSettingsHelper.prefer32BitApks)) {
-            ABI.ARMEABI_V7A -> "arm_ChromePublic.apk"
-            ABI.ARM64_V8A -> "arm64_ChromePublic.apk"
-            ABI.X86 -> "x86_ChromePublic.apk"
-            ABI.X86_64 -> "x64_ChromePublic.apk"
-            else -> throw IllegalArgumentException("ABI is not supported")
-        }
-        return fileName
-    }
-}

+ 0 - 71
ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/BromiteSystemWebView.kt

@@ -1,71 +0,0 @@
-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.*
-import de.marmaro.krt.ffupdater.app.entity.LatestVersion
-import de.marmaro.krt.ffupdater.app.entity.Version
-import de.marmaro.krt.ffupdater.device.ABI
-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.settings.DeviceSettingsHelper
-
-/**
- * https://github.com/bromite/bromite/releases
- * https://api.github.com/repos/bromite/bromite/releases
- * https://www.apkmirror.com/apk/bromite/bromite-system-webview-2/
- */
-@Keep
-@Deprecated("latest release is too old")
-object BromiteSystemWebView : AppBase() {
-    override val app = App.BROMITE_SYSTEMWEBVIEW
-    override val packageName = "org.bromite.webview"
-    override val title = R.string.bromite_systemwebview__title
-    override val description = R.string.bromite_systemwebview__description
-    override val installationWarning = R.string.bromite__warning
-    override val downloadSource = "GitHub"
-    override val icon = R.drawable.ic_logo_bromite_systemwebview
-    override val minApiLevel = Build.VERSION_CODES.LOLLIPOP
-    override val supportedAbis = ARM32_ARM64_X86_X64
-    override val eolReason = R.string.eol_reason__browser_no_longer_maintained
-    override val signatureHash = "e1ee5cd076d7b0dc84cb2b45fb78b86df2eb39a3b6c56ba3dc292a5e0c3b9504"
-    override val installableByUser = false
-    override val projectPage = "https://github.com/bromite/bromite"
-    override val displayCategory = listOf(GOOD_PRIVACY_BROWSER, EOL)
-    override val hostnameForInternetCheck = "https://api.github.com"
-
-    @MainThread
-    @Throws(NetworkException::class)
-    override suspend fun fetchLatestUpdate(context: Context): LatestVersion {
-        val fileName = findFileName()
-        val result = GithubConsumer.findLatestRelease(
-            repository = Bromite.REPOSITORY,
-            isValidRelease = { !it.isPreRelease },
-            isSuitableAsset = { it.name == fileName },
-            requireReleaseDescription = false,
-        )
-        return LatestVersion(
-            downloadUrl = result.url,
-            version = Version(result.tagName),
-            publishDate = result.releaseDate,
-            exactFileSizeBytesOfDownload = result.fileSizeBytes,
-            fileHash = null,
-        )
-    }
-
-    private fun findFileName(): String {
-        val fileName = when (DeviceAbiExtractor.findBestAbi(supportedAbis, DeviceSettingsHelper.prefer32BitApks)) {
-            ABI.ARMEABI_V7A -> "arm_SystemWebView.apk"
-            ABI.ARM64_V8A -> "arm64_SystemWebView.apk"
-            ABI.X86 -> "x86_SystemWebView.apk"
-            ABI.X86_64 -> "x64_SystemWebView.apk"
-            else -> throw IllegalArgumentException("ABI is not supported")
-        }
-        return fileName
-    }
-}

+ 1 - 0
ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/Kiwi.kt

@@ -36,6 +36,7 @@ object Kiwi : AppBase() {
     override val projectPage = "https://github.com/kiwibrowser/src.next"
     override val displayCategory = listOf(EOL)
     override val hostnameForInternetCheck = "https://api.github.com"
+    override val eolReason = R.string.eol_reason__browser_no_longer_maintained
 
     @MainThread
     @Throws(NetworkException::class)

+ 0 - 72
ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/Lockwise.kt

@@ -1,72 +0,0 @@
-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.EOL
-import de.marmaro.krt.ffupdater.app.entity.DisplayCategory.OTHER
-import de.marmaro.krt.ffupdater.app.entity.LatestVersion
-import de.marmaro.krt.ffupdater.app.entity.Version
-import de.marmaro.krt.ffupdater.network.exceptions.NetworkException
-import de.marmaro.krt.ffupdater.network.github.GithubConsumer
-
-/**
- * https://api.github.com/repos/mozilla-lockwise/lockwise-android/releases
- * https://www.apkmirror.com/apk/mozilla/firefox-lockwise/
- */
-@Keep
-@Deprecated("app is no longer supported")
-object Lockwise : AppBase() {
-    override val app = App.LOCKWISE
-    override val packageName = "mozilla.lockbox"
-    override val title = R.string.lockwise__title
-    override val description = R.string.lockwise__description
-    override val downloadSource = "GitHub"
-    override val icon = R.drawable.ic_logo_lockwise
-    override val minApiLevel = Build.VERSION_CODES.N
-    override val supportedAbis = ALL_ABIS
-
-    @Suppress("SpellCheckingInspection")
-    override val signatureHash = "64d26b507078deba2fee42d6bd0bfad41d39ffc4e791f281028e5e73d3c8d2f2"
-    override val projectPage = "https://github.com/mozilla-lockwise/lockwise-android"
-    override val eolReason = R.string.lockwise__eol_reason
-    override val displayCategory = listOf(OTHER, EOL)
-    override val hostnameForInternetCheck = "https://api.github.com"
-
-    @MainThread
-    @Throws(NetworkException::class, IllegalStateException::class)
-    override suspend fun fetchLatestUpdate(context: Context): LatestVersion {
-        val result = GithubConsumer.findLatestRelease(
-            repository = GithubConsumer.GithubRepo("mozilla-lockwise", "lockwise-android", 0),
-            isValidRelease = { !it.isPreRelease },
-            isSuitableAsset = { it.name.endsWith(".apk") },
-            requireReleaseDescription = false,
-        )
-
-        val extractVersion = {
-            // tag_name can be: "release-v4.0.3", "release-v4.0.0-RC-2"
-            val regexMatch = Regex("""^release-v((\d)+(\.\d+)*)""")
-                .find(result.tagName)
-            checkNotNull(regexMatch) {
-                "Fail to extract the version with regex from string: \"${result.tagName}\""
-            }
-            val matchGroup = regexMatch.groups[1]
-            checkNotNull(matchGroup) {
-                "Fail to extract the version value from regex match: \"${regexMatch.value}\""
-            }
-            matchGroup.value
-        }
-
-        val version = extractVersion()
-        return LatestVersion(
-            downloadUrl = result.url,
-            version = Version(version),
-            publishDate = result.releaseDate,
-            exactFileSizeBytesOfDownload = result.fileSizeBytes,
-            fileHash = null,
-        )
-    }
-}

+ 0 - 67
ffupdater/src/main/java/de/marmaro/krt/ffupdater/app/impl/UngoogledChromium.kt

@@ -1,67 +0,0 @@
-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.*
-import de.marmaro.krt.ffupdater.app.entity.LatestVersion
-import de.marmaro.krt.ffupdater.app.entity.Version
-import de.marmaro.krt.ffupdater.device.ABI
-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.settings.DeviceSettingsHelper
-
-/**
- * https://github.com/ungoogled-software/ungoogled-chromium-android/releases
- */
-@Keep
-@Deprecated("app is no longer supported")
-object UngoogledChromium : AppBase() {
-    override val app = App.UNGOOGLED_CHROMIUM
-    override val packageName = "org.ungoogled.chromium.stable"
-    override val title = R.string.ungoogled_chromium__title
-    override val description = R.string.ungoogled_chromium__description
-    override val installationWarning = R.string.ungoogled_chromium__warning
-    override val downloadSource = "GitHub"
-    override val icon = R.drawable.ic_logo_ungoogled_chromium
-    override val minApiLevel = Build.VERSION_CODES.LOLLIPOP
-    override val supportedAbis = listOf(ABI.ARM64_V8A, ABI.ARMEABI_V7A, ABI.X86)
-    override val projectPage = "https://github.com/ungoogled-software/ungoogled-chromium-android"
-
-    @Suppress("SpellCheckingInspection")
-    override val signatureHash = "7e6ba7bbb939fa52d5569a8ea628056adf8c75292bf4dee6b353fafaf2c30e19"
-    override val eolReason = R.string.ungoogled_chromium__eol_reason
-    override val displayCategory = listOf(BETTER_THAN_GOOGLE_CHROME, EOL)
-    override val hostnameForInternetCheck = "https://api.github.com"
-
-    @MainThread
-    @Throws(NetworkException::class)
-    override suspend fun fetchLatestUpdate(context: Context): LatestVersion {
-        val result = GithubConsumer.findLatestRelease(
-            repository = GithubConsumer.GithubRepo("ungoogled-software", "ungoogled-chromium-android", 0),
-            isValidRelease = { !it.isPreRelease && "webview" !in it.name },
-            isSuitableAsset = { it.name == findFileName() },
-            requireReleaseDescription = false,
-        )
-        return LatestVersion(
-            downloadUrl = result.url, version = Version(result.tagName),
-            publishDate = result.releaseDate,
-            exactFileSizeBytesOfDownload = result.fileSizeBytes,
-            fileHash = null
-        )
-    }
-
-    private fun findFileName(): String {
-        val fileName = when (DeviceAbiExtractor.findBestAbi(supportedAbis, DeviceSettingsHelper.prefer32BitApks)) {
-            ABI.ARMEABI_V7A -> "ChromeModernPublic_arm.apk"
-            ABI.ARM64_V8A -> "ChromeModernPublic_arm64.apk"
-            ABI.X86 -> "ChromeModernPublic_x86.apk"
-            else -> throw IllegalArgumentException("ABI is not supported")
-        }
-        return fileName
-    }
-}

+ 28 - 12
ffupdater/src/main/java/de/marmaro/krt/ffupdater/background/EolAppsWarnerReceiver.kt

@@ -7,33 +7,49 @@ import androidx.annotation.Keep
 import de.marmaro.krt.ffupdater.BuildConfig
 import de.marmaro.krt.ffupdater.device.InstalledAppsCache
 import de.marmaro.krt.ffupdater.notification.NotificationBuilder
+import de.marmaro.krt.ffupdater.security.PackageManagerUtil
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.SupervisorJob
 import kotlinx.coroutines.launch
 
 @Keep
+// TODO remove Bromite, Bromite SystemWebView, Lockwise and
 class EolAppsWarnerReceiver : BroadcastReceiver() {
     private val scope = CoroutineScope(SupervisorJob())
 
     override fun onReceive(context: Context?, intent: Intent) {
-        if (context == null ||
-            intent.action != Intent.ACTION_MY_PACKAGE_REPLACED ||
-            intent.`package` != BuildConfig.APPLICATION_ID
-        ) {
+        if (context == null || intent.action != Intent.ACTION_MY_PACKAGE_REPLACED || intent.`package` != BuildConfig.APPLICATION_ID) {
             return
         }
+        showNotificationIfEolAppsAreInstalled(context)
+    }
 
+    private fun showNotificationIfEolAppsAreInstalled(context: Context) {
         scope.launch(Dispatchers.IO) {
-            val eolInstalled = InstalledAppsCache
-                .getInstalledAppsWithCorrectFingerprint(context.applicationContext)
-                .asSequence()
-                .map { it.findImpl() }
-                .filter { it.isEol() }
-                .any()
-            if (eolInstalled) {
-                NotificationBuilder.showEolAppsNotification(context.applicationContext)
+            val eolApps = findInstalledSupportedEolApps(context) + findInstalledUnsupportedEolApps(context)
+            if (eolApps.isNotEmpty()) {
+                NotificationBuilder.showEolAppsNotification(context.applicationContext, eolApps)
             }
         }
     }
+
+    private suspend fun findInstalledSupportedEolApps(context: Context): List<String> {
+        return InstalledAppsCache.getInstalledAppsWithCorrectFingerprint(context.applicationContext)
+            .map { it.findImpl() }.filter { it.isEol() }.map { context.getString(it.title) }
+    }
+
+    private suspend fun findInstalledUnsupportedEolApps(context: Context): List<String> {
+        return noLongerSupportedEolApps.filter { PackageManagerUtil.isAppInstalled(context.packageManager, it.value) }
+            .map { it.key }
+    }
+
+    companion object {
+        val noLongerSupportedEolApps = mapOf(
+            "Bromite" to "org.bromite.bromite",
+            "Bromite SystemWebView" to "org.bromite.webview",
+            "Lockwise" to "mozilla.lockbox",
+            "UngoogledChromium" to "org.ungoogled.chromium.stable"
+        )
+    }
 }

+ 2 - 2
ffupdater/src/main/java/de/marmaro/krt/ffupdater/notification/NotificationBuilder.kt

@@ -208,7 +208,7 @@ object NotificationBuilder {
         showNotification(appContext, channel, notification, intent)
     }
 
-    fun showEolAppsNotification(context: Context) {
+    fun showEolAppsNotification(context: Context, apps: List<String>) {
         val channel = ChannelData(
             id = "eol_apps_notification",
             name = context.getString(notification__eol_apps__channel_name),
@@ -217,7 +217,7 @@ object NotificationBuilder {
         val notification = NotificationData(
             id = EOL_APPS_CODE,
             title = context.getString(notification__eol_apps__title),
-            text = context.getString(notification__eol_apps__text),
+            text = context.getString(notification__eol_apps__text, apps.joinToString(", ")),
         )
         showNotification(context, channel, notification, MainActivity.createIntent(context))
     }

+ 1 - 1
ffupdater/src/main/res/values-ar/strings.xml

@@ -83,7 +83,7 @@
     <string name="app_card__download_the_app">قم بتنزيل التطبيق</string>
     <string name="notification__eol_apps__channel_description">قناة إشعارات للتحذيرات حول التطبيقات القديمة.</string>
     <string name="notification__eol_apps__channel_name">إشعار التطبيقات القديمة</string>
-    <string name="notification__eol_apps__text">لديك تطبيقات قديمة لا ينبغي استخدامها بعد الآن. انقر للحصول على مزيد من المعلومات.</string>
+    <string name="notification__eol_apps__text">لديك تطبيقات قديمة لا ينبغي استخدامها بعد الآن. : %1$s</string>
     <string name="kiwi__description">تم تصميم متصفح Kiwi لتصفح الإنترنت وقراءة الأخبار ومشاهدة مقاطع الفيديو والاستماع إلى الموسيقى دون أي إزعاجات.</string>
     <string name="firefox_beta__description">يتميز متصفح Firefox لنظام Android بأنه خاص تلقائيًا وسريع بشكل لا يصدق. يتابعك الآلاف من المتتبعين عبر الإنترنت يوميًا، ويجمعون معلومات حول مكان اتصالك بالإنترنت ويبطئون سرعتك. يحظر Firefox ما يزيد عن 2000 من أدوات التتبع هذه افتراضيًا، وتتوفر وظائف إضافية لحظر الإعلانات إذا كنت تريد تخصيص متصفحك بشكل أكبر. مع Firefox، ستحصل على الأمان الذي تستحقه والسرعة التي تحتاجها في متصفح خاص على الهاتف المحمول.</string>
     <string name="firefox_beta__title">Firefox النسخة التجريبية</string>

+ 0 - 0
ffupdater/src/main/res/values-bg/strings.xml


部分文件因文件數量過多而無法顯示