Преглед изворни кода

add ability to exit from app double-click back button
fix navigation for splash, auth features

MrOzOn пре 5 година
родитељ
комит
a0c2f50741

+ 9 - 5
app/src/main/res/navigation/nav_graph.xml

@@ -15,9 +15,8 @@
             app:destination="@id/loginFragment"
             app:enterAnim="@anim/slide_in_right"
             app:exitAnim="@anim/slide_out_left"
-            app:launchSingleTop="true"
             app:popEnterAnim="@anim/slide_in_left"
-            app:popExitAnim="@anim/slide_out_right" />
+            app:popExitAnim="@anim/slide_out_right"/>
         <action
             android:id="@+id/action_splashFragment_to_listPersonFragment"
             app:destination="@id/listPersonFragment"
@@ -64,15 +63,20 @@
             app:enterAnim="@anim/slide_in_right"
             app:exitAnim="@anim/slide_out_left"
             app:popEnterAnim="@anim/slide_in_left"
-            app:popExitAnim="@anim/slide_out_right"/>
+            app:popExitAnim="@anim/slide_out_right"
+            app:popUpTo="@id/loginFragment"
+            app:popUpToInclusive="true" />
     </fragment>
 
-    <action android:id="@+id/action_global_loginFragment"
+    <action
+        android:id="@+id/action_global_loginFragment"
         app:destination="@id/loginFragment"
         app:enterAnim="@anim/slide_in_right"
         app:exitAnim="@anim/slide_out_left"
         app:popEnterAnim="@anim/slide_in_left"
-        app:popExitAnim="@anim/slide_out_right"/>
+        app:popExitAnim="@anim/slide_out_right"
+        app:popUpTo="@id/loginFragment"
+        app:popUpToInclusive="true" />
 
     <fragment
         android:id="@+id/listPersonFragment"

+ 2 - 0
feature_auth/src/main/java/com/mrozon/feature_auth/presentation/LoginFragment.kt

@@ -20,6 +20,7 @@ import com.mrozon.utils.extension.visible
 import com.mrozon.utils.network.Result
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.FlowPreview
+import timber.log.Timber
 import javax.inject.Inject
 
 class LoginFragment : BaseFragment<FragmentLoginBinding>() {
@@ -37,6 +38,7 @@ class LoginFragment : BaseFragment<FragmentLoginBinding>() {
     override fun onAttach(context: Context) {
         super.onAttach(context)
         LoginFragmentComponent.injectFragment(this)
+        Timber.d("onAttach")
     }
 
     @ExperimentalCoroutinesApi

+ 1 - 0
feature_auth/src/main/java/com/mrozon/feature_auth/presentation/RegistrationFragment.kt

@@ -39,6 +39,7 @@ class RegistrationFragment: BaseFragment<FragmentRegistrationBinding>() {
     override fun onAttach(context: Context) {
         super.onAttach(context)
         RegistrationFragmentComponent.injectFragment(this)
+        Timber.d("onAttach")
     }
 
     @ExperimentalCoroutinesApi

+ 25 - 0
feature_person/src/main/java/com/mrozon/feature_person/presentation/ListPersonFragment.kt

@@ -2,7 +2,9 @@ package com.mrozon.feature_person.presentation
 
 import android.content.Context
 import android.os.Bundle
+import android.os.Handler
 import android.view.View
+import androidx.activity.addCallback
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProvider
@@ -21,6 +23,12 @@ import javax.inject.Inject
 
 class ListPersonFragment : BaseFragment<FragmentListPersonBinding>() {
 
+    companion object {
+        const val DELAY_EXIT_CONFIRM = 2000L
+    }
+
+    private var doubleBackToExitPressedOnce = false
+
     override fun getLayoutId(): Int = R.layout.fragment_list_person
 
     @Inject
@@ -36,6 +44,7 @@ class ListPersonFragment : BaseFragment<FragmentListPersonBinding>() {
     override fun onAttach(context: Context) {
         super.onAttach(context)
         ListPersonFragmentComponent.injectFragment(this)
+        Timber.d("onAttach")
     }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -79,4 +88,20 @@ class ListPersonFragment : BaseFragment<FragmentListPersonBinding>() {
         })
     }
 
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        requireActivity().onBackPressedDispatcher.addCallback(this) {
+            finishIfConfirm()
+        }
+    }
+
+    private fun finishIfConfirm() {
+        if (doubleBackToExitPressedOnce)
+            requireActivity().finish()
+        doubleBackToExitPressedOnce = true
+        show(getString(R.string.confirm_exit))
+        Handler().postDelayed({
+            doubleBackToExitPressedOnce = false
+        }, DELAY_EXIT_CONFIRM)
+    }
 }

+ 1 - 0
feature_person/src/main/res/values/strings.xml

@@ -15,4 +15,5 @@
     <string name="error_empty_string">Empty field</string>
     <string name="error_invalid_email">Invalid format username (e-mail)</string>
     <string name="share_done">Done</string>
+    <string name="confirm_exit">Please click BACK again to exit</string>
 </resources>

+ 2 - 0
feature_splash/src/main/java/com/mrozon/feature_splash/presentation/SplashFragment.kt

@@ -16,6 +16,7 @@ import com.mrozon.feature_splash.R
 import com.mrozon.feature_splash.databinding.FragmentSplashBinding
 import com.mrozon.feature_splash.di.SplashFragmentComponent
 import com.mrozon.utils.base.BaseFragment
+import timber.log.Timber
 import javax.inject.Inject
 
 
@@ -34,6 +35,7 @@ class SplashFragment : BaseFragment<FragmentSplashBinding>() {
     override fun onAttach(context: Context) {
         super.onAttach(context)
         SplashFragmentComponent.injectFragment(this)
+        Timber.d("onAttach")
     }
 
     override fun subscribeUi() {

+ 3 - 1
utils/src/main/java/com/mrozon/utils/base/BaseFragment.kt

@@ -8,7 +8,9 @@ import androidx.annotation.LayoutRes
 import androidx.databinding.DataBindingUtil
 import androidx.databinding.ViewDataBinding
 import androidx.fragment.app.Fragment
+import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG
 import com.google.android.material.snackbar.Snackbar
+import timber.log.Timber
 
 abstract class BaseFragment<T : ViewDataBinding>: Fragment()//,
 {
@@ -67,7 +69,7 @@ abstract class BaseFragment<T : ViewDataBinding>: Fragment()//,
     }
 
     fun show(message: String) {
-        val snackbar = Snackbar.make(binding?.root!!,message,Snackbar.LENGTH_LONG)
+        val snackbar = Snackbar.make(binding?.root!!,message,LENGTH_LONG)
         snackbar.show()
     }
 }