From ccda296097850adc7a8b28ee979a645c9d04ae02 Mon Sep 17 00:00:00 2001 From: PratthamArora Date: Thu, 29 Jun 2023 13:53:43 +0530 Subject: [PATCH 1/2] added backpress confirmation on app exit --- .../doubtless/screens/main/MainActivity.kt | 25 ++++++++++++++++--- .../doubtless/doubtless/utils/Extensions.kt | 18 +++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/doubtless/doubtless/screens/main/MainActivity.kt b/app/src/main/java/com/doubtless/doubtless/screens/main/MainActivity.kt index f1d70a8..81dfe94 100644 --- a/app/src/main/java/com/doubtless/doubtless/screens/main/MainActivity.kt +++ b/app/src/main/java/com/doubtless/doubtless/screens/main/MainActivity.kt @@ -1,14 +1,19 @@ package com.doubtless.doubtless.screens.main import android.os.Bundle +import android.os.Handler +import android.os.Looper import androidx.appcompat.app.AppCompatActivity import com.doubtless.doubtless.R import com.doubtless.doubtless.databinding.ActivityMainBinding import com.doubtless.doubtless.navigation.BackPressDispatcher import com.doubtless.doubtless.navigation.OnBackPressListener +import com.doubtless.doubtless.utils.shortToast + class MainActivity : AppCompatActivity(), BackPressDispatcher { + private var doubleBackToExitPressedOnce: Boolean = false private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { @@ -20,7 +25,7 @@ class MainActivity : AppCompatActivity(), BackPressDispatcher { if (savedInstanceState == null) { supportFragmentManager .beginTransaction() - .add(R.id.main_container, MainFragment(), "MainFragment") + .add(com.doubtless.doubtless.R.id.main_container, MainFragment(), "MainFragment") .commit() } } @@ -52,8 +57,22 @@ class MainActivity : AppCompatActivity(), BackPressDispatcher { } } - if (!backPressConsumed) - super.onBackPressed() + if (!backPressConsumed) { + when { + doubleBackToExitPressedOnce -> super.onBackPressed() + else -> { + this.doubleBackToExitPressedOnce = true + shortToast(R.string.press_again_to_exit) + Handler(Looper.getMainLooper()).postDelayed({ + doubleBackToExitPressedOnce = false + }, BACKPRESS_DELAY) + } + } + } + } + + companion object { + private const val BACKPRESS_DELAY = 2000L } } \ No newline at end of file diff --git a/app/src/main/java/com/doubtless/doubtless/utils/Extensions.kt b/app/src/main/java/com/doubtless/doubtless/utils/Extensions.kt index 1c9064a..b8e336f 100644 --- a/app/src/main/java/com/doubtless/doubtless/utils/Extensions.kt +++ b/app/src/main/java/com/doubtless/doubtless/utils/Extensions.kt @@ -4,7 +4,9 @@ import android.animation.AnimatorInflater import android.content.Context import android.view.View import android.view.inputmethod.InputMethodManager +import android.widget.Toast import androidx.annotation.AnimatorRes +import androidx.annotation.StringRes fun View.addStateListAnimation(@AnimatorRes animation: Int) { this.stateListAnimator = AnimatorInflater.loadStateListAnimator( @@ -16,4 +18,20 @@ fun View.addStateListAnimation(@AnimatorRes animation: Int) { fun View.hideSoftKeyboard() { val imm = this.context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager imm?.hideSoftInputFromWindow(this.windowToken, 0) +} + +fun Context.shortToast(@StringRes msg: Int) { + Toast.makeText( + this, + msg, + Toast.LENGTH_SHORT + ).show() +} + +fun Context.longToast(@StringRes msg: Int) { + Toast.makeText( + this, + msg, + Toast.LENGTH_LONG + ).show() } \ 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 181b759..a61bbc8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,4 +20,5 @@ Placements Please select at max 3 tags Please sign in again! + Press again to exit \ No newline at end of file From ec7d3b3f8b25dda6e34445be0ee300c5b0748b27 Mon Sep 17 00:00:00 2001 From: PratthamArora Date: Thu, 29 Jun 2023 22:54:49 +0530 Subject: [PATCH 2/2] display snackbar on app exit --- .../doubtless/doubtless/screens/main/MainActivity.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/doubtless/doubtless/screens/main/MainActivity.kt b/app/src/main/java/com/doubtless/doubtless/screens/main/MainActivity.kt index 81dfe94..c506136 100644 --- a/app/src/main/java/com/doubtless/doubtless/screens/main/MainActivity.kt +++ b/app/src/main/java/com/doubtless/doubtless/screens/main/MainActivity.kt @@ -8,7 +8,7 @@ import com.doubtless.doubtless.R import com.doubtless.doubtless.databinding.ActivityMainBinding import com.doubtless.doubtless.navigation.BackPressDispatcher import com.doubtless.doubtless.navigation.OnBackPressListener -import com.doubtless.doubtless.utils.shortToast +import com.google.android.material.snackbar.Snackbar class MainActivity : AppCompatActivity(), BackPressDispatcher { @@ -25,7 +25,7 @@ class MainActivity : AppCompatActivity(), BackPressDispatcher { if (savedInstanceState == null) { supportFragmentManager .beginTransaction() - .add(com.doubtless.doubtless.R.id.main_container, MainFragment(), "MainFragment") + .add(R.id.main_container, MainFragment(), "MainFragment") .commit() } } @@ -62,7 +62,11 @@ class MainActivity : AppCompatActivity(), BackPressDispatcher { doubleBackToExitPressedOnce -> super.onBackPressed() else -> { this.doubleBackToExitPressedOnce = true - shortToast(R.string.press_again_to_exit) + Snackbar.make( + binding.container, + R.string.press_again_to_exit, + Snackbar.LENGTH_SHORT + ).show() Handler(Looper.getMainLooper()).postDelayed({ doubleBackToExitPressedOnce = false }, BACKPRESS_DELAY)