diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index 0c606960c5..99980c650c 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -553,7 +553,7 @@ android:enabled="true" android:exported="true" android:process=":ui" - android:configChanges="keyboardHidden|keyboard|orientation|screenSize" + android:configChanges="keyboardHidden|keyboard|orientation|screenSize|smallestScreenSize|layoutDirection" android:launchMode="singleTask" android:excludeFromRecents="false"> diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInActivity.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInActivity.kt index 86b28f286c..353c8be3c5 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInActivity.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInActivity.kt @@ -91,10 +91,14 @@ class AssistedSignInActivity : AppCompatActivity() { errorResult(Status(CommonStatusCodes.ERROR, "accounts is empty.")) return } - AssistedSignInFragment(googleSignInOptions!!, beginSignInRequest!!, accounts, clientPackageName!!, - { errorResult(it) }, - { loginResult(it) }) - .show(supportFragmentManager, AssistedSignInFragment.TAG) + val fragment = supportFragmentManager.findFragmentByTag(AssistedSignInFragment.TAG) + if (fragment != null) { + val assistedSignInFragment = fragment as AssistedSignInFragment + assistedSignInFragment.cancelLogin(true) + } else { + AssistedSignInFragment.newInstance(clientPackageName!!, googleSignInOptions!!, beginSignInRequest!!) + .show(supportFragmentManager, AssistedSignInFragment.TAG) + } return } @@ -114,7 +118,7 @@ class AssistedSignInActivity : AppCompatActivity() { startActivityForResult(intent, REQUEST_CODE_SIGN_IN) } - private fun errorResult(status: Status) { + fun errorResult(status: Status) { Log.d(TAG, "errorResult: $status") setResult(RESULT_CANCELED, Intent().apply { putExtra(AuthConstants.STATUS, SafeParcelableSerializer.serializeToBytes(status)) @@ -122,7 +126,7 @@ class AssistedSignInActivity : AppCompatActivity() { finish() } - private fun loginResult(googleSignInAccount: GoogleSignInAccount?) { + fun loginResult(googleSignInAccount: GoogleSignInAccount?) { if (googleSignInAccount == null) { errorResult(Status(CommonStatusCodes.CANCELED, "User cancelled.")) return diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInFragment.kt index 673197229f..1d43328eaa 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInFragment.kt @@ -6,6 +6,7 @@ package org.microg.gms.auth.signin import android.accounts.Account +import android.accounts.AccountManager import android.app.Dialog import android.content.DialogInterface import android.os.Bundle @@ -19,6 +20,7 @@ import android.widget.ImageView import android.widget.LinearLayout import android.widget.ProgressBar import android.widget.TextView +import androidx.core.content.getSystemService import androidx.lifecycle.lifecycleScope import com.google.android.gms.R import com.google.android.gms.auth.api.identity.BeginSignInRequest @@ -35,22 +37,35 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.microg.gms.auth.AuthConstants import org.microg.gms.people.PeopleManager import org.microg.gms.utils.getApplicationLabel -class AssistedSignInFragment( - private val options: GoogleSignInOptions, - private val beginSignInRequest: BeginSignInRequest, - private val accounts: Array, - private val clientPackageName: String, - private val errorBlock: (Status) -> Unit, - private val loginBlock: (GoogleSignInAccount?) -> Unit -) : BottomSheetDialogFragment() { +class AssistedSignInFragment : BottomSheetDialogFragment() { companion object { const val TAG = "AssistedSignInFragment" + private const val KEY_PACKAGE_NAME = "clientPackageName" + private const val KEY_GOOGLE_SIGN_IN_OPTIONS = "googleSignInOptions" + private const val KEY_BEGIN_SIGN_IN_REQUEST = "beginSignInRequest" + + fun newInstance(clientPackageName: String, options: GoogleSignInOptions, request: BeginSignInRequest): AssistedSignInFragment { + val fragment = AssistedSignInFragment() + val args = Bundle().apply { + putString(KEY_PACKAGE_NAME, clientPackageName) + putParcelable(KEY_GOOGLE_SIGN_IN_OPTIONS, options) + putParcelable(KEY_BEGIN_SIGN_IN_REQUEST, request) + } + fragment.arguments = args + return fragment + } } + private lateinit var clientPackageName: String + private lateinit var options: GoogleSignInOptions + private lateinit var beginSignInRequest: BeginSignInRequest + private lateinit var accounts: Array + private var cancelBtn: ImageView? = null private var container: FrameLayout? = null private var loginJob: Job? = null @@ -59,6 +74,16 @@ class AssistedSignInFragment( private var lastChooseAccount: Account? = null private var lastChooseAccountPermitted = false + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Log.d(TAG, "onCreate start") + clientPackageName = arguments?.getString(KEY_PACKAGE_NAME) ?: return errorResult() + options = arguments?.getParcelable(KEY_GOOGLE_SIGN_IN_OPTIONS) ?: return errorResult() + beginSignInRequest = arguments?.getParcelable(KEY_BEGIN_SIGN_IN_REQUEST) ?: return errorResult() + val accountManager = activity?.getSystemService() ?: return errorResult() + accounts = accountManager.getAccountsByType(AuthConstants.DEFAULT_ACCOUNT_TYPE) + } + override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) Log.d(TAG, "onActivityCreated start") @@ -91,7 +116,7 @@ class AssistedSignInFragment( } }.onFailure { Log.d(TAG, "filterAccountsLogin: error", it) - errorBlock(Status(CommonStatusCodes.INTERNAL_ERROR, "auth error")) + errorResult() return@launch } if (accounts.size == 1) { @@ -244,7 +269,7 @@ class AssistedSignInFragment( override fun onDismiss(dialog: DialogInterface) { val assistedSignInActivity = requireContext() as AssistedSignInActivity if (!assistedSignInActivity.isChangingConfigurations && !isSigningIn) { - errorBlock(Status(CommonStatusCodes.CANCELED, "User cancelled.")) + errorResult() } cancelLogin() super.onDismiss(dialog) @@ -270,10 +295,10 @@ class AssistedSignInFragment( prepareChooseLogin(account, showConsent = true, permitted = true) return@launch } - loginBlock(googleSignInAccount) + loginResult(googleSignInAccount) }.onFailure { Log.d(TAG, "startLogin: error", it) - errorBlock(Status(CommonStatusCodes.INTERNAL_ERROR, "signIn error")) + errorResult() } } } @@ -287,4 +312,20 @@ class AssistedSignInFragment( } } + private fun errorResult() { + if (activity != null && activity is AssistedSignInActivity) { + val assistedSignInActivity = activity as AssistedSignInActivity + assistedSignInActivity.errorResult(Status(CommonStatusCodes.INTERNAL_ERROR, "signIn error")) + } + activity?.finish() + } + + private fun loginResult(googleSignInAccount: GoogleSignInAccount?) { + if (activity != null && activity is AssistedSignInActivity) { + val assistedSignInActivity = activity as AssistedSignInActivity + assistedSignInActivity.loginResult(googleSignInAccount) + } + activity?.finish() + } + }