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