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 })
+ }
+}