diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 64507121..feb55d20 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -27,6 +27,7 @@ + @@ -69,6 +70,12 @@ android:enabled="true" android:exported="true"> + + + requestPermission() async { + bool isPermissionGranted = await FlutterOverlayWindow.isPermissionGranted(); + if (!isPermissionGranted) { + isPermissionGranted = + await FlutterOverlayWindow.requestPermission() ?? false; + } + return isPermissionGranted; +} diff --git a/lib/app/modules/stopwatch/views/stopwatch_view.dart b/lib/app/modules/stopwatch/views/stopwatch_view.dart index 340e4450..f81b5f13 100644 --- a/lib/app/modules/stopwatch/views/stopwatch_view.dart +++ b/lib/app/modules/stopwatch/views/stopwatch_view.dart @@ -3,12 +3,14 @@ import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; import 'package:ultimate_alarm_clock/app/modules/stopwatch/controllers/stopwatch_controller.dart'; +import 'package:ultimate_alarm_clock/app/modules/stopwatch/views/overylay_pop.dart'; import 'package:ultimate_alarm_clock/app/utils/end_drawer.dart'; import '../../../utils/utils.dart'; +import 'package:flutter_overlay_window/flutter_overlay_window.dart'; // ignore: must_be_immutable class StopwatchView extends GetView { - StopwatchView({Key? key}) : super(key: key); + StopwatchView({super.key}); ThemeController themeController = Get.find(); @override Widget build(BuildContext context) { @@ -22,6 +24,52 @@ class StopwatchView extends GetView { toolbarHeight: height / 7.9, elevation: 0.0, centerTitle: true, + leading: LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + return Obx( + () => IconButton( + onPressed: () async { + Utils.hapticFeedback(); + bool isGranted = await requestPermission(); + if (!isGranted) { + Get.snackbar( + 'Permission Denied'.tr, + 'Please enable overlay permission'.tr, + duration: const Duration(seconds: 2), + snackPosition: SnackPosition.BOTTOM, + barBlur: 15, + colorText: themeController.primaryTextColor.value, + margin: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 15, + ), + ); + } else if (await FlutterOverlayWindow.isActive()) { + await FlutterOverlayWindow.closeOverlay(); + } else { + await FlutterOverlayWindow.showOverlay( + enableDrag: true, + overlayTitle: '', + overlayContent: '', + flag: OverlayFlag.defaultFlag, + visibility: NotificationVisibility.visibilityPublic, + positionGravity: PositionGravity.auto, + height: (height * 0.5).toInt(), + width: WindowSize.matchParent, + startPosition: const OverlayPosition(0, -259), + ); + } + }, + icon: const Icon( + Icons.widgets_rounded, + ), + color: themeController.primaryTextColor.value + .withOpacity(0.75), + iconSize: 27, + ), + ); + }, + ), actions: [ LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { diff --git a/lib/main.dart b/lib/main.dart index 000c7157..9024f25b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,7 +6,7 @@ import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:ultimate_alarm_clock/app/data/providers/get_storage_provider.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; -import 'package:sqflite/sqflite.dart'; +import 'package:ultimate_alarm_clock/app/modules/stopwatch/views/overylay_pop.dart'; import 'package:ultimate_alarm_clock/app/utils/language.dart'; import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:ultimate_alarm_clock/app/utils/custom_error_screen.dart'; @@ -29,7 +29,7 @@ void main() async { final storage = Get.find(); loc = await storage.readLocale(); - final ThemeController themeController = Get.put(ThemeController()); + // final ThemeController themeController = Get.put(ThemeController()); AudioPlayer.global.setAudioContext( const AudioContext( @@ -54,6 +54,22 @@ void main() async { ); } +@pragma('vm:entry-point') +void overlayMain() async { + WidgetsFlutterBinding.ensureInitialized(); + + final ThemeController themeController = Get.put(ThemeController()); + runApp( + MaterialApp( + theme: kLightThemeData, + darkTheme: kThemeData, + themeMode: ThemeMode.system, + title: 'UltiClock', + debugShowCheckedModeBanner: false, + home: StopwatchOverlayPop(themeController: themeController), + ), + ); +} class UltimateAlarmClockApp extends StatelessWidget { const UltimateAlarmClockApp({super.key}); diff --git a/pubspec.yaml b/pubspec.yaml index ea1939f0..ed8f9e1b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -58,6 +58,7 @@ dependencies: intl_phone_number_input: ^0.7.4 firebase_messaging: ^14.7.19 shared_preferences: ^2.2.3 + flutter_overlay_window: ^0.4.5 dev_dependencies: flutter_lints: ^4.0.0