From 9f965c52696a3dd5596298f6ea4be783865581ab Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 4 Aug 2025 13:15:19 +0300 Subject: [PATCH] Remove Telegram bot token from public source --- app/build.gradle | 10 +++- .../ui/periodical/PeriodicalBackupService.kt | 2 +- .../PeriodicalBackupSettingsFragment.kt | 2 + .../PeriodicalBackupSettingsViewModel.kt | 3 + .../ui/periodical/TelegramBackupUploader.kt | 3 + .../kotatsu/core/prefs/AppSettings.kt | 1 + app/src/main/res/values/constants.xml | 1 - app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_backup_periodic.xml | 59 +++++++++++-------- gradle/libs.versions.toml | 2 +- 10 files changed, 54 insertions(+), 30 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d66ea2886..2121b0290 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { applicationId 'org.koitharu.kotatsu' minSdk = 21 targetSdk = 36 - versionCode = 1023 - versionName = '9.0.1' + versionCode = 1024 + versionName = '9.1' generatedDensities = [] testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner' ksp { @@ -32,6 +32,12 @@ android { // https://issuetracker.google.com/issues/408030127 generateLocaleConfig false } + def localProperties = new Properties() + def localPropertiesFile = rootProject.file('local.properties') + if (localPropertiesFile.exists()) { + localProperties.load(new FileInputStream(localPropertiesFile)) + } + resValue 'string', 'tg_backup_bot_token', localProperties.getProperty('tg_backup_bot_token', '') } buildTypes { debug { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupService.kt b/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupService.kt index f23578fbb..a10efc47a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupService.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupService.kt @@ -49,7 +49,7 @@ class PeriodicalBackupService : CoroutineIntentService() { } externalBackupStorage.put(output) externalBackupStorage.trim(settings.periodicalBackupMaxCount) - if (settings.isBackupTelegramUploadEnabled) { + if (settings.isBackupTelegramUploadEnabled && telegramBackupUploader.isAvailable) { telegramBackupUploader.uploadBackup(output) } } finally { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupSettingsFragment.kt index cfe59c1fd..5c857c226 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupSettingsFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupSettingsFragment.kt @@ -9,6 +9,7 @@ import androidx.activity.result.ActivityResultCallback import androidx.fragment.app.viewModels import androidx.preference.EditTextPreference import androidx.preference.Preference +import androidx.preference.PreferenceCategory import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R @@ -37,6 +38,7 @@ class PeriodicalBackupSettingsFragment : BasePreferenceFragment(R.string.periodi override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_backup_periodic) + findPreference(AppSettings.KEY_BACKUP_TG)?.isVisible = viewModel.isTelegramAvailable findPreference(AppSettings.KEY_BACKUP_TG_CHAT)?.summaryProvider = EditTextFallbackSummaryProvider(R.string.telegram_chat_id_summary) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupSettingsViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupSettingsViewModel.kt index 667173a7d..d70d4c357 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupSettingsViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/PeriodicalBackupSettingsViewModel.kt @@ -27,6 +27,9 @@ class PeriodicalBackupSettingsViewModel @Inject constructor( @ApplicationContext private val appContext: Context, ) : BaseViewModel() { + val isTelegramAvailable + get() = telegramUploader.isAvailable + val lastBackupDate = MutableStateFlow(null) val backupsDirectory = MutableStateFlow("") val isTelegramCheckLoading = MutableStateFlow(false) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/TelegramBackupUploader.kt b/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/TelegramBackupUploader.kt index 57b434d39..d1b15296d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/TelegramBackupUploader.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/backups/ui/periodical/TelegramBackupUploader.kt @@ -30,6 +30,9 @@ class TelegramBackupUploader @Inject constructor( private val botToken = context.getString(R.string.tg_backup_bot_token) + val isAvailable: Boolean + get() = botToken.isNotEmpty() + suspend fun uploadBackup(file: File) { val requestBody = file.asRequestBody("application/zip".toMediaTypeOrNull()) val multipartBody = MultipartBody.Builder() diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt index d52d1bde1..b90bd8c6b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -812,6 +812,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val KEY_PROXY_TEST = "proxy_test" const val KEY_OPEN_BROWSER = "open_browser" const val KEY_HANDLE_LINKS = "handle_links" + const val KEY_BACKUP_TG = "backup_periodic_tg" const val KEY_BACKUP_TG_OPEN = "backup_periodic_tg_open" const val KEY_BACKUP_TG_TEST = "backup_periodic_tg_test" const val KEY_CLEAR_MANGA_DATA = "manga_data_clear" diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index 92057a3e6..cb536ba84 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -19,7 +19,6 @@ kgpuhoNJpSsQDCwu org.koitharu.kotatsu.history org.koitharu.kotatsu.favourites - 7455491254:AAHq5AJmizJJpVqFgx16pEAO4g0AX8V6NTY kotatsu_backup_bot 1395464028611940393 https://raw.githubusercontent.com/KotatsuApp/Kotatsu/refs/heads/devel/metadata/en-US/icon.png diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aa0a42eca..7c56dd671 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -878,4 +878,5 @@ This manga is not available to read in this source. Try searching for it in other sources or opening it in a browser for more information This manga does not contain any chapters Failed to load chapter list + Telegram integration diff --git a/app/src/main/res/xml/pref_backup_periodic.xml b/app/src/main/res/xml/pref_backup_periodic.xml index d55555267..946a1850c 100644 --- a/app/src/main/res/xml/pref_backup_periodic.xml +++ b/app/src/main/res/xml/pref_backup_periodic.xml @@ -2,6 +2,7 @@ - - - - - - - + + + + + + + + + + + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 15ed5bf94..9f72f97f5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -34,7 +34,7 @@ material = "1.14.0-alpha03" moshi = "1.15.2" okhttp = "4.12.0" okio = "3.12.0" -parsers = "a83baf4c12" +parsers = "74d0951d3d" preference = "1.2.1" recyclerview = "1.4.0" room = "2.7.2"