@@ -6,6 +6,13 @@ import android.appwidget.AppWidgetProvider
66import android.content.Context
77import android.content.Intent
88import android.graphics.BitmapFactory
9+ import android.os.Handler
10+ import android.os.Looper
11+ import android.media.AudioAttributes
12+ import android.os.Build
13+ import android.os.VibrationAttributes
14+ import android.os.VibrationEffect
15+ import android.os.Vibrator
916import android.util.Log
1017import android.view.View
1118import android.widget.RemoteViews
@@ -80,18 +87,43 @@ class TapLockWidgetProvider : AppWidgetProvider() {
8087
8188 val currentTime = System .currentTimeMillis()
8289 if (currentTime - lastTapTime < timeout) {
83- // Try direct call first
84- val service = TapLockAccessibilityService .instance
85- if (service != null ) {
86- Log .d(" TapLock" , " Widget: Using direct instance - fast path" )
87- service.lockScreen()
90+ // Haptic feedback if enabled
91+ val vibrateOnLock = prefs.getBoolean(context.getString(R .string.vibrate_on_lock), true )
92+ if (vibrateOnLock) {
93+ val vibrator = context.getSystemService(Vibrator ::class .java)
94+ val effect = VibrationEffect .createOneShot(50 , 80 )
95+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
96+ val attrs = VibrationAttributes .Builder ()
97+ .setUsage(VibrationAttributes .USAGE_ALARM )
98+ .build()
99+ vibrator.vibrate(effect, attrs)
100+ } else {
101+ val attrs = AudioAttributes .Builder ()
102+ .setUsage(AudioAttributes .USAGE_ALARM )
103+ .build()
104+ vibrator.vibrate(effect, attrs)
105+ }
106+ }
107+
108+ // Delay lock slightly so the haptic feedback can complete
109+ val lockRunnable = Runnable {
110+ val service = TapLockAccessibilityService .instance
111+ if (service != null ) {
112+ Log .d(" TapLock" , " Widget: Using direct instance - fast path" )
113+ service.lockScreen()
114+ } else {
115+ Log .d(" TapLock" , " Widget: Instance null - using slow startService path" )
116+ Toast .makeText(context, " Locking screen..." , Toast .LENGTH_SHORT ).show()
117+ val accessibilityIntent = Intent (context, TapLockAccessibilityService ::class .java)
118+ accessibilityIntent.action = Intent .ACTION_SCREEN_OFF
119+ context.startService(accessibilityIntent)
120+ }
121+ }
122+
123+ if (vibrateOnLock) {
124+ Handler (Looper .getMainLooper()).postDelayed(lockRunnable, 100 )
88125 } else {
89- // Fallback if instance is null
90- Log .d(" TapLock" , " Widget: Instance null - using slow startService path" )
91- Toast .makeText(context, " Locking screen..." , Toast .LENGTH_SHORT ).show()
92- val accessibilityIntent = Intent (context, TapLockAccessibilityService ::class .java)
93- accessibilityIntent.action = Intent .ACTION_SCREEN_OFF
94- context.startService(accessibilityIntent)
126+ lockRunnable.run ()
95127 }
96128 }
97129 lastTapTime = currentTime
0 commit comments