diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7ac0c4ff..9d40be7e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + @@ -76,4 +77,4 @@ - \ No newline at end of file + diff --git a/app/src/main/java/me/rosuh/easywatermark/utils/VibrateHelper.kt b/app/src/main/java/me/rosuh/easywatermark/utils/VibrateHelper.kt index 8016cbc8..c9516823 100644 --- a/app/src/main/java/me/rosuh/easywatermark/utils/VibrateHelper.kt +++ b/app/src/main/java/me/rosuh/easywatermark/utils/VibrateHelper.kt @@ -1,5 +1,6 @@ package me.rosuh.easywatermark.utils +import android.os.Build import android.view.HapticFeedbackConstants import android.view.View @@ -9,18 +10,30 @@ class VibrateHelper private constructor() { private var cd: Long = 20L fun doVibrate(view: View) { - if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.M) { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { return } - if (System.currentTimeMillis() - latestVibration <= cd) { + val now = System.currentTimeMillis() + if (now - latestVibration <= cd) { return } - view.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP) + latestVibration = now + performHapticFeedbackSafely { + view.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP) + } } companion object { fun get(): VibrateHelper { return VibrateHelper() } + + internal fun performHapticFeedbackSafely(performFeedback: () -> Boolean): Boolean { + return try { + performFeedback() + } catch (_: SecurityException) { + false + } + } } } diff --git a/app/src/test/java/me/rosuh/easywatermark/utils/VibrateHelperTest.kt b/app/src/test/java/me/rosuh/easywatermark/utils/VibrateHelperTest.kt new file mode 100644 index 00000000..7098eefd --- /dev/null +++ b/app/src/test/java/me/rosuh/easywatermark/utils/VibrateHelperTest.kt @@ -0,0 +1,22 @@ +package me.rosuh.easywatermark.utils + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class VibrateHelperTest { + @Test + fun performHapticFeedbackSafelyReturnsFalseWhenPermissionIsDenied() { + val result = VibrateHelper.performHapticFeedbackSafely { + throw SecurityException("missing android.permission.VIBRATE") + } + + assertFalse(result) + } + + @Test + fun performHapticFeedbackSafelyReturnsDelegateResult() { + assertTrue(VibrateHelper.performHapticFeedbackSafely { true }) + assertFalse(VibrateHelper.performHapticFeedbackSafely { false }) + } +}