Я работаю над преобразованием нашего приложения в новейшие стандарты с использованием новейших библиотек. В настоящее время для входа в систему пользователь переходит на Chrome CustomTab. Затем они входят в систему со своей информацией, и веб-сайт перенаправляет обратно к нашей активности входа в систему, которая затем приводит нас к любому виду после этого. Вот как мы в настоящее время делаем это:
class OAuthCallbackActivity : AppCompatActivity() {
companion object {
private const val STATE_KEY = "state"
private const val RESPONSE_TYPE_KEY = "code"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (Intent.ACTION_VIEW == intent.action && intent.data != null) {
val status = getStatusFromUri()
Timber.e("The intent from the callback activity was fine")
if (!intent.data!!.getQueryParameter("code").isNullOrBlank() &&
!intent.data!!.getQueryParameter("state").isNullOrBlank()) {
startActivity(LoginActivity.startIntent(this, intent.data))
}
} else {
}
finish()
}
private fun getStatusFromUri(): String? {
return intent.data!!.getQueryParameter(STATE_KEY)
}
}
Это действие захватывает intent.data
для LoginActivity и запускает его. Вот код для LoginActivity:
class LoginActivity : BaseActivity() {
private lateinit var viewModel: LoginViewModel
companion object {
const val CALLBACK_KEY = "LoginActivity.CALLBACK_KEY"
fun startIntent(context: Context): Intent {
return Intent(context, LoginActivity::class.java).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
}
fun startIntent(context: Context, uriData: Uri?): Intent {
val result = Intent(context, LoginActivity::class.java)
result.putExtra(CALLBACK_KEY, uriData)
return result
}
}
override fun layoutResId(): Int {
return R.layout.activity_login
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(LoginViewModel::class.java)
// View Binding was here
viewModel.checkForUserSession() // checks to see if a user session already exists in storage
// Observers
val loadingObserver = Observer<Boolean> { isLoading ->
when(isLoading) {
true -> progress_indicator.visibility = VISIBLE
false -> progress_indicator.visibility = GONE
}
}
val authObserver = Observer<UserSession> { userSession ->
if(userSession != null) advanceToEnrollment()
}
viewModel.isLoadingRequired.observe(this, loadingObserver)
viewModel.userSession.observe(this, authObserver)
}
override fun onStart() {
super.onStart()
viewModel.processNewIntent(getIntent()) // this parses the intent.data that was passed, then grabs the data needed to construct a JWT
}
private fun advanceToEnrollment() {
startActivity(EnrollmentActivity.startIntent(this))
finish()
}
}
Как мне справиться с этим в архитектуре одиночной активности Android-навигации? В настоящее время мы переходим к новому действию, в котором размещены несколько фрагментов.
Спасибо за любую помощь!
e:
Я хотел бы получить OAuthToken из обратного вызова uri из Chrome(выглядит как my_app: // oauth) и сохраните его в SharedPreferences, затем перейдите к другому фрагменту. Я полагаю, что мой вопрос заключается в том, как мне обработать намерение, возвращенное с веб-сайта, содержащего маркер oauth, с помощью навигации по Android без необходимости запуска нового действия для прослушивания этого обратного вызова намерения. Извините, если я не был ясен