diff --git a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt index cf75304e50f399fdadf2020e1e408a044aa909bf..c231ae4a399ead2ca72e8e28499a78b7bc8132f2 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt @@ -31,6 +31,7 @@ import at.bitfire.davdroid.db.AppDatabase import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.settings.AccountSettings +import at.bitfire.davdroid.ui.account.SettingsActivity import at.bitfire.davdroid.ui.setup.LoginActivity import at.bitfire.davdroid.util.AuthStatePrefUtils import dagger.hilt.EntryPoint @@ -149,6 +150,16 @@ abstract class DefaultAccountAuthenticatorService : Service(), OnAccountsUpdateL LoginActivity.USERNAME_HINT, it.getString(LoginActivity.USERNAME_HINT) ) + + intent.putExtra( + SettingsActivity.EXTRA_IS_RE_AUTHENTICATING, + it.getBoolean(SettingsActivity.EXTRA_IS_RE_AUTHENTICATING) + ) + + intent.putExtra( + SettingsActivity.EXTRA_ACCOUNT_NAME_HINT, + it.getString(SettingsActivity.EXTRA_ACCOUNT_NAME_HINT) + ) } val bundle = Bundle(1) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt index 22cc425c293fb7e553cdbe795eb2df7c5a42d2e8..f0c33eca667c69a08cd606019fa4f1465afd93f5 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt @@ -62,6 +62,8 @@ class SettingsActivity: AppCompatActivity() { companion object { const val EXTRA_ACCOUNT = "account" + const val EXTRA_IS_RE_AUTHENTICATING = "IS_RE_AUTHENTICATING" + const val EXTRA_ACCOUNT_NAME_HINT = "ACCOUNT_NAME_HINT" } private val account by lazy { intent.getParcelableExtra(EXTRA_ACCOUNT) ?: throw IllegalArgumentException("EXTRA_ACCOUNT must be set") } @@ -127,9 +129,20 @@ class SettingsActivity: AppCompatActivity() { } private fun launchSetup(): Boolean { - AccountManager.get(context).addAccount(account.type, - null, null, null, activity, null, - null) + val bundle = Bundle().apply { + putBoolean(EXTRA_IS_RE_AUTHENTICATING, true) + putString(EXTRA_ACCOUNT_NAME_HINT, account.name) + } + + AccountManager.get(context).addAccount( + /* accountType = */ account.type, + /* authTokenType = */ null, + /* requiredFeatures = */ null, + /* addAccountOptions = */ bundle, + /* activity = */ activity, + /* callback = */ null, + /* handler = */ null + ) return true } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DetectConfigurationFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DetectConfigurationFragment.kt index 3c80ddf72e6ffae3da6679b913c81c138abfb84a..6c0e5aa6b56d7381afd5922e588a8765a83441ab 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DetectConfigurationFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DetectConfigurationFragment.kt @@ -24,6 +24,7 @@ import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.murenasso.MurenaSsoMigrationPreferences import at.bitfire.davdroid.servicedetection.DavResourceFinder import at.bitfire.davdroid.ui.DebugInfoActivity +import at.bitfire.davdroid.ui.account.SettingsActivity import com.google.android.material.dialog.MaterialAlertDialogBuilder import java.lang.ref.WeakReference import java.net.URI @@ -35,16 +36,26 @@ class DetectConfigurationFragment: Fragment() { private val loginModel by activityViewModels() private val model by viewModels() - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val accountType = requireActivity().intent.getStringExtra(LoginActivity.ACCOUNT_TYPE) - if (!MurenaSsoMigrationPreferences.isSsoMigrationRunning(requireContext())) { - if (model.blockProceedWithLogin(accountType)) { - ECloudAccountHelper.showMultipleECloudAccountNotAcceptedDialog(requireActivity()) - return + val isReAuthenticating = + requireActivity().intent.getBooleanExtra(SettingsActivity.EXTRA_IS_RE_AUTHENTICATING, false) + + val isSsoMigrationRunning = + MurenaSsoMigrationPreferences.isSsoMigrationRunning(requireContext()) + + val isOAuthFlowComplete = + requireActivity().intent.getBooleanExtra(LoginActivity.OPENID_AUTH_FLOW_COMPLETE, false) + + if (!isOAuthFlowComplete) { + if (!isReAuthenticating && !isSsoMigrationRunning) { + if (model.blockProceedWithLogin(accountType)) { + ECloudAccountHelper.showMultipleECloudAccountNotAcceptedDialog(requireActivity()) + return + } } } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt index 56c1d817eb02afc1f91427c264beb549b5b4310d..e601529f6a9fc47c31d600ad999078e9835a1c24 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt @@ -39,6 +39,7 @@ import at.bitfire.davdroid.databinding.FragmentEeloAuthenticatorBinding import at.bitfire.davdroid.db.Credentials import at.bitfire.davdroid.murenasso.MurenaSsoMigrationPreferences import at.bitfire.davdroid.ui.ShowUrlActivity +import at.bitfire.davdroid.ui.account.SettingsActivity import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout @@ -59,6 +60,14 @@ class EeloAuthenticatorFragment : Fragment() { private lateinit var passwordEditText: TextInputEditText private lateinit var passwordHolder: View + private val isReAuthenticating by lazy { + requireActivity().intent.getBooleanExtra(SettingsActivity.EXTRA_IS_RE_AUTHENTICATING, false) + } + + private val userNameHint by lazy { + requireActivity().intent.getStringExtra(SettingsActivity.EXTRA_ACCOUNT_NAME_HINT) + } + private fun isNetworkAvailable(): Boolean { val connectivityManager = requireActivity().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetworkInfo = connectivityManager.activeNetworkInfo @@ -120,9 +129,16 @@ class EeloAuthenticatorFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + if (isReAuthenticating) { + userIdEditText.setText(userNameHint) + return + } + if (MurenaSsoMigrationPreferences.isSsoMigrationRunning(requireContext())) { return } + if (model.blockProceedWithLogin()) { ECloudAccountHelper.showMultipleECloudAccountNotAcceptedDialog(requireActivity()) } @@ -219,7 +235,13 @@ class EeloAuthenticatorFragment : Fragment() { val password = passwordEditText.text.toString() if (handleOpenIdAuth && userId.isNotBlank()) { - requireActivity().intent.putExtra(LoginActivity.USERNAME_HINT, userIdEditText.text.toString()) + requireActivity().intent.apply { + val userNameHint = + if (!userNameHint.isNullOrBlank()) userNameHint else userIdEditText.text.toString() + + putExtra(LoginActivity.USERNAME_HINT, userNameHint) + putExtra(SettingsActivity.EXTRA_IS_RE_AUTHENTICATING, isReAuthenticating) + } navigate(MurenaOpenIdAuthFragment()) } else if (userId.isNotBlank() && password.isNotBlank() && validate()) { navigate(DetectConfigurationFragment()) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/MurenaOpenIdAuthFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/MurenaOpenIdAuthFragment.kt index b7b37c9a67dcc647191c31de5010061396d3f5e8..dbf0c07961e26571cdbd5b9e50bc50eac91864b1 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/MurenaOpenIdAuthFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/MurenaOpenIdAuthFragment.kt @@ -21,6 +21,7 @@ import android.view.View import at.bitfire.davdroid.ECloudAccountHelper import at.bitfire.davdroid.authorization.IdentityProvider import at.bitfire.davdroid.murenasso.MurenaSsoMigrationPreferences +import at.bitfire.davdroid.ui.account.SettingsActivity import org.json.JSONObject class MurenaOpenIdAuthFragment : OpenIdAuthenticationBaseFragment(IdentityProvider.MURENA) { @@ -28,6 +29,14 @@ class MurenaOpenIdAuthFragment : OpenIdAuthenticationBaseFragment(IdentityProvid override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val isReAuthenticating = + requireActivity().intent.getBooleanExtra(SettingsActivity.EXTRA_IS_RE_AUTHENTICATING, false) + + if (isReAuthenticating) { + startAuthFLow() + return + } + if (MurenaSsoMigrationPreferences.isSsoMigrationRunning(requireContext())) { startAuthFLow() return