From 5952cac760fdf35c93b87f6c40008bc7b341fae2 Mon Sep 17 00:00:00 2001 From: cmclark00 Date: Tue, 1 Apr 2025 12:21:28 -0400 Subject: [PATCH] Enhance back button handling in HighScoreEntryActivity and update vibration logic in MainActivity for better compatibility with Android versions. Implement edge-to-edge display adjustments for newer Android versions. --- .../pixelmintdrop/HighScoreEntryActivity.kt | 22 +++++---- .../java/com/pixelmintdrop/MainActivity.kt | 49 +++++++++++++++---- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/pixelmintdrop/HighScoreEntryActivity.kt b/app/src/main/java/com/pixelmintdrop/HighScoreEntryActivity.kt index 09e2064..8380054 100644 --- a/app/src/main/java/com/pixelmintdrop/HighScoreEntryActivity.kt +++ b/app/src/main/java/com/pixelmintdrop/HighScoreEntryActivity.kt @@ -10,6 +10,7 @@ import com.pixelmintdrop.model.PlayerProgressionManager import android.graphics.Color import android.view.KeyEvent import android.view.InputDevice +import androidx.activity.OnBackPressedCallback class HighScoreEntryActivity : AppCompatActivity() { private lateinit var binding: HighScoreEntryBinding @@ -26,6 +27,17 @@ class HighScoreEntryActivity : AppCompatActivity() { binding = HighScoreEntryBinding.inflate(layoutInflater) setContentView(binding.root) + // Set up back button handling + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + // If they haven't saved yet, consider it a cancel + if (!hasSaved) { + setResult(Activity.RESULT_CANCELED) + } + finish() + } + }) + highScoreManager = HighScoreManager(this) progressionManager = PlayerProgressionManager(this) @@ -87,16 +99,6 @@ class HighScoreEntryActivity : AppCompatActivity() { return (sources and InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD || (sources and InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK } - - // Prevent accidental back button press from causing issues - override fun onBackPressed() { - super.onBackPressed() - // If they haven't saved yet, consider it a cancel - if (!hasSaved) { - setResult(Activity.RESULT_CANCELED) - } - finish() - } private fun loadThemePreference(): String { return progressionManager.getSelectedTheme() diff --git a/app/src/main/java/com/pixelmintdrop/MainActivity.kt b/app/src/main/java/com/pixelmintdrop/MainActivity.kt index 2aa50c7..c8000ab 100644 --- a/app/src/main/java/com/pixelmintdrop/MainActivity.kt +++ b/app/src/main/java/com/pixelmintdrop/MainActivity.kt @@ -6,6 +6,7 @@ import android.os.Build import android.os.Bundle import android.os.VibrationEffect import android.os.Vibrator +import android.os.VibratorManager import android.view.View import android.view.HapticFeedbackConstants import androidx.appcompat.app.AppCompatActivity @@ -490,6 +491,14 @@ class MainActivity : AppCompatActivity(), // Enable edge-to-edge display if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + // Use the WindowInsetsController for Android 11+ edge-to-edge display + window.insetsController?.let { controller -> + controller.hide(android.view.WindowInsets.Type.statusBars() or android.view.WindowInsets.Type.navigationBars()) + controller.systemBarsBehavior = android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + } + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + // For Android 10, use the deprecated method + @Suppress("DEPRECATION") window.setDecorFitsSystemWindows(false) } @@ -897,8 +906,17 @@ class MainActivity : AppCompatActivity(), * Trigger device vibration with predefined effect */ private fun vibrate(effectId: Int) { - val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator - vibrator.vibrate(VibrationEffect.createPredefined(effectId)) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + // For Android 12+ (API 31+) + val vibratorManager = getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager + val vibrator = vibratorManager.defaultVibrator + vibrator.vibrate(VibrationEffect.createPredefined(effectId)) + } else { + // For older Android versions + @Suppress("DEPRECATION") + val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + vibrator.vibrate(VibrationEffect.createPredefined(effectId)) + } } private fun updateMusicToggleUI() { @@ -1202,13 +1220,26 @@ class MainActivity : AppCompatActivity(), // Set the entire window to be excluded from the system gesture areas window.decorView.post { // Create a list of rectangles representing the edges of the screen to exclude from system gestures - val gestureInsets = window.decorView.rootWindowInsets?.systemGestureInsets - if (gestureInsets != null) { - val leftEdge = Rect(0, 0, 50, window.decorView.height) - val rightEdge = Rect(window.decorView.width - 50, 0, window.decorView.width, window.decorView.height) - val bottomEdge = Rect(0, window.decorView.height - 50, window.decorView.width, window.decorView.height) - - window.decorView.systemGestureExclusionRects = listOf(leftEdge, rightEdge, bottomEdge) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + // Use the new API for Android 11+ + window.decorView.rootWindowInsets?.let { insets -> + val leftEdge = Rect(0, 0, 50, window.decorView.height) + val rightEdge = Rect(window.decorView.width - 50, 0, window.decorView.width, window.decorView.height) + val bottomEdge = Rect(0, window.decorView.height - 50, window.decorView.width, window.decorView.height) + + window.decorView.systemGestureExclusionRects = listOf(leftEdge, rightEdge, bottomEdge) + } + } else { + // Use the deprecated API for Android 10 + @Suppress("DEPRECATION") + val gestureInsets = window.decorView.rootWindowInsets?.systemGestureInsets + if (gestureInsets != null) { + val leftEdge = Rect(0, 0, 50, window.decorView.height) + val rightEdge = Rect(window.decorView.width - 50, 0, window.decorView.width, window.decorView.height) + val bottomEdge = Rect(0, window.decorView.height - 50, window.decorView.width, window.decorView.height) + + window.decorView.systemGestureExclusionRects = listOf(leftEdge, rightEdge, bottomEdge) + } } } }