From dda9c02f0db2e694cff3893fd95da9e106631b38 Mon Sep 17 00:00:00 2001 From: Igor Bubelov Date: Sat, 28 May 2022 13:57:36 +0700 Subject: [PATCH] Promote standalone mode out of beta --- app/build.gradle.kts | 1 - app/src/main/kotlin/api/NewsApiSwitcher.kt | 44 ++------- .../main/kotlin/auth/AccountsRepository.kt | 46 ++------- app/src/main/kotlin/auth/AuthFragment.kt | 98 ++++--------------- app/src/main/kotlin/auth/AuthViewModel.kt | 2 +- .../main/kotlin/auth/MinifluxAuthFragment.kt | 2 +- .../main/kotlin/auth/MinifluxAuthViewModel.kt | 6 +- .../main/kotlin/auth/NextcloudAuthFragment.kt | 2 +- .../main/kotlin/auth/NextcloudAuthModel.kt | 6 +- app/src/main/kotlin/common/App.kt | 6 +- app/src/main/kotlin/common/ConfRepository.kt | 9 +- .../main/kotlin/settings/SettingsFragment.kt | 10 +- app/src/main/res/layout/fragment_auth.xml | 20 ++-- .../res/layout/header_navigation_drawer.xml | 5 +- app/src/main/res/navigation/nav_graph.xml | 10 +- app/src/main/res/values-af/strings.xml | 7 +- app/src/main/res/values-ar/strings.xml | 7 +- app/src/main/res/values-ca/strings.xml | 7 +- app/src/main/res/values-cs/strings.xml | 5 +- app/src/main/res/values-da/strings.xml | 7 +- app/src/main/res/values-de/strings.xml | 5 +- app/src/main/res/values-el/strings.xml | 7 +- app/src/main/res/values-es/strings.xml | 5 +- app/src/main/res/values-fa/strings.xml | 5 +- app/src/main/res/values-fi/strings.xml | 7 +- app/src/main/res/values-fr/strings.xml | 5 +- app/src/main/res/values-hu/strings.xml | 7 +- app/src/main/res/values-it/strings.xml | 5 +- app/src/main/res/values-iw/strings.xml | 7 +- app/src/main/res/values-ja/strings.xml | 7 +- app/src/main/res/values-ko/strings.xml | 7 +- app/src/main/res/values-nl/strings.xml | 5 +- app/src/main/res/values-no/strings.xml | 7 +- app/src/main/res/values-pl/strings.xml | 7 +- app/src/main/res/values-pt/strings.xml | 7 +- app/src/main/res/values-ro/strings.xml | 7 +- app/src/main/res/values-ru/strings.xml | 5 +- app/src/main/res/values-sr/strings.xml | 7 +- app/src/main/res/values-sv/strings.xml | 5 +- app/src/main/res/values-tr/strings.xml | 7 +- app/src/main/res/values-uk/strings.xml | 5 +- app/src/main/res/values-vi/strings.xml | 7 +- app/src/main/res/values-zh/strings.xml | 5 +- app/src/main/res/values/strings.xml | 7 +- app/src/main/sqldelight/db/1.sqm | 18 ++-- app/src/main/sqldelight/db/Conf.sq | 2 +- build.gradle.kts | 9 +- 47 files changed, 132 insertions(+), 345 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 60d37f7e..f9818dfa 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -120,7 +120,6 @@ dependencies { implementation("com.squareup.sqldelight:coroutines-extensions:$sqlDelightVer") implementation("com.squareup.sqldelight:android-driver:$sqlDelightVer") - implementation("com.github.nextcloud:Android-SingleSignOn:0.6.1") implementation("com.google.android.material:material:1.6.0") implementation("com.squareup.picasso:picasso:2.71828") implementation("io.insert-koin:koin-android:3.2.0") diff --git a/app/src/main/kotlin/api/NewsApiSwitcher.kt b/app/src/main/kotlin/api/NewsApiSwitcher.kt index 599535fa..a8dfa6ef 100644 --- a/app/src/main/kotlin/api/NewsApiSwitcher.kt +++ b/app/src/main/kotlin/api/NewsApiSwitcher.kt @@ -4,18 +4,13 @@ import android.content.Context import api.miniflux.MinifluxApiAdapter import api.miniflux.MinifluxApiBuilder import api.nextcloud.DirectNextcloudNewsApiBuilder -import api.nextcloud.NextcloudNewsApi import api.nextcloud.NextcloudNewsApiAdapter import api.standalone.StandaloneNewsApi -import com.google.gson.GsonBuilder -import com.nextcloud.android.sso.api.NextcloudAPI -import com.nextcloud.android.sso.helper.SingleAccountHelper import common.ConfRepository import db.Database import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.core.annotation.Single -import retrofit2.NextcloudRetrofitApiBuilder @Single class NewsApiSwitcher( @@ -25,41 +20,16 @@ class NewsApiSwitcher( private val context: Context, ) { - fun switch(authType: String) { - when (authType) { - ConfRepository.AUTH_TYPE_NEXTCLOUD_APP -> switchToAppBasedNextcloudApi() - ConfRepository.AUTH_TYPE_NEXTCLOUD_DIRECT -> switchToDirectNextcloudApi() - ConfRepository.AUTH_TYPE_MINIFLUX -> switchToMinifluxApi() - ConfRepository.AUTH_TYPE_STANDALONE -> switchToStandaloneApi() - else -> throw Exception("Unknown auth type: $authType") + fun switch(backend: String) { + when (backend) { + ConfRepository.BACKEND_STANDALONE -> switchToStandaloneApi() + ConfRepository.BACKEND_MINIFLUX -> switchToMinifluxApi() + ConfRepository.BACKEND_NEXTCLOUD -> switchToNextcloudApi() + else -> throw Exception("Unknown backend: $backend") } } - private fun switchToAppBasedNextcloudApi() { - val account = SingleAccountHelper.getCurrentSingleSignOnAccount(context) - - val callback: NextcloudAPI.ApiConnectedListener = - object : NextcloudAPI.ApiConnectedListener { - override fun onConnected() {} - override fun onError(e: Exception) {} - } - - val nextcloudApi = NextcloudAPI( - context, - account, - GsonBuilder().create(), - callback - ) - - val nextcloudNewsApi = NextcloudRetrofitApiBuilder( - nextcloudApi, - "/index.php/apps/news/api/v1-2/" - ).create(NextcloudNewsApi::class.java) - - wrapper.api = NextcloudNewsApiAdapter(nextcloudNewsApi) - } - - private fun switchToDirectNextcloudApi(): Unit = runBlocking { + private fun switchToNextcloudApi(): Unit = runBlocking { val conf = confRepo.select().first() wrapper.api = NextcloudNewsApiAdapter( diff --git a/app/src/main/kotlin/auth/AccountsRepository.kt b/app/src/main/kotlin/auth/AccountsRepository.kt index 9194e6a4..898fd2ae 100644 --- a/app/src/main/kotlin/auth/AccountsRepository.kt +++ b/app/src/main/kotlin/auth/AccountsRepository.kt @@ -2,17 +2,13 @@ package auth import android.content.Context import co.appreactor.news.R -import com.nextcloud.android.sso.exceptions.SSOException -import com.nextcloud.android.sso.helper.SingleAccountHelper import com.squareup.sqldelight.runtime.coroutines.asFlow import com.squareup.sqldelight.runtime.coroutines.mapToOneOrNull import common.ConfRepository import db.Conf import db.Database -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import kotlinx.coroutines.withContext import org.koin.core.annotation.Single @Single @@ -33,46 +29,24 @@ class AccountsRepository( } private fun Conf.accountTitle(): String { - return when (authType) { - ConfRepository.AUTH_TYPE_NEXTCLOUD_APP, - ConfRepository.AUTH_TYPE_NEXTCLOUD_DIRECT -> { - resources.getString(R.string.nextcloud) - } - ConfRepository.AUTH_TYPE_MINIFLUX -> { - resources.getString(R.string.miniflux) - } - ConfRepository.AUTH_TYPE_STANDALONE -> { - resources.getString(R.string.standalone_mode_no_beta) - } + return when (backend) { + ConfRepository.BACKEND_STANDALONE -> resources.getString(R.string.standalone_mode) + ConfRepository.BACKEND_MINIFLUX -> resources.getString(R.string.miniflux) + ConfRepository.BACKEND_NEXTCLOUD -> resources.getString(R.string.nextcloud) else -> "" } } private suspend fun Conf.accountSubtitle(): String { - return when (authType) { - ConfRepository.AUTH_TYPE_NEXTCLOUD_APP, - ConfRepository.AUTH_TYPE_NEXTCLOUD_DIRECT -> { - if (nextcloudServerUrl.isNotBlank()) { - val username = nextcloudServerUsername - "$username@${nextcloudServerUrl.replace("https://", "")}" - } else { - try { - val account = withContext(Dispatchers.Default) { - SingleAccountHelper.getCurrentSingleSignOnAccount(context) - } - - account.name - } catch (e: SSOException) { - "unknown" - } - } - } - ConfRepository.AUTH_TYPE_MINIFLUX -> { + return when (backend) { + ConfRepository.BACKEND_STANDALONE -> "" + ConfRepository.BACKEND_MINIFLUX -> { val username = minifluxServerUsername "$username@${minifluxServerUrl.replace("https://", "")}" } - ConfRepository.AUTH_TYPE_STANDALONE -> { - resources.getString(R.string.beta) + ConfRepository.BACKEND_NEXTCLOUD -> { + val username = nextcloudServerUsername + "$username@${nextcloudServerUrl.replace("https://", "")}" } else -> "" } diff --git a/app/src/main/kotlin/auth/AuthFragment.kt b/app/src/main/kotlin/auth/AuthFragment.kt index 50b0c712..79179aa6 100644 --- a/app/src/main/kotlin/auth/AuthFragment.kt +++ b/app/src/main/kotlin/auth/AuthFragment.kt @@ -6,16 +6,10 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import co.appreactor.news.R import co.appreactor.news.databinding.FragmentAuthBinding -import com.nextcloud.android.sso.AccountImporter -import com.nextcloud.android.sso.exceptions.SSOException -import com.nextcloud.android.sso.helper.SingleAccountHelper -import com.nextcloud.android.sso.model.SingleSignOnAccount -import com.nextcloud.android.sso.ui.UiExceptionManager import common.AppFragment import common.ConfRepository import common.app @@ -36,11 +30,11 @@ class AuthFragment : AppFragment( override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View? { val conf = runBlocking { model.selectConf().first() } - return if (conf.authType.isBlank()) { + return if (conf.backend.isBlank()) { _binding = FragmentAuthBinding.inflate(inflater, container, false) binding.root } else { @@ -60,24 +54,25 @@ class AuthFragment : AppFragment( override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.initButtons() + } - binding.loginWithMiniflux.setOnClickListener { - findNavController().navigate(R.id.action_authFragment_to_minifluxAuthFragment) - } - - binding.loginWithNextcloudApp.setOnClickListener { - showAccountPicker() - } + override fun onResume() { + super.onResume() + (binding.icon.drawable as? Animatable)?.start() + } - binding.loginWithNextcloudServer.setOnClickListener { - findNavController().navigate(R.id.action_authFragment_to_directAuthFragment) - } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } - binding.standaloneMode.setOnClickListener { + private fun FragmentAuthBinding.initButtons() { + useStandaloneBackend.setOnClickListener { lifecycleScope.launchWhenResumed { model.upsertConf( model.selectConf().first().copy( - authType = ConfRepository.AUTH_TYPE_STANDALONE, + backend = ConfRepository.BACKEND_STANDALONE, syncOnStartup = false, backgroundSyncIntervalMillis = TimeUnit.HOURS.toMillis(12), initialSyncCompleted = true, @@ -89,68 +84,13 @@ class AuthFragment : AppFragment( findNavController().navigate(R.id.action_authFragment_to_entriesFragment) } } - } - - override fun onResume() { - super.onResume() - (binding.icon.drawable as? Animatable)?.start() - } - @Deprecated("Deprecated in Java") - @Suppress("DEPRECATION") - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - - when (resultCode) { - AppCompatActivity.RESULT_CANCELED -> setButtonsEnabled(true) - - else -> { - AccountImporter.onActivityResult( - requestCode, - resultCode, - data, - this - ) { onNextcloudAccountAccessGranted(it) } - } - } - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } - - private fun onNextcloudAccountAccessGranted(account: SingleSignOnAccount) { - SingleAccountHelper.setCurrentAccount(context, account.name) - - runBlocking { - val conf = model.selectConf().first() - model.upsertConf(conf.copy(authType = ConfRepository.AUTH_TYPE_NEXTCLOUD_APP)) + useMinifluxBackend.setOnClickListener { + findNavController().navigate(R.id.action_authFragment_to_minifluxAuthFragment) } - app().setupBackgroundSync(override = true) - - findNavController().navigate(R.id.action_authFragment_to_entriesFragment) - } - - private fun showAccountPicker() { - setButtonsEnabled(false) - - try { - AccountImporter.pickNewAccount(this) - } catch (e: Exception) { - if (e is SSOException) { - UiExceptionManager.showDialogForException(context, e) - } - - setButtonsEnabled(true) + useNextcloudBackend.setOnClickListener { + findNavController().navigate(R.id.action_authFragment_to_nextcloudAuthFragment) } } - - private fun setButtonsEnabled(enabled: Boolean) { - binding.loginWithMiniflux.isEnabled = enabled - binding.loginWithNextcloudApp.isEnabled = enabled - binding.loginWithNextcloudServer.isEnabled = enabled - binding.standaloneMode.isEnabled = enabled - } } \ No newline at end of file diff --git a/app/src/main/kotlin/auth/AuthViewModel.kt b/app/src/main/kotlin/auth/AuthViewModel.kt index 6cafae4d..b939d25c 100644 --- a/app/src/main/kotlin/auth/AuthViewModel.kt +++ b/app/src/main/kotlin/auth/AuthViewModel.kt @@ -16,6 +16,6 @@ class AuthViewModel( suspend fun upsertConf(conf: Conf) { confRepo.upsert(conf) - newsApiSwitcher.switch(conf.authType) + newsApiSwitcher.switch(conf.backend) } } \ No newline at end of file diff --git a/app/src/main/kotlin/auth/MinifluxAuthFragment.kt b/app/src/main/kotlin/auth/MinifluxAuthFragment.kt index f7466029..e1651537 100644 --- a/app/src/main/kotlin/auth/MinifluxAuthFragment.kt +++ b/app/src/main/kotlin/auth/MinifluxAuthFragment.kt @@ -83,7 +83,7 @@ class MinifluxAuthFragment : AppFragment() { binding.trustSelfSignedCerts.isChecked, ) - model.setAuthType(ConfRepository.AUTH_TYPE_MINIFLUX) + model.setBackend(ConfRepository.BACKEND_MINIFLUX) app().setupBackgroundSync(override = true) diff --git a/app/src/main/kotlin/auth/MinifluxAuthViewModel.kt b/app/src/main/kotlin/auth/MinifluxAuthViewModel.kt index f7422595..a2c1fa51 100644 --- a/app/src/main/kotlin/auth/MinifluxAuthViewModel.kt +++ b/app/src/main/kotlin/auth/MinifluxAuthViewModel.kt @@ -47,9 +47,9 @@ class MinifluxAuthViewModel( confRepo.upsert(newConf) } - suspend fun setAuthType(newAuthType: String) { - val newConf = confRepo.select().first().copy(authType = newAuthType) + suspend fun setBackend(newBackend: String) { + val newConf = confRepo.select().first().copy(backend = newBackend) confRepo.upsert(newConf) - apiSwitcher.switch(newAuthType) + apiSwitcher.switch(newBackend) } } \ No newline at end of file diff --git a/app/src/main/kotlin/auth/NextcloudAuthFragment.kt b/app/src/main/kotlin/auth/NextcloudAuthFragment.kt index 83709c48..6009c389 100644 --- a/app/src/main/kotlin/auth/NextcloudAuthFragment.kt +++ b/app/src/main/kotlin/auth/NextcloudAuthFragment.kt @@ -83,7 +83,7 @@ class NextcloudAuthFragment : AppFragment() { binding.trustSelfSignedCerts.isChecked, ) - model.setAuthType(ConfRepository.AUTH_TYPE_NEXTCLOUD_DIRECT) + model.setBackend(ConfRepository.BACKEND_NEXTCLOUD) app().setupBackgroundSync(override = true) diff --git a/app/src/main/kotlin/auth/NextcloudAuthModel.kt b/app/src/main/kotlin/auth/NextcloudAuthModel.kt index 2d602781..1beffadf 100644 --- a/app/src/main/kotlin/auth/NextcloudAuthModel.kt +++ b/app/src/main/kotlin/auth/NextcloudAuthModel.kt @@ -58,9 +58,9 @@ class NextcloudAuthModel( confRepo.upsert(newConf) } - suspend fun setAuthType(newAuthType: String) { - val newConf = confRepo.select().first().copy(authType = newAuthType) + suspend fun setBackend(newBackend: String) { + val newConf = confRepo.select().first().copy(backend = newBackend) confRepo.upsert(newConf) - nextcloudApiSwitcher.switch(newAuthType) + nextcloudApiSwitcher.switch(newBackend) } } \ No newline at end of file diff --git a/app/src/main/kotlin/common/App.kt b/app/src/main/kotlin/common/App.kt index e573869e..45313f54 100644 --- a/app/src/main/kotlin/common/App.kt +++ b/app/src/main/kotlin/common/App.kt @@ -65,10 +65,10 @@ class App : Application() { } runBlocking { - val authType = get().select().first().authType + val backend = get().select().first().backend - if (authType.isNotBlank()) { - get().switch(authType) + if (backend.isNotBlank()) { + get().switch(backend) setupBackgroundSync(override = false) } } diff --git a/app/src/main/kotlin/common/ConfRepository.kt b/app/src/main/kotlin/common/ConfRepository.kt index 404aa988..b1168fa6 100644 --- a/app/src/main/kotlin/common/ConfRepository.kt +++ b/app/src/main/kotlin/common/ConfRepository.kt @@ -25,16 +25,15 @@ class ConfRepository( } companion object { - const val AUTH_TYPE_NEXTCLOUD_APP = "nextcloud_app" - const val AUTH_TYPE_NEXTCLOUD_DIRECT = "nextcloud_direct" - const val AUTH_TYPE_MINIFLUX = "miniflux" - const val AUTH_TYPE_STANDALONE = "standalone" + const val BACKEND_STANDALONE = "standalone" + const val BACKEND_MINIFLUX = "miniflux" + const val BACKEND_NEXTCLOUD = "nextcloud" const val SORT_ORDER_ASCENDING = "ascending" const val SORT_ORDER_DESCENDING = "descending" val DEFAULT_CONF = Conf( - authType = "", + backend = "", nextcloudServerUrl = "", nextcloudServerTrustSelfSignedCerts = false, nextcloudServerUsername = "", diff --git a/app/src/main/kotlin/settings/SettingsFragment.kt b/app/src/main/kotlin/settings/SettingsFragment.kt index d9307e4b..17491934 100644 --- a/app/src/main/kotlin/settings/SettingsFragment.kt +++ b/app/src/main/kotlin/settings/SettingsFragment.kt @@ -14,7 +14,6 @@ import co.appreactor.news.NavGraphDirections import co.appreactor.news.R import co.appreactor.news.databinding.FragmentSettingsBinding import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.nextcloud.android.sso.AccountImporter import common.App import common.AppFragment import common.ConfRepository @@ -222,8 +221,8 @@ class SettingsFragment : AppFragment() { logOut.setOnClickListener { lifecycleScope.launchWhenResumed { - when (model.getConf().first().authType) { - ConfRepository.AUTH_TYPE_STANDALONE -> { + when (model.getConf().first().backend) { + ConfRepository.BACKEND_STANDALONE -> { MaterialAlertDialogBuilder(requireContext()) .setMessage(R.string.delete_all_data_warning) .setPositiveButton( @@ -252,8 +251,8 @@ class SettingsFragment : AppFragment() { } } - when (conf.authType) { - ConfRepository.AUTH_TYPE_STANDALONE -> { + when (conf.backend) { + ConfRepository.BACKEND_STANDALONE -> { binding.logOutTitle.setText(R.string.delete_all_data) binding.logOutSubtitle.isVisible = false } @@ -270,7 +269,6 @@ class SettingsFragment : AppFragment() { private fun logOut() { lifecycleScope.launch { - AccountImporter.clearAllAuthTokens(context) model.logOut() findNavController().apply { diff --git a/app/src/main/res/layout/fragment_auth.xml b/app/src/main/res/layout/fragment_auth.xml index 80da5a8c..d764b0f2 100644 --- a/app/src/main/res/layout/fragment_auth.xml +++ b/app/src/main/res/layout/fragment_auth.xml @@ -48,37 +48,29 @@ app:layout_constraintTop_toBottomOf="@id/logo">