diff --git a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/SyncApiException.kt b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/SyncApiException.kt new file mode 100644 index 000000000..b314d1b59 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/SyncApiException.kt @@ -0,0 +1,6 @@ +package org.koitharu.kotatsu.core.exceptions + +class SyncApiException( + message: String, + val code: Int, +) : RuntimeException(message) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt index 19506de9e..9d70660c7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt @@ -1,12 +1,9 @@ package org.koitharu.kotatsu.settings -import android.accounts.Account import android.accounts.AccountManager import android.content.ActivityNotFoundException -import android.content.Intent import android.content.SharedPreferences import android.os.Bundle -import android.preference.PreferenceActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS import android.view.View import androidx.preference.ListPreference import androidx.preference.Preference @@ -23,6 +20,7 @@ import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.parsers.util.names import org.koitharu.kotatsu.settings.utils.SliderPreference +import org.koitharu.kotatsu.sync.ui.SyncSettingsIntent import org.koitharu.kotatsu.utils.ext.getStorageName import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat import org.koitharu.kotatsu.utils.ext.viewLifecycleScope @@ -111,7 +109,7 @@ class ContentSettingsFragment : am.addAccount(accountType, accountType, null, null, requireActivity(), null, null) } else { try { - startActivity(getSyncSettingsIntent(account)) + startActivity(SyncSettingsIntent(account)) } catch (_: ActivityNotFoundException) { Snackbar.make(listView, R.string.operation_not_supported, Snackbar.LENGTH_SHORT).show() } @@ -151,16 +149,4 @@ class ContentSettingsFragment : } } } - - /** - * Some magic - */ - private fun getSyncSettingsIntent(account: Account): Intent { - val args = Bundle(1) - args.putParcelable("account", account) - val intent = Intent("android.settings.ACCOUNT_SYNC_SETTINGS") - @Suppress("DEPRECATION") - intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args) - return intent - } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncAuthApi.kt b/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncAuthApi.kt index 744670526..1d56dc91a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncAuthApi.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncAuthApi.kt @@ -5,8 +5,10 @@ import okhttp3.OkHttpClient import okhttp3.Request import org.json.JSONObject import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.exceptions.SyncApiException import org.koitharu.kotatsu.parsers.util.await import org.koitharu.kotatsu.parsers.util.parseJson +import org.koitharu.kotatsu.parsers.util.removeSurrounding import org.koitharu.kotatsu.utils.ext.toRequestBody class SyncAuthApi( @@ -24,7 +26,13 @@ class SyncAuthApi( .url("$baseUrl/auth") .post(body) .build() - val response = okHttpClient.newCall(request).await().parseJson() - return response.getString("token") + val response = okHttpClient.newCall(request).await() + if (response.isSuccessful) { + return response.parseJson().getString("token") + } else { + val code = response.code + val message = response.use { checkNotNull(it.body).string() }.removeSurrounding('"') + throw SyncApiException(message, code) + } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncSettingsIntent.kt b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncSettingsIntent.kt new file mode 100644 index 000000000..2775d8072 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncSettingsIntent.kt @@ -0,0 +1,18 @@ +package org.koitharu.kotatsu.sync.ui + +import android.accounts.Account +import android.content.Intent +import android.os.Bundle + +private const val ACCOUNT_KEY = "account" +private const val ACTION_ACCOUNT_SYNC_SETTINGS = "android.settings.ACCOUNT_SYNC_SETTINGS" +private const val EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":settings:show_fragment_args" + +@Suppress("FunctionName") +fun SyncSettingsIntent(account: Account): Intent { + val args = Bundle(1) + args.putParcelable(ACCOUNT_KEY, account) + val intent = Intent(ACTION_ACCOUNT_SYNC_SETTINGS) + intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args) + return intent +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt index 79ee12775..19c8c65e9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt @@ -19,6 +19,7 @@ fun Throwable.getDisplayMessage(resources: Resources): String = when (this) { is UnsupportedFileException -> resources.getString(R.string.text_file_not_supported) is FileNotFoundException -> resources.getString(R.string.file_not_found) is EmptyHistoryException -> resources.getString(R.string.history_is_empty) + is SyncApiException, is ContentUnavailableException -> message is ParseException -> shortMessage is SocketTimeoutException -> resources.getString(R.string.network_error) @@ -36,4 +37,4 @@ fun Throwable.isReportable(): Boolean { fun Throwable.report(message: String?) { CaughtException(this, message).sendWithAcra() -} \ No newline at end of file +}