Skip to content

Commit 25c708e

Browse files
committed
Fix timer channel contract
1 parent cc889c4 commit 25c708e

3 files changed

Lines changed: 119 additions & 25 deletions

File tree

lib/app/modules/timer/controllers/timer_controller.dart

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,23 @@ import 'package:ultimate_alarm_clock/app/data/models/timer_model.dart';
66
import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart';
77
import 'package:ultimate_alarm_clock/app/utils/utils.dart';
88

9-
109
class LimitRange extends TextInputFormatter {
1110
LimitRange(this.minRange, this.maxRange) : assert(minRange < maxRange);
1211
final int minRange;
1312
final int maxRange;
1413

1514
@override
16-
TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
15+
TextEditingValue formatEditUpdate(
16+
TextEditingValue oldValue, TextEditingValue newValue) {
1717
try {
1818
if (newValue.text.isEmpty) {
1919
return newValue;
2020
}
2121
int value = int.parse(newValue.text);
22-
if (value < minRange) return TextEditingValue(text: minRange.toString());
23-
else if (value > maxRange) return TextEditingValue(text: maxRange.toString());
22+
if (value < minRange)
23+
return TextEditingValue(text: minRange.toString());
24+
else if (value > maxRange)
25+
return TextEditingValue(text: maxRange.toString());
2426
return newValue;
2527
} catch (e) {
2628
debugPrint(e.toString());
@@ -40,21 +42,20 @@ class TimerController extends FullLifeCycleController with FullLifeCycleMixin {
4042
ScrollController scrollController = ScrollController();
4143
RxList timers = [].obs;
4244
RxList isRinging = [].obs;
43-
44-
45-
final TextEditingController inputHoursControllerTimer = TextEditingController(text: '0');
46-
final TextEditingController inputMinutesControllerTimer = TextEditingController(text: '1');
47-
final TextEditingController inputSecondsControllerTimer = TextEditingController(text: '0');
48-
49-
45+
46+
final TextEditingController inputHoursControllerTimer =
47+
TextEditingController(text: '0');
48+
final TextEditingController inputMinutesControllerTimer =
49+
TextEditingController(text: '1');
50+
final TextEditingController inputSecondsControllerTimer =
51+
TextEditingController(text: '0');
52+
5053
final isTimePickerTimer = false.obs;
51-
52-
54+
5355
void changeTimePickerTimer() {
5456
isTimePickerTimer.value = !isTimePickerTimer.value;
5557
}
56-
57-
58+
5859
void setTimerTime() {
5960
try {
6061
int hours = int.parse(inputHoursControllerTimer.text);
@@ -68,7 +69,6 @@ class TimerController extends FullLifeCycleController with FullLifeCycleMixin {
6869
}
6970
}
7071

71-
7272
void setTextFieldTimerTime() {
7373
inputHoursControllerTimer.text = hours.value.toString();
7474
inputMinutesControllerTimer.text = minutes.value.toString();
@@ -162,7 +162,7 @@ class TimerController extends FullLifeCycleController with FullLifeCycleMixin {
162162
}
163163

164164
cancelTimer() async {
165-
await timerChannel.invokeMethod('cancelTimer');
165+
await timerChannel.invokeMethod('clearTimerNotif');
166166
}
167167

168168
@override
@@ -195,8 +195,9 @@ class TimerController extends FullLifeCycleController with FullLifeCycleMixin {
195195
Get.back();
196196
}
197197
}
198+
198199
Future<void> setPresetTimer(Duration presetDuration) async {
199-
remainingTime.value = presetDuration;
200-
await createTimer();
201-
}
200+
remainingTime.value = presetDuration;
201+
await createTimer();
202+
}
202203
}

lib/app/modules/timerRing/controllers/timer_ring_controller.dart

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:async';
22

3+
import 'package:flutter/foundation.dart';
34
import 'package:flutter/services.dart';
45
import 'package:flutter_fgbg/flutter_fgbg.dart';
56
import 'package:get/get.dart';
@@ -10,20 +11,22 @@ import 'package:vibration/vibration.dart';
1011

1112
class TimerRingController extends GetxController {
1213
MethodChannel timerChannel = const MethodChannel('timer');
14+
MethodChannel alarmChannel = const MethodChannel('ulticlock');
1315
Timer? vibrationTimer;
1416
late StreamSubscription<FGBGType> _subscription;
15-
getFakeTimerModel()async {
16-
TimerModel fakeTimer = await Utils.genFakeTimerModel();
17-
return fakeTimer;
17+
getFakeTimerModel() async {
18+
TimerModel fakeTimer = await Utils.genFakeTimerModel();
19+
return fakeTimer;
1820
}
21+
1922
@override
2023
void onInit() async {
2124
super.onInit();
2225

2326
// Preventing app from being minimized!
2427
_subscription = FGBGEvents.stream.listen((event) {
2528
if (event == FGBGType.background) {
26-
timerChannel.invokeMethod('bringAppToForeground');
29+
bringAppToForegroundForTest();
2730
}
2831
});
2932
vibrationTimer =
@@ -32,7 +35,17 @@ class TimerRingController extends GetxController {
3235
});
3336
AudioUtils.playTimer(alarmRecord: await getFakeTimerModel().value);
3437

35-
await timerChannel.invokeMethod('cancelTimer');
38+
await clearTimerNotificationForTest();
39+
}
40+
41+
@visibleForTesting
42+
Future<void> bringAppToForegroundForTest() async {
43+
await alarmChannel.invokeMethod('bringAppToForeground');
44+
}
45+
46+
@visibleForTesting
47+
Future<void> clearTimerNotificationForTest() async {
48+
await timerChannel.invokeMethod('clearTimerNotif');
3649
}
3750

3851
@override
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import 'package:flutter/services.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:ultimate_alarm_clock/app/modules/timer/controllers/timer_controller.dart';
4+
import 'package:ultimate_alarm_clock/app/modules/timerRing/controllers/timer_ring_controller.dart';
5+
6+
void main() {
7+
TestWidgetsFlutterBinding.ensureInitialized();
8+
9+
const timerChannel = MethodChannel('timer');
10+
const alarmChannel = MethodChannel('ulticlock');
11+
12+
setUp(() {
13+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
14+
.setMockMethodCallHandler(timerChannel, (_) async => null);
15+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
16+
.setMockMethodCallHandler(alarmChannel, (_) async => null);
17+
});
18+
19+
tearDown(() {
20+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
21+
.setMockMethodCallHandler(timerChannel, null);
22+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
23+
.setMockMethodCallHandler(alarmChannel, null);
24+
});
25+
26+
test(
27+
'TimerController cancelTimer uses the implemented timer notification clear method',
28+
() async {
29+
MethodCall? capturedCall;
30+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
31+
.setMockMethodCallHandler(timerChannel, (call) async {
32+
capturedCall = call;
33+
return null;
34+
});
35+
36+
final controller = TimerController();
37+
await controller.cancelTimer();
38+
39+
expect(capturedCall?.method, 'clearTimerNotif');
40+
});
41+
42+
test('TimerRingController foreground recovery uses the alarm channel',
43+
() async {
44+
MethodCall? timerCall;
45+
MethodCall? alarmCall;
46+
47+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
48+
.setMockMethodCallHandler(timerChannel, (call) async {
49+
timerCall = call;
50+
return null;
51+
});
52+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
53+
.setMockMethodCallHandler(alarmChannel, (call) async {
54+
alarmCall = call;
55+
return null;
56+
});
57+
58+
final controller = TimerRingController();
59+
await controller.bringAppToForegroundForTest();
60+
61+
expect(timerCall, isNull);
62+
expect(alarmCall?.method, 'bringAppToForeground');
63+
});
64+
65+
test(
66+
'TimerRingController clears timer notifications through the timer channel',
67+
() async {
68+
MethodCall? timerCall;
69+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
70+
.setMockMethodCallHandler(timerChannel, (call) async {
71+
timerCall = call;
72+
return null;
73+
});
74+
75+
final controller = TimerRingController();
76+
await controller.clearTimerNotificationForTest();
77+
78+
expect(timerCall?.method, 'clearTimerNotif');
79+
});
80+
}

0 commit comments

Comments
 (0)