firka_wear: add rotary support

This commit is contained in:
2026-03-02 20:34:02 +01:00
parent 4b0bf5a22d
commit 489a3a1d24
3 changed files with 31 additions and 0 deletions

View File

@@ -1,5 +1,6 @@
package app.firka.naplo package app.firka.naplo
import android.view.MotionEvent
import android.app.NotificationChannel import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
import android.app.PendingIntent import android.app.PendingIntent
@@ -10,6 +11,7 @@ import android.os.Bundle
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.wear.ongoing.OngoingActivity import androidx.wear.ongoing.OngoingActivity
import androidx.wear.ongoing.Status import androidx.wear.ongoing.Status
import com.samsung.wearable_rotary.WearableRotaryPlugin
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel
@@ -89,4 +91,10 @@ class MainActivity : FlutterActivity() {
window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_SECURE) window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_SECURE)
} }
override fun onGenericMotionEvent(event: MotionEvent?): Boolean {
return when {
WearableRotaryPlugin.onGenericMotionEvent(event) -> true
else -> super.onGenericMotionEvent(event)
}
}
} }

View File

@@ -9,6 +9,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:kreta_api/kreta_api.dart'; import 'package:kreta_api/kreta_api.dart';
import 'package:watch_connectivity/watch_connectivity.dart'; import 'package:watch_connectivity/watch_connectivity.dart';
import 'package:wearable_rotary/wearable_rotary.dart';
import 'package:wear_plus/wear_plus.dart'; import 'package:wear_plus/wear_plus.dart';
import 'package:firka_wear/app/app_state.dart'; import 'package:firka_wear/app/app_state.dart';
@@ -45,6 +46,7 @@ class _WearHomeScreenState extends State<WearHomeScreen> {
final platform = MethodChannel('firka.app/main'); final platform = MethodChannel('firka.app/main');
final watch = WatchConnectivity(); final watch = WatchConnectivity();
StreamSubscription? _messageSub; StreamSubscription? _messageSub;
StreamSubscription<RotaryEvent>? _rotarySub;
WearSyncCubit? _syncCubit; WearSyncCubit? _syncCubit;
late final PageController _pageController; late final PageController _pageController;
@@ -79,9 +81,28 @@ class _WearHomeScreenState extends State<WearHomeScreen> {
now = timeNow(); now = timeNow();
}); });
}); });
_rotarySub = rotaryEvents.listen(_onRotaryEvent);
initStateAsync(); initStateAsync();
} }
void _onRotaryEvent(RotaryEvent event) {
if (!_pageController.hasClients) return;
final pos = _pageController.position;
final pageCount = (pos.maxScrollExtent / pos.viewportDimension).round() + 1;
final currentPage = (_pageController.page ?? 0).round();
final nextPage = event.direction == RotaryDirection.clockwise
? (currentPage + 1).clamp(0, pageCount - 1)
: (currentPage - 1).clamp(0, pageCount - 1);
if (nextPage != currentPage) {
HapticFeedback.lightImpact();
_pageController.animateToPage(
nextPage,
duration: const Duration(milliseconds: 250),
curve: Curves.easeInOutCirc,
);
}
}
void _onSyncData(Map<String, dynamic> msg) async { void _onSyncData(Map<String, dynamic> msg) async {
if (disposed) return; if (disposed) return;
_syncCubit?.setSyncing(true); _syncCubit?.setSyncing(true);
@@ -624,6 +645,7 @@ class _WearHomeScreenState extends State<WearHomeScreen> {
@override @override
void dispose() { void dispose() {
_messageSub?.cancel(); _messageSub?.cancel();
_rotarySub?.cancel();
timer?.cancel(); timer?.cancel();
_pageController.dispose(); _pageController.dispose();
disposed = true; disposed = true;

View File

@@ -45,6 +45,7 @@ dependencies:
carousel_slider: ^5.0.0 carousel_slider: ^5.0.0
dart_jsonwebtoken: ^3.2.0 dart_jsonwebtoken: ^3.2.0
wear_plus: ^1.2.4 wear_plus: ^1.2.4
wearable_rotary: ^2.0.4
majesticons_flutter: ^0.0.1 majesticons_flutter: ^0.0.1
watch_connectivity: ^0.2.1+1 watch_connectivity: ^0.2.1+1
permission_handler: ^12.0.1 permission_handler: ^12.0.1