Skip to content

Commit 917d367

Browse files
committed
Fix local and google drive backup/restore logging
1 parent 43ce491 commit 917d367

File tree

9 files changed

+392
-175
lines changed

9 files changed

+392
-175
lines changed

lib/core/services/google/google_auth_service.dart

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ final googleAuthProvider =
177177
/// `GoogleAuthService` class. This delegates to the GoogleSignIn SDK
178178
/// directly and provides the same async helpers as the notifier.
179179
class GoogleAuthService {
180+
GoogleSignInAccount? user;
181+
GoogleSignInClientAuthorization? auth;
182+
180183
// Drive scope kept in sync with the notifier above
181184
static const List<String> _driveScopes = [drive.DriveApi.driveScope];
182185

@@ -189,22 +192,21 @@ class GoogleAuthService {
189192

190193
Future<bool> hasDriveAccess() async {
191194
await GoogleSignIn.instance.initialize();
192-
final user = await GoogleSignIn.instance.attemptLightweightAuthentication();
195+
user = await GoogleSignIn.instance.attemptLightweightAuthentication();
193196
if (user == null) return false;
194-
final auth = await user.authorizationClient.authorizationForScopes(
197+
auth = await user?.authorizationClient.authorizationForScopes(
195198
_driveScopes,
196199
);
197200
return auth != null;
198201
}
199202

200203
Future<bool> requestDriveAccess() async {
201-
final user = await GoogleSignIn.instance.attemptLightweightAuthentication();
202204
if (user == null) {
203205
Log.e('No user signed in to request scopes.', label: 'Auth');
204206
return false;
205207
}
206208
try {
207-
await user.authorizationClient.authorizeScopes(_driveScopes);
209+
await user?.authorizationClient.authorizeScopes(_driveScopes);
208210
Log.i('Drive scope request result: true', label: 'Auth');
209211
return true;
210212
} catch (e, st) {
@@ -218,13 +220,12 @@ class GoogleAuthService {
218220
}
219221

220222
Future<Map<String, String>?> getAuthHeaders() async {
221-
final user = await GoogleSignIn.instance.attemptLightweightAuthentication();
222223
if (user == null) {
223224
Log.e('No user to get auth headers.', label: 'Auth');
224225
return null;
225226
}
226227
try {
227-
final headers = await user.authorizationClient.authorizationHeaders(
228+
final headers = await user?.authorizationClient.authorizationHeaders(
228229
_driveScopes,
229230
);
230231
if (headers == null) {

lib/core/services/google/google_drive_service.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ class GoogleDriveService {
6565
}
6666
}
6767

68+
/// Returns last backup zip file on Google Drive
69+
Future<DriveFileSummary?> getLatestBackup() async {
70+
final backups = await searchBackups();
71+
if (backups.isNotEmpty) {
72+
return backups.first;
73+
}
74+
return null;
75+
}
76+
6877
// Download a specific backup file
6978
Future<File?> downloadBackup(String fileId) async {
7079
final headers = await _headers();

lib/features/backup_and_restore/presentation/components/backup_info_cards.dart

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,20 @@ final _lastActivityInfoProvider =
1111
final activities = await dao.getByUserId(uid);
1212

1313
// backup-related actions (local and cloud)
14-
final backupActions = [
15-
UserActivityAction.backupCreated,
16-
UserActivityAction.backupFailed,
17-
UserActivityAction.cloudBackupCreated,
18-
UserActivityAction.cloudBackupFailed,
19-
].map(userActivityActionToJson).toSet();
14+
final backupActions = {
15+
UserActivityAction.backupCreated.nameAsString,
16+
UserActivityAction.backupFailed.nameAsString,
17+
UserActivityAction.cloudBackupCreated.nameAsString,
18+
UserActivityAction.cloudBackupFailed.nameAsString,
19+
};
2020

2121
// restore-related actions (local and cloud)
22-
final restoreActions = [
23-
UserActivityAction.backupRestored,
24-
UserActivityAction.restoreFailed,
25-
UserActivityAction.cloudBackupRestored,
26-
UserActivityAction.cloudRestoreFailed,
27-
].map(userActivityActionToJson).toSet();
22+
final restoreActions = {
23+
UserActivityAction.backupRestored.nameAsString,
24+
UserActivityAction.restoreFailed.nameAsString,
25+
UserActivityAction.cloudBackupRestored.nameAsString,
26+
UserActivityAction.cloudRestoreFailed.nameAsString,
27+
};
2828

2929
// helper to pick the latest activity from a set of action names
3030
Map<String, dynamic>? pickLatest(Set<String> actions) {
@@ -36,21 +36,21 @@ final _lastActivityInfoProvider =
3636
final latest = list.first;
3737

3838
final createdBackupNames = {
39-
userActivityActionToJson(UserActivityAction.backupCreated),
40-
userActivityActionToJson(UserActivityAction.cloudBackupCreated),
39+
UserActivityAction.backupCreated.nameAsString,
40+
UserActivityAction.cloudBackupCreated.nameAsString,
4141
};
4242
final failedBackupNames = {
43-
userActivityActionToJson(UserActivityAction.backupFailed),
44-
userActivityActionToJson(UserActivityAction.cloudBackupFailed),
43+
UserActivityAction.backupFailed.nameAsString,
44+
UserActivityAction.cloudBackupFailed.nameAsString,
4545
};
4646

4747
final restoredNames = {
48-
userActivityActionToJson(UserActivityAction.backupRestored),
49-
userActivityActionToJson(UserActivityAction.cloudBackupRestored),
48+
UserActivityAction.backupRestored.nameAsString,
49+
UserActivityAction.cloudBackupRestored.nameAsString,
5050
};
5151
final failedRestoreNames = {
52-
userActivityActionToJson(UserActivityAction.restoreFailed),
53-
userActivityActionToJson(UserActivityAction.cloudRestoreFailed),
52+
UserActivityAction.restoreFailed.nameAsString,
53+
UserActivityAction.cloudRestoreFailed.nameAsString,
5454
};
5555

5656
bool? success;

lib/features/backup_and_restore/presentation/components/drive_backup_section.dart

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -114,33 +114,42 @@ class DriveBackupSection extends ConsumerWidget {
114114
),
115115
Container(
116116
width: double.infinity,
117-
padding: const EdgeInsets.symmetric(horizontal: 4.0),
117+
padding: const EdgeInsets.all(AppSpacing.spacing16),
118+
decoration: BoxDecoration(
119+
borderRadius: BorderRadius.circular(AppRadius.radius12),
120+
border: Border.all(color: context.breakLineColor),
121+
),
118122
child: Column(
119123
crossAxisAlignment: CrossAxisAlignment.start,
120-
mainAxisAlignment: MainAxisAlignment.start,
121-
mainAxisSize: MainAxisSize.min,
122-
spacing: AppSpacing.spacing4,
123124
children: [
124-
Gap(AppSpacing.spacing2),
125125
Text(
126-
state.status == BackupStatus.loading
127-
? 'Backup in progress...'
128-
: 'Google Drive Backup Status',
126+
'Google Drive Backup Info',
129127
style: AppTextStyles.body3.bold,
130128
),
131-
state.status == BackupStatus.loading
132-
? LinearProgressIndicator(
133-
value: state.status == BackupStatus.loading ? null : 0.0,
134-
color: AppColors.primary,
135-
borderRadius: BorderRadius.circular(AppRadius.radius12),
136-
minHeight: 6.0,
137-
)
138-
: Text(
139-
state.status == BackupStatus.error
140-
? 'Error: ${state.message}'
141-
: 'Perform backup or restore to see status',
142-
style: AppTextStyles.body3,
143-
),
129+
const Gap(AppSpacing.spacing8),
130+
Text(
131+
'Backup File: ${state.driveDirectory ?? 'Not set'}',
132+
style: AppTextStyles.body3,
133+
),
134+
const Gap(AppSpacing.spacing4),
135+
Text(
136+
'Last Backup Time: ${state.lastDriveBackupTime != null ? state.lastDriveBackupTime!.toDayMonthYearTime12Hour() : 'No backups yet'}',
137+
style: AppTextStyles.body3,
138+
),
139+
// last restore time
140+
const Gap(AppSpacing.spacing4),
141+
Text(
142+
'Last Restore Time: ${state.lastDriveRestoreTime != null ? state.lastDriveRestoreTime!.toDayMonthYearTime12Hour() : 'No restores yet'}',
143+
style: AppTextStyles.body3,
144+
),
145+
146+
if (state.status == BackupStatus.loading)
147+
LinearProgressIndicator(
148+
value: null,
149+
color: AppColors.primary,
150+
borderRadius: BorderRadius.circular(AppRadius.radius12),
151+
minHeight: 6.0,
152+
),
144153
],
145154
),
146155
),

0 commit comments

Comments
 (0)