diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/TelegramBackupUploader.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/TelegramBackupUploader.kt index 7dd8706d0..441652b9e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/TelegramBackupUploader.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/TelegramBackupUploader.kt @@ -3,8 +3,7 @@ package org.koitharu.kotatsu.core.backup import android.content.Context import androidx.annotation.CheckResult import dagger.hilt.android.qualifiers.ApplicationContext -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext +import okhttp3.HttpUrl import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody import okhttp3.OkHttpClient @@ -31,7 +30,7 @@ class TelegramBackupUploader @Inject constructor( private val botToken = context.getString(R.string.tg_backup_bot_token) - suspend fun uploadBackup(file: File) = withContext(Dispatchers.IO) { + suspend fun uploadBackup(file: File) { val requestBody = file.asRequestBody("application/zip".toMediaTypeOrNull()) val multipartBody = MultipartBody.Builder() .setType(MultipartBody.FORM) @@ -39,7 +38,7 @@ class TelegramBackupUploader @Inject constructor( .addFormDataPart("document", file.name, requestBody) .build() val request = Request.Builder() - .url("https://api.telegram.org/bot$botToken/sendDocument") + .url(urlOf("sendDocument").build()) .post(multipartBody) .build() client.newCall(request).await().consume() @@ -47,7 +46,7 @@ class TelegramBackupUploader @Inject constructor( suspend fun sendTestMessage() { val request = Request.Builder() - .url("https://api.telegram.org/bot$botToken/getMe") + .url(urlOf("getMe").build()) .build() client.newCall(request).await().consume() sendMessage(context.getString(R.string.backup_tg_echo)) @@ -61,7 +60,10 @@ class TelegramBackupUploader @Inject constructor( } private suspend fun sendMessage(message: String) { - val url = "https://api.telegram.org/bot$botToken/sendMessage?chat_id=${requireChatId()}&text=$message" + val url = urlOf("sendMessage") + .addQueryParameter("chat_id", requireChatId()) + .addQueryParameter("text", message) + .build() val request = Request.Builder() .url(url) .build() @@ -82,4 +84,10 @@ class TelegramBackupUploader @Inject constructor( throw RuntimeException(jo.getStringOrNull("description")) } } + + private fun urlOf(method: String) = HttpUrl.Builder() + .scheme("https") + .host("api.telegram.org") + .addPathSegment("bot$botToken") + .addPathSegment(method) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/network/GZipInterceptor.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/network/GZipInterceptor.kt index 09a544105..69aa6eedc 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/network/GZipInterceptor.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/network/GZipInterceptor.kt @@ -1,6 +1,7 @@ package org.koitharu.kotatsu.core.network import okhttp3.Interceptor +import okhttp3.MultipartBody import okhttp3.Response import okio.IOException import org.koitharu.kotatsu.core.network.CommonHeaders.CONTENT_ENCODING @@ -8,7 +9,11 @@ import org.koitharu.kotatsu.core.network.CommonHeaders.CONTENT_ENCODING class GZipInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { - val newRequest = chain.request().newBuilder() + val request = chain.request() + if (request.body is MultipartBody) { + return chain.proceed(request) + } + val newRequest = request.newBuilder() newRequest.addHeader(CONTENT_ENCODING, "gzip") return try { chain.proceed(newRequest.build()) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/PeriodicalBackupSettingsViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/PeriodicalBackupSettingsViewModel.kt index c233d257c..f557ed11d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/PeriodicalBackupSettingsViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/PeriodicalBackupSettingsViewModel.kt @@ -7,11 +7,15 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow +import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.backup.BackupZipOutput.Companion.DIR_BACKUPS import org.koitharu.kotatsu.core.backup.ExternalBackupStorage import org.koitharu.kotatsu.core.backup.TelegramBackupUploader import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.util.ext.MutableEventFlow +import org.koitharu.kotatsu.core.util.ext.call import org.koitharu.kotatsu.core.util.ext.resolveFile import java.io.File import java.util.Date @@ -28,6 +32,7 @@ class PeriodicalBackupSettingsViewModel @Inject constructor( val lastBackupDate = MutableStateFlow(null) val backupsDirectory = MutableStateFlow("") val isTelegramCheckLoading = MutableStateFlow(false) + val onActionDone = MutableEventFlow() init { updateSummaryData() @@ -38,6 +43,7 @@ class PeriodicalBackupSettingsViewModel @Inject constructor( try { isTelegramCheckLoading.value = true telegramUploader.sendTestMessage() + onActionDone.call(ReversibleAction(R.string.connection_ok, null)) } finally { isTelegramCheckLoading.value = false } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index add6cdec8..c2c59be63 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -779,7 +779,7 @@ Incognito Connection reset by remote host Check if API works - Kotatsu backup in Telegram is working!! + Test message Chat ID is not set Telegram chat ID Open the Telegram bot