From d404368b6c2c71c2ca06bacdf842211da586d2e7 Mon Sep 17 00:00:00 2001 From: Samsularifin01 <158025491+Samsularifin01@users.noreply.github.com> Date: Tue, 19 May 2026 09:27:27 +0700 Subject: [PATCH] add vibration effect in camera file when object is detected --- lib/screens/camera_screen.dart | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/lib/screens/camera_screen.dart b/lib/screens/camera_screen.dart index 5b5cc71..0a22f16 100644 --- a/lib/screens/camera_screen.dart +++ b/lib/screens/camera_screen.dart @@ -5,6 +5,7 @@ import 'dart:ui' as ui; import 'package:camera/camera.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import '../services/tts_service.dart'; import '../services/yolo_detection_service.dart'; @@ -29,6 +30,8 @@ class _CameraScreenState extends State { List detectedObjects = const []; Size? detectionFrameSize; Timer? _detectionTimer; + Timer? _vibrationTimer; + bool _isVibrating = false; String _lastSpokenMessage = ""; DateTime? _lastSpokenAt; @@ -96,6 +99,9 @@ class _CameraScreenState extends State { Future stopRecording() async { _detectionTimer?.cancel(); _detectionTimer = null; + _vibrationTimer?.cancel(); + _vibrationTimer = null; + _isVibrating = false; if (!mounted) return; setState(() { @@ -190,6 +196,8 @@ class _CameraScreenState extends State { return; } + _vibrateForTwoSeconds(); + final Map objectCounts = {}; for (final YoloDetection object in response.objects) { objectCounts[object.name] = (objectCounts[object.name] ?? 0) + 1; @@ -204,6 +212,32 @@ class _CameraScreenState extends State { await _speakOnce("Terdeteksi $objectSummary"); } + void _vibrateForTwoSeconds() { + if (_isVibrating) { + return; + } + + _isVibrating = true; + int vibrationCount = 0; + const int maxVibrationCount = 8; + const Duration vibrationInterval = Duration(milliseconds: 250); + + HapticFeedback.vibrate(); + vibrationCount++; + + _vibrationTimer?.cancel(); + _vibrationTimer = Timer.periodic(vibrationInterval, (Timer timer) { + if (!mounted || !isRecording || vibrationCount >= maxVibrationCount) { + timer.cancel(); + _isVibrating = false; + return; + } + + HapticFeedback.vibrate(); + vibrationCount++; + }); + } + Future _speakOnce(String message) async { final DateTime now = DateTime.now(); final bool canRepeat = _lastSpokenAt == null || @@ -221,6 +255,7 @@ class _CameraScreenState extends State { @override void dispose() { _detectionTimer?.cancel(); + _vibrationTimer?.cancel(); controller?.dispose(); super.dispose(); }