Skip to content

Commit 258cdca

Browse files
authored
[auth] Reduce progress bar refresh rate to lower CPU usage (#4517)
## Description Related #2003 (comment) ## Tests
2 parents a818f06 + 2a19c30 commit 258cdca

File tree

5 files changed

+53
-46
lines changed

5 files changed

+53
-46
lines changed

auth/lib/ui/code_timer_progress.dart

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,78 @@
1-
import 'package:ente_auth/services/preference_service.dart';
1+
import 'dart:async';
2+
import 'dart:io';
3+
24
import 'package:ente_auth/theme/ente_theme.dart';
35
import 'package:flutter/material.dart';
4-
import 'package:flutter/scheduler.dart';
5-
6-
class CodeTimerProgressCache {
7-
static final Map<int, CodeTimerProgress> _cache = {};
8-
9-
static CodeTimerProgress getCachedWidget(int period) {
10-
if (!_cache.containsKey(period)) {
11-
_cache[period] = CodeTimerProgress(period: period);
12-
}
13-
return _cache[period]!;
14-
}
15-
}
166

177
class CodeTimerProgress extends StatefulWidget {
188
final int period;
19-
9+
final bool isCompactMode;
2010
const CodeTimerProgress({
2111
super.key,
2212
required this.period,
13+
this.isCompactMode = false,
2314
});
2415

2516
@override
2617
State<CodeTimerProgress> createState() => _CodeTimerProgressState();
2718
}
2819

29-
class _CodeTimerProgressState extends State<CodeTimerProgress>
30-
with SingleTickerProviderStateMixin {
31-
late final Ticker _ticker;
20+
class _CodeTimerProgressState extends State<CodeTimerProgress> {
21+
late final Timer _timer;
3222
late final ValueNotifier<double> _progress;
33-
late final int _microSecondsInPeriod;
34-
late bool _isCompactMode=false;
23+
late final int _periodInMicros;
24+
25+
// Cache the start time to avoid repeated system calls
26+
late final int _startMicros;
27+
28+
// Reduce update frequency
29+
final int _updateIntervalMs =
30+
(Platform.isAndroid || Platform.isIOS) ? 16 : 500; // approximately 60 FPS
3531

3632
@override
3733
void initState() {
3834
super.initState();
39-
_microSecondsInPeriod = widget.period * 1000000;
35+
_periodInMicros = widget.period * 1000000;
4036
_progress = ValueNotifier<double>(0.0);
41-
_ticker = createTicker(_updateTimeRemaining);
42-
_ticker.start();
43-
_isCompactMode = PreferenceService.instance.isCompactMode();
44-
_updateTimeRemaining(Duration.zero);
37+
_startMicros = DateTime.now().microsecondsSinceEpoch;
38+
39+
// Use a Timer instead of a Ticker
40+
_timer = Timer.periodic(Duration(milliseconds: _updateIntervalMs), (timer) {
41+
final now = DateTime.now().microsecondsSinceEpoch;
42+
_updateTimeRemaining(now);
43+
});
4544
}
4645

47-
void _updateTimeRemaining(Duration elapsed) {
48-
int timeRemaining = _microSecondsInPeriod -
49-
(DateTime.now().microsecondsSinceEpoch % _microSecondsInPeriod);
50-
_progress.value = timeRemaining / _microSecondsInPeriod;
46+
void _updateTimeRemaining(int currentMicros) {
47+
// More efficient time calculation using modulo
48+
final elapsed = (currentMicros - _startMicros) % _periodInMicros;
49+
final timeRemaining = _periodInMicros - elapsed;
50+
_progress.value = timeRemaining / _periodInMicros;
5151
}
5252

5353
@override
5454
void dispose() {
55-
_ticker.dispose();
55+
_timer.cancel();
5656
_progress.dispose();
5757
super.dispose();
5858
}
5959

6060
@override
6161
Widget build(BuildContext context) {
6262
return SizedBox(
63-
height: _isCompactMode ?1:3,
63+
height: widget.isCompactMode ? 1 : 3,
6464
child: ValueListenableBuilder<double>(
6565
valueListenable: _progress,
6666
builder: (context, progress, _) {
6767
return CustomPaint(
68+
key: Key(progress.toString()), // Add key here
6869
painter: _ProgressPainter(
6970
progress: progress,
7071
color: progress > 0.4
7172
? getEnteColorScheme(context).primary700
7273
: Colors.orange,
7374
),
74-
size: Size.infinite,
75+
size: const Size.fromHeight(double.infinity),
7576
);
7677
},
7778
),
@@ -83,7 +84,10 @@ class _ProgressPainter extends CustomPainter {
8384
final double progress;
8485
final Color color;
8586

86-
_ProgressPainter({required this.progress, required this.color});
87+
const _ProgressPainter({
88+
required this.progress,
89+
required this.color,
90+
});
8791

8892
@override
8993
void paint(Canvas canvas, Size size) {

auth/lib/ui/code_widget.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,10 @@ class _CodeWidgetState extends State<CodeWidget> {
146146
mainAxisAlignment: MainAxisAlignment.spaceBetween,
147147
children: [
148148
if (widget.code.type.isTOTPCompatible)
149-
CodeTimerProgressCache.getCachedWidget(
150-
widget.code.period,
149+
CodeTimerProgress(
150+
key: ValueKey('period_${widget.code.period}'),
151+
period: widget.code.period,
152+
isCompactMode: widget.isCompactMode,
151153
),
152154
widget.isCompactMode
153155
? const SizedBox(height: 4)

auth/macos/Runner.xcodeproj/project.pbxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@
429429
"@executable_path/../Frameworks",
430430
);
431431
MACOSX_DEPLOYMENT_TARGET = 10.14;
432+
ONLY_ACTIVE_ARCH = YES;
432433
PRODUCT_BUNDLE_IDENTIFIER = io.ente.auth.mac;
433434
PROVISIONING_PROFILE_SPECIFIER = "";
434435
SWIFT_VERSION = 5.0;

auth/pubspec.lock

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ packages:
4242
dependency: "direct main"
4343
description:
4444
name: app_links
45-
sha256: ad1a6d598e7e39b46a34f746f9a8b011ee147e4c275d407fa457e7a62f84dd99
45+
sha256: "433df2e61b10519407475d7f69e470789d23d593f28224c38ba1068597be7950"
4646
url: "https://pub.dev"
4747
source: hosted
48-
version: "6.3.2"
48+
version: "6.3.3"
4949
app_links_linux:
5050
dependency: transitive
5151
description:
@@ -528,10 +528,10 @@ packages:
528528
dependency: "direct main"
529529
description:
530530
name: flutter_inappwebview
531-
sha256: "93cfcca02bdda4b26cd700cf70d9ddba09d8348e3e8f2857638c23ed23a4fcb4"
531+
sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5"
532532
url: "https://pub.dev"
533533
source: hosted
534-
version: "6.1.4"
534+
version: "6.1.5"
535535
flutter_inappwebview_android:
536536
dependency: transitive
537537
description:
@@ -584,10 +584,10 @@ packages:
584584
dependency: transitive
585585
description:
586586
name: flutter_inappwebview_windows
587-
sha256: "95ebc65aecfa63b2084c822aec6ba0545f0a0afaa3899f2c752ec96c09108db5"
587+
sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055"
588588
url: "https://pub.dev"
589589
source: hosted
590-
version: "0.5.0+2"
590+
version: "0.6.0"
591591
flutter_launcher_icons:
592592
dependency: "direct main"
593593
description:
@@ -985,10 +985,10 @@ packages:
985985
dependency: "direct main"
986986
description:
987987
name: logging
988-
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
988+
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
989989
url: "https://pub.dev"
990990
source: hosted
991-
version: "1.2.0"
991+
version: "1.3.0"
992992
macros:
993993
dependency: transitive
994994
description:
@@ -1655,10 +1655,10 @@ packages:
16551655
dependency: "direct main"
16561656
description:
16571657
name: url_launcher
1658-
sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3"
1658+
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
16591659
url: "https://pub.dev"
16601660
source: hosted
1661-
version: "6.3.0"
1661+
version: "6.3.1"
16621662
url_launcher_android:
16631663
dependency: transitive
16641664
description:
@@ -1668,7 +1668,7 @@ packages:
16681668
source: hosted
16691669
version: "6.3.11"
16701670
url_launcher_ios:
1671-
dependency: transitive
1671+
dependency: "direct main"
16721672
description:
16731673
name: url_launcher_ios
16741674
sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e

auth/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: ente_auth
22
description: ente two-factor authenticator
3-
version: 4.2.0+420
3+
version: 4.2.1+421
44
publish_to: none
55

66
environment:

0 commit comments

Comments
 (0)