forked from BasedHardware/omi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmobile_app.dart
More file actions
114 lines (101 loc) · 3.81 KB
/
Copy pathmobile_app.dart
File metadata and controls
114 lines (101 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:omi/backend/preferences.dart';
import 'package:omi/pages/home/page.dart';
import 'package:omi/pages/onboarding/device_selection.dart';
import 'package:omi/pages/onboarding/permissions/permissions_checker.dart';
import 'package:omi/pages/onboarding/wrapper.dart';
import 'package:omi/providers/auth_provider.dart';
import 'package:omi/services/account_cutover/account_cutover_blocking_gate.dart';
import 'package:omi/utils/alerts/app_snackbar.dart';
import 'package:omi/utils/l10n_extensions.dart';
class MobileApp extends StatefulWidget {
const MobileApp({super.key});
@override
State<MobileApp> createState() => _MobileAppState();
}
class _MobileAppState extends State<MobileApp> {
int _lastPresentedSessionExpiration = 0;
void _presentSessionExpiration(int generation) {
if (generation <= _lastPresentedSessionExpiration) return;
_lastPresentedSessionExpiration = generation;
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
AppSnackbar.showSnackbarError(context.l10n.sessionExpiredSignInAgain);
});
}
@override
Widget build(BuildContext context) {
return Consumer<AuthenticationProvider>(
builder: (context, authProvider, child) {
if (authProvider.requiresReauthentication) {
_presentSessionExpiration(authProvider.sessionExpirationGeneration);
return const OnboardingWrapper(forceAuthPage: true);
}
if (authProvider.isSignedIn()) {
// Cutover gate sits above onboarding and home so completed-onboarding
// navigator replacements cannot bypass enforcement, and product
// widgets are not constructed while blocked.
return AccountCutoverBlockingGate(
productBuilder: (context) {
// Returning users who haven't yet given consent under the new
// model must see the consent screen before any AI processing
// begins, even if the server says they completed onboarding
// previously. OnboardingWrapper renders the consent step in
// that case and routes them straight to home after Continue.
if (!SharedPreferencesUtil().aiConsentGiven) {
return const OnboardingWrapper();
}
if (SharedPreferencesUtil().onboardingCompleted) {
if (!SharedPreferencesUtil().permissionsCompleted) {
return const _PermissionsGate();
}
return const HomePageWrapper();
}
return const OnboardingWrapper();
},
);
} else {
return const DeviceSelectionPage();
}
},
);
}
}
/// Checks if permissions are already granted. If so, marks as completed
/// and shows home. Otherwise shows the permissions interstitial.
class _PermissionsGate extends StatefulWidget {
const _PermissionsGate();
@override
State<_PermissionsGate> createState() => _PermissionsGateState();
}
class _PermissionsGateState extends State<_PermissionsGate> {
bool? _permissionsGranted;
@override
void initState() {
super.initState();
_check();
}
Future<void> _check() async {
final granted = await arePermissionsGranted();
if (granted) {
SharedPreferencesUtil().permissionsCompleted = true;
}
if (mounted) {
setState(() => _permissionsGranted = granted);
}
}
@override
Widget build(BuildContext context) {
if (_permissionsGranted == null) {
return const Scaffold(
backgroundColor: Colors.black,
body: Center(child: CircularProgressIndicator(color: Colors.white)),
);
}
if (_permissionsGranted!) {
return const HomePageWrapper();
}
return const PermissionsInterstitialPage();
}
}