diff --git a/app/src/main/java/foundation/e/accountmanager/ui/setup/GoogleAuthenticatorFragment.kt b/app/src/main/java/foundation/e/accountmanager/ui/setup/GoogleAuthenticatorFragment.kt index dfaee173f4be12d4d1a741dcf391a5b81d6c8aa7..3564ceb05cccbcb251005171e5fbb7ab27b4bcae 100644 --- a/app/src/main/java/foundation/e/accountmanager/ui/setup/GoogleAuthenticatorFragment.kt +++ b/app/src/main/java/foundation/e/accountmanager/ui/setup/GoogleAuthenticatorFragment.kt @@ -31,7 +31,11 @@ import foundation.e.accountmanager.databinding.FragmentGoogleAuthenticatorBindin import foundation.e.accountmanager.model.Credentials import kotlinx.android.synthetic.main.fragment_google_authenticator.* import android.net.ConnectivityManager +import android.text.Layout +import android.text.SpannableString +import android.text.style.AlignmentSpan import android.widget.Toast +import androidx.appcompat.app.AlertDialog class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenResponseCallback { @@ -56,60 +60,79 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - model = ViewModelProviders.of(this).get(GoogleAuthenticatorModel::class.java) + model = ViewModelProviders.of(this).get(GoogleAuthenticatorModel::class.java) loginModel = ViewModelProviders.of(requireActivity()).get(LoginModel::class.java) - + // Initialise the authorization service authorizationService = AuthorizationService(context!!) - val v = FragmentGoogleAuthenticatorBinding.inflate(inflater, container, false) + val v = FragmentGoogleAuthenticatorBinding.inflate(inflater, container, false) v.lifecycleOwner = this v.model = model activity?.intent?.let { - model.initialize(it) + model.initialize(it) + val builder = AlertDialog.Builder(context!!) if (!with(it) { getBooleanExtra(LoginActivity.ACCOUNT_PROVIDER_GOOGLE_AUTH_COMPLETE, false) }) { - // Get all the account providers - val providers = IdentityProvider.getEnabledProviders(context) - - // Iterate over the account providers - for (idp in providers) { - val retrieveCallback = AuthorizationServiceConfiguration.RetrieveConfigurationCallback { serviceConfiguration, ex -> - if (ex == null && serviceConfiguration != null) { - makeAuthRequest(serviceConfiguration, idp) - } else if (!isNetworkAvailable()) { - Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show() - activity!!.finish() - } else { - Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() - activity!!.finish() + val title = SpannableString(getString(R.string.google_alert_title)) + // alert dialog title align center + title.setSpan( + AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), + 0, + title.length, + 0 + ) + + builder.setTitle(title) + builder.setMessage(getString(R.string.google_alert_message)) + builder.setPositiveButton(android.R.string.yes) { dialog, which -> + // Get all the account providers + val providers = IdentityProvider.getEnabledProviders(context) + + // Iterate over the account providers + for (idp in providers) { + val retrieveCallback = AuthorizationServiceConfiguration.RetrieveConfigurationCallback { serviceConfiguration, ex -> + if (ex == null && serviceConfiguration != null) { + makeAuthRequest(serviceConfiguration, idp) + } else if (!isNetworkAvailable()) { + Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show() + activity!!.finish() + } else { + Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() + activity!!.finish() + } } - } - if (idp.name == getString(R.string.google_name)) { - // Get configurations for the Google account provider - idp.retrieveConfig(context, retrieveCallback) + if (idp.name == getString(R.string.google_name)) { + // Get configurations for the Google account provider + idp.retrieveConfig(context, retrieveCallback) + } } } + builder.setCancelable(false) + + val dialog = builder.create() + dialog.show() + } else { if (authState == null) { - val response = AuthorizationResponse.fromIntent(activity!!.intent) + val response = AuthorizationResponse.fromIntent(activity!!.intent) val ex = AuthorizationException.fromIntent(activity!!.intent) authState = AuthState(response, ex) if (response != null) { - exchangeAuthorizationCode(response) + exchangeAuthorizationCode(response) } else if (!isNetworkAvailable()) { - Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show() - activity!!.finish() + Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show() + activity!!.finish() } else { - Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() + Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() activity!!.finish() } } - } + } } return v.root @@ -118,8 +141,8 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon private fun makeAuthRequest( serviceConfig: AuthorizationServiceConfiguration, idp: IdentityProvider) { - - if (!isNetworkAvailable()) { + + if (!isNetworkAvailable()) { Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show() activity!!.finish() } @@ -141,8 +164,8 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon idp.clientSecret), authorizationService?.createCustomTabsIntentBuilder()!! .build()) - - requireActivity().setResult(Activity.RESULT_OK) + + requireActivity().setResult(Activity.RESULT_OK) requireActivity().finish() } @@ -168,7 +191,7 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon } private fun exchangeAuthorizationCode(authorizationResponse: AuthorizationResponse) { - if (!isNetworkAvailable()) { + if (!isNetworkAvailable()) { Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show() activity!!.finish() } @@ -189,7 +212,7 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon private fun performTokenRequest(request: TokenRequest) { - if (!isNetworkAvailable()) { + if (!isNetworkAvailable()) { Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show() activity!!.finish() } @@ -201,11 +224,11 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon override fun onTokenRequestCompleted(response: TokenResponse?, ex: AuthorizationException?) { authState?.update(response, ex) - getAccountInfo() + getAccountInfo() } private fun getAccountInfo() { - if (!isNetworkAvailable()) { + if (!isNetworkAvailable()) { Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show() activity!!.finish() } @@ -215,13 +238,13 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon if (!authState!!.isAuthorized || discoveryDoc == null || discoveryDoc.userinfoEndpoint == null) { - Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() + Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() activity!!.finish() } else { object : AsyncTask() { override fun doInBackground(vararg params: Void): Void? { - if (fetchUserInfo()) { + if (fetchUserInfo()) { Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() activity!!.finish() } @@ -258,7 +281,7 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon authState!!.performActionWithFreshTokens(authorizationService!!, AuthState.AuthStateAction { accessToken, _, ex -> if (ex != null) { - error = true + error = true return@AuthStateAction } @@ -270,7 +293,7 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon userInfoEndpoint = URL(discoveryDoc.userinfoEndpoint!!.toString()) } catch (urlEx: MalformedURLException) { - error = true + error = true return@AuthStateAction } @@ -284,10 +307,10 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon updateUserInfo(JSONObject(response)) } catch (ioEx: IOException) { - error = true + error = true } catch (jsonEx: JSONException) { - error = true + error = true } finally { if (userInfoResponse != null) { @@ -295,14 +318,14 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon userInfoResponse.close() } catch (ioEx: IOException) { - error = true + error = true } } } }) - return error + return error } @Throws(IOException::class) @@ -326,7 +349,7 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon } private fun onAccountInfoGotten() { - if (!isNetworkAvailable()) { + if (!isNetworkAvailable()) { Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show() activity!!.finish() } @@ -334,26 +357,26 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon if (userInfoJson != null) { try { - var emailAddress = "" + var emailAddress = "" if (userInfoJson!!.has("email")) { emailAddress = userInfoJson!!.getString("email") } - if (validate(emailAddress, authState!!)) - requireFragmentManager().beginTransaction() - .replace(android.R.id.content, DetectConfigurationFragment(), null) - .addToBackStack(null) - .commit() + if (validate(emailAddress, authState!!)) + requireFragmentManager().beginTransaction() + .replace(android.R.id.content, DetectConfigurationFragment(), null) + .addToBackStack(null) + .commit() } catch (ex: JSONException) { - Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() + Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() activity!!.finish() } } else { - Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() + Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show() activity!!.finish() } @@ -378,16 +401,16 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon when { - model.loginWithUrlAndTokens.value == true -> { - validateUrl() + model.loginWithUrlAndTokens.value == true -> { + validateUrl() - model.usernameError.value = null + model.usernameError.value = null - if (loginModel.baseURI != null) { - valid = true - loginModel.credentials = Credentials(emailAddress, null, authState, null) - } - } + if (loginModel.baseURI != null) { + valid = true + loginModel.credentials = Credentials(emailAddress, null, authState, null) + } + } } diff --git a/app/src/main/java/foundation/e/accountmanager/ui/setup/LoginActivity.kt b/app/src/main/java/foundation/e/accountmanager/ui/setup/LoginActivity.kt index 3ec41cbaa68a0763927d69713202ef475024cf22..b25dbb90fe534dcc5d6c69b24b43b173f98c736b 100644 --- a/app/src/main/java/foundation/e/accountmanager/ui/setup/LoginActivity.kt +++ b/app/src/main/java/foundation/e/accountmanager/ui/setup/LoginActivity.kt @@ -10,11 +10,7 @@ package foundation.e.accountmanager.ui.setup import android.os.Bundle import android.view.MenuItem -import android.text.Layout -import android.text.SpannableString -import android.text.style.AlignmentSpan import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import foundation.e.accountmanager.R import foundation.e.accountmanager.App @@ -45,11 +41,11 @@ class LoginActivity: AppCompatActivity() { * When set, the password field will be set to this value. */ const val EXTRA_PASSWORD = "password" - - const val SETUP_ACCOUNT_PROVIDER_TYPE = "setup_account_provider_type" + + const val SETUP_ACCOUNT_PROVIDER_TYPE = "setup_account_provider_type" const val ACCOUNT_PROVIDER_EELO = "eelo" const val ACCOUNT_PROVIDER_GOOGLE = "google" - const val ACCOUNT_PROVIDER_GOOGLE_AUTH_COMPLETE = "google_auth_complete" + const val ACCOUNT_PROVIDER_GOOGLE_AUTH_COMPLETE = "google_auth_complete" } private val loginFragmentLoader = ServiceLoader.load(ILoginCredentialsFragment::class.java)!! @@ -65,42 +61,22 @@ class LoginActivity: AppCompatActivity() { fragment = fragment ?: factory.getFragment(intent) if (fragment != null) { - when (intent.getStringExtra(SETUP_ACCOUNT_PROVIDER_TYPE)) { + when (intent.getStringExtra(SETUP_ACCOUNT_PROVIDER_TYPE)) { ACCOUNT_PROVIDER_EELO -> { supportFragmentManager.beginTransaction() .replace(android.R.id.content, EeloAuthenticatorFragment()) .commit() } ACCOUNT_PROVIDER_GOOGLE -> { - val builder = AlertDialog.Builder(this) - val title = SpannableString(getString(R.string.google_alert_title)) - - // alert dialog title align center - title.setSpan( - AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), - 0, - title.length, - 0 - ) - - builder.setTitle(title) - builder.setMessage(getString(R.string.google_alert_message)) - builder.setPositiveButton(android.R.string.yes) { dialog, which -> - dialog.cancel() - supportFragmentManager.beginTransaction() - .replace(android.R.id.content, GoogleAuthenticatorFragment()) - .commit() - } - builder.setCancelable(false) - - val dialog = builder.create() - dialog.show() + supportFragmentManager.beginTransaction() + .replace(android.R.id.content, GoogleAuthenticatorFragment()) + .commit() } - else -> - // first call, add first login fragment - supportFragmentManager.beginTransaction() - .replace(android.R.id.content, fragment) - .commit() + else -> + // first call, add first login fragment + supportFragmentManager.beginTransaction() + .replace(android.R.id.content, fragment) + .commit() } } else Logger.log.severe("Couldn't create LoginFragment")