From 752267f79c258834312c50dadb052bd5308daf0e Mon Sep 17 00:00:00 2001 From: zechs Date: Fri, 24 Jun 2022 16:21:38 +0530 Subject: [PATCH 1/3] moved `GoogleSignInClient` to `DriveHelper` --- .../zechs/drive/stream/data/remote/DriveHelper.kt | 14 ++++++++++++++ .../zechs/drive/stream/ui/main/MainActivity.kt | 12 +----------- .../zechs/drive/stream/ui/main/MainViewModel.kt | 1 + 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/zechs/drive/stream/data/remote/DriveHelper.kt b/app/src/main/java/zechs/drive/stream/data/remote/DriveHelper.kt index 905b5ba..7217fd0 100755 --- a/app/src/main/java/zechs/drive/stream/data/remote/DriveHelper.kt +++ b/app/src/main/java/zechs/drive/stream/data/remote/DriveHelper.kt @@ -5,6 +5,9 @@ import android.content.Intent import android.util.Log import com.google.android.gms.auth.GoogleAuthUtil import com.google.android.gms.auth.api.signin.GoogleSignIn +import com.google.android.gms.auth.api.signin.GoogleSignInClient +import com.google.android.gms.auth.api.signin.GoogleSignInOptions +import com.google.android.gms.common.Scopes import com.google.android.gms.common.api.Scope import com.google.api.client.extensions.android.http.AndroidHttp import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential @@ -35,6 +38,17 @@ class DriveHelper @Inject constructor( var hasSignedIn = false private set + + fun getClient(): GoogleSignInClient { + val signInOptions = GoogleSignInOptions + .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestScopes(Scope(Scopes.DRIVE_FULL)) + .requestEmail() + .build() + + return GoogleSignIn.getClient(context, signInOptions) + } + /** * Public method to send intent result from * Google Sign-in flow diff --git a/app/src/main/java/zechs/drive/stream/ui/main/MainActivity.kt b/app/src/main/java/zechs/drive/stream/ui/main/MainActivity.kt index f2f80fe..28a2699 100644 --- a/app/src/main/java/zechs/drive/stream/ui/main/MainActivity.kt +++ b/app/src/main/java/zechs/drive/stream/ui/main/MainActivity.kt @@ -12,10 +12,6 @@ import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment -import com.google.android.gms.auth.api.signin.GoogleSignIn -import com.google.android.gms.auth.api.signin.GoogleSignInOptions -import com.google.android.gms.common.Scopes -import com.google.android.gms.common.api.Scope import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import zechs.drive.stream.R @@ -69,13 +65,7 @@ class MainActivity : AppCompatActivity() { private fun requestSignIn() { Log.d(TAG, "Requesting sign-in") - val signInOptions = GoogleSignInOptions - .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .requestScopes(Scope(Scopes.DRIVE_FULL)) - .requestEmail() - .build() - - val client = GoogleSignIn.getClient(this, signInOptions) + val client = viewModel.getClient() val startForResult = registerForActivityResult( ActivityResultContracts.StartActivityForResult() diff --git a/app/src/main/java/zechs/drive/stream/ui/main/MainViewModel.kt b/app/src/main/java/zechs/drive/stream/ui/main/MainViewModel.kt index cabf246..09de927 100755 --- a/app/src/main/java/zechs/drive/stream/ui/main/MainViewModel.kt +++ b/app/src/main/java/zechs/drive/stream/ui/main/MainViewModel.kt @@ -47,4 +47,5 @@ class MainViewModel @Inject constructor( Log.d(TAG, msg) } + fun getClient() = driveHelper.getClient() } From a9b854ce6e01956140d804fef1fa8ddeb81be5a5 Mon Sep 17 00:00:00 2001 From: zechs Date: Fri, 24 Jun 2022 16:23:06 +0530 Subject: [PATCH 2/3] Added menu in home layout - Logout option --- app/src/main/res/drawable/ic_logout_24.xml | 10 ++++++++++ app/src/main/res/layout/fragment_home.xml | 1 + app/src/main/res/menu/main_menu.xml | 10 ++++++++++ app/src/main/res/values/strings.xml | 4 ++++ 4 files changed, 25 insertions(+) create mode 100644 app/src/main/res/drawable/ic_logout_24.xml create mode 100644 app/src/main/res/menu/main_menu.xml diff --git a/app/src/main/res/drawable/ic_logout_24.xml b/app/src/main/res/drawable/ic_logout_24.xml new file mode 100644 index 0000000..7b5f586 --- /dev/null +++ b/app/src/main/res/drawable/ic_logout_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index a185562..7feac63 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -20,6 +20,7 @@ style="@style/MenuTheme" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" + app:menu="@menu/main_menu" app:title="@string/app_name" /> diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml new file mode 100644 index 0000000..9305ad7 --- /dev/null +++ b/app/src/main/res/menu/main_menu.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 51f0cc5..bffcfeb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,4 +23,8 @@ OK Details Retry + Logout + Are you sure you want to log out? + No + Yes \ No newline at end of file From 6543b8f349695efacdaae859871d526690a9e8ba Mon Sep 17 00:00:00 2001 From: zechs Date: Fri, 24 Jun 2022 16:24:33 +0530 Subject: [PATCH 3/3] Logout works --- .../drive/stream/ui/home/HomeFragment.kt | 47 +++++++++++++++++++ .../drive/stream/ui/home/HomeViewModel.kt | 29 ++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 app/src/main/java/zechs/drive/stream/ui/home/HomeViewModel.kt diff --git a/app/src/main/java/zechs/drive/stream/ui/home/HomeFragment.kt b/app/src/main/java/zechs/drive/stream/ui/home/HomeFragment.kt index 25c4576..101e8f4 100644 --- a/app/src/main/java/zechs/drive/stream/ui/home/HomeFragment.kt +++ b/app/src/main/java/zechs/drive/stream/ui/home/HomeFragment.kt @@ -5,13 +5,21 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController import com.google.android.material.button.MaterialButton +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import zechs.drive.stream.R import zechs.drive.stream.databinding.FragmentHomeBinding import zechs.drive.stream.ui.BaseFragment import zechs.drive.stream.utils.ext.navigateSafe + class HomeFragment : BaseFragment() { companion object { @@ -21,6 +29,8 @@ class HomeFragment : BaseFragment() { private var _binding: FragmentHomeBinding? = null private val binding get() = _binding!! + private val viewModel by activityViewModels() + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -75,6 +85,8 @@ class HomeFragment : BaseFragment() { } + setupToolbar() + observeLogOutState() } private fun navigateToFiles( @@ -90,6 +102,41 @@ class HomeFragment : BaseFragment() { } } + private fun setupToolbar() { + binding.toolbar.setOnMenuItemClickListener { item -> + if (item.itemId == R.id.action_logOut) { + MaterialAlertDialogBuilder(context!!) + .setTitle(getString(R.string.log_out_dialog_title)) + .setNegativeButton(getString(R.string.no)) { dialog, _ -> + dialog.dismiss() + } + .setPositiveButton(getString(R.string.yes)) { dialog, _ -> + dialog.dismiss() + Log.d(TAG, "Logging out...") + viewModel.logOut() + } + .show() + return@setOnMenuItemClickListener true + } + return@setOnMenuItemClickListener false + } + } + + private fun observeLogOutState() { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.hasLoggedOut.collect { + if (it) { + // restart activity + activity!!.finish() + delay(250L) + activity!!.startActivity(activity!!.intent) + } + } + } + } + } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/zechs/drive/stream/ui/home/HomeViewModel.kt b/app/src/main/java/zechs/drive/stream/ui/home/HomeViewModel.kt new file mode 100644 index 0000000..26dccce --- /dev/null +++ b/app/src/main/java/zechs/drive/stream/ui/home/HomeViewModel.kt @@ -0,0 +1,29 @@ +package zechs.drive.stream.ui.home + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import zechs.drive.stream.data.remote.DriveHelper +import javax.inject.Inject + +@HiltViewModel +class HomeViewModel @Inject constructor( + private val driveHelper: DriveHelper +) : ViewModel() { + + private val _hasLoggedOut = MutableStateFlow(false) + val hasLoggedOut = _hasLoggedOut.asStateFlow() + + fun logOut() = viewModelScope.launch { + delay(250L) + val client = driveHelper.getClient() + // client.revokeAccess() + client.signOut() + _hasLoggedOut.value = true + } + +}