diff --git a/app/src/main/java/com/hover/stax/home/MainActivity.kt b/app/src/main/java/com/hover/stax/home/MainActivity.kt index 641b30f8e..f50c3a554 100644 --- a/app/src/main/java/com/hover/stax/home/MainActivity.kt +++ b/app/src/main/java/com/hover/stax/home/MainActivity.kt @@ -19,6 +19,7 @@ import android.content.Intent import android.os.Bundle import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels +import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.navigation.NavDirections import com.google.android.gms.auth.api.signin.GoogleSignIn @@ -60,6 +61,7 @@ class MainActivity : AbstractGoogleAuthActivity(), BiometricChecker.AuthListener val loginViewModel: LoginViewModel by viewModels() return loginViewModel } + lateinit var navHelper: NavHelper private val transferViewModel: TransferViewModel by viewModels() @@ -98,6 +100,8 @@ class MainActivity : AbstractGoogleAuthActivity(), BiometricChecker.AuthListener navHelper.setUpNav() } + override fun provideAuthenticationViewModel(): LoginViewModel = loginViewModel + fun checkPermissionsAndNavigate(navDirections: NavDirections) { navHelper.checkPermissionsAndNavigate(navDirections) } @@ -138,7 +142,7 @@ class MainActivity : AbstractGoogleAuthActivity(), BiometricChecker.AuthListener } } - fun signIn() = loginForResult.launch(loginViewModel.signInClient.signInIntent) + fun signInUser() = loginForResult.launch(loginViewModel.signInClient.signInIntent) private val loginForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> diff --git a/app/src/main/java/com/hover/stax/login/AbstractGoogleAuthActivity.kt b/app/src/main/java/com/hover/stax/login/AbstractGoogleAuthActivity.kt index 6f13efbe9..5bdcd370c 100644 --- a/app/src/main/java/com/hover/stax/login/AbstractGoogleAuthActivity.kt +++ b/app/src/main/java/com/hover/stax/login/AbstractGoogleAuthActivity.kt @@ -17,8 +17,11 @@ package com.hover.stax.login import android.content.Intent import android.os.Bundle +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat +import com.google.android.gms.auth.api.signin.GoogleSignIn +import com.google.android.gms.auth.api.signin.GoogleSignInOptions import com.google.android.material.snackbar.Snackbar import com.google.android.play.core.appupdate.AppUpdateInfo import com.google.android.play.core.appupdate.AppUpdateManager @@ -41,6 +44,8 @@ abstract class AbstractGoogleAuthActivity : AppCompatActivity(), StaxGoogleLoginInterface { + private lateinit var loginViewModel: LoginViewModel + protected abstract fun provideLoginViewModel(): LoginViewModel private lateinit var staxGoogleLoginInterface: StaxGoogleLoginInterface @@ -51,6 +56,11 @@ abstract class AbstractGoogleAuthActivity : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + loginViewModel = provideAuthenticationViewModel() + + initGoogleAuth() + setLoginObserver() + updateManager = AppUpdateManagerFactory.create(this) if (!BuildConfig.DEBUG) checkForUpdates() @@ -75,6 +85,36 @@ abstract class AbstractGoogleAuthActivity : this.staxGoogleLoginInterface = staxGoogleLoginInterface } + abstract fun provideAuthenticationViewModel(): LoginViewModel + + private fun initGoogleAuth() { + val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestIdToken(getString(R.string.google_server_client_id)).requestEmail().build() + loginViewModel.signInClient = GoogleSignIn.getClient(this, gso) + } + + private fun setLoginObserver() = with(loginViewModel) { + error.observe(this@AbstractGoogleAuthActivity) { + it?.let { staxGoogleLoginInterface.googleLoginFailed() } + } + + googleUser.observe(this@AbstractGoogleAuthActivity) { + it?.let { staxGoogleLoginInterface.googleLoginSuccessful() } + } + } + + fun signIn() = loginForResult.launch(loginViewModel.signInClient.signInIntent) + + private val loginForResult = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + loginViewModel.signIntoGoogle(result.data) + } else { + Timber.e("Google sign in failed") + staxGoogleLoginInterface.googleLoginFailed() + } + } + private fun checkForUpdates() { val updateInfoTask = updateManager.appUpdateInfo diff --git a/app/src/main/java/com/hover/stax/onboarding/OnBoardingActivity.kt b/app/src/main/java/com/hover/stax/onboarding/OnBoardingActivity.kt index be5ff19a4..5c9b3bf90 100644 --- a/app/src/main/java/com/hover/stax/onboarding/OnBoardingActivity.kt +++ b/app/src/main/java/com/hover/stax/onboarding/OnBoardingActivity.kt @@ -17,6 +17,7 @@ package com.hover.stax.onboarding import android.content.Intent import android.os.Bundle +import androidx.activity.viewModels import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment import com.hover.sdk.permissions.PermissionHelper @@ -33,7 +34,9 @@ import com.hover.stax.utils.NavUtil import com.hover.stax.utils.UIHelper import com.hover.stax.core.Utils import com.hover.stax.login.LoginViewModel +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class OnBoardingActivity : AbstractGoogleAuthActivity() { private lateinit var binding: OnboardingLayoutBinding @@ -42,6 +45,8 @@ class OnBoardingActivity : AbstractGoogleAuthActivity() { TODO("Not yet implemented") } + private val loginViewModel: LoginViewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { UIHelper.setFullscreenView(this) super.onCreate(savedInstanceState) @@ -55,6 +60,8 @@ class OnBoardingActivity : AbstractGoogleAuthActivity() { setGoogleLoginInterface(this) } + override fun provideAuthenticationViewModel(): LoginViewModel = loginViewModel + private fun setupNavigation() { val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_onboarding) as NavHostFragment navController = navHostFragment.navController diff --git a/app/src/main/java/com/hover/stax/presentation/bounties/BountyApplicationFragment.kt b/app/src/main/java/com/hover/stax/presentation/bounties/BountyApplicationFragment.kt index 09cb33c6a..863d91794 100644 --- a/app/src/main/java/com/hover/stax/presentation/bounties/BountyApplicationFragment.kt +++ b/app/src/main/java/com/hover/stax/presentation/bounties/BountyApplicationFragment.kt @@ -122,7 +122,7 @@ class BountyApplicationFragment : Fragment(), View.OnClickListener { private fun startGoogleSignIn() { logAnalyticsEvent(getString(R.string.clicked_bounty_email_continue_btn), requireContext()) updateProgress(0) - (activity as MainActivity).signIn() + (activity as MainActivity).signInUser() } // TODO - delete me diff --git a/app/src/main/java/com/hover/stax/presentation/welcome/WelcomeFragment.kt b/app/src/main/java/com/hover/stax/presentation/welcome/WelcomeFragment.kt index cd8e60752..edccfd287 100644 --- a/app/src/main/java/com/hover/stax/presentation/welcome/WelcomeFragment.kt +++ b/app/src/main/java/com/hover/stax/presentation/welcome/WelcomeFragment.kt @@ -30,7 +30,9 @@ import com.hover.stax.login.LoginViewModel import com.hover.stax.utils.NavUtil import com.hover.stax.utils.UIHelper import com.hover.stax.views.StaxDialog +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class WelcomeFragment : Fragment() { // TODO - FIX THIS diff --git a/app/src/main/java/com/hover/stax/settings/SettingsFragment.kt b/app/src/main/java/com/hover/stax/settings/SettingsFragment.kt index c9c87e475..864ec954d 100644 --- a/app/src/main/java/com/hover/stax/settings/SettingsFragment.kt +++ b/app/src/main/java/com/hover/stax/settings/SettingsFragment.kt @@ -376,7 +376,7 @@ class SettingsFragment : Fragment() { private fun startGoogleLogin() { binding.staxSupport.contactCard.showProgressIndicator() optInMarketing = true - (requireActivity() as MainActivity).signIn() + (requireActivity() as MainActivity).signInUser() } private fun marketingOptIn(optedIn: Boolean) {