fix: clear home_widget on logout, init in login

This commit is contained in:
Prateek Sunal 2024-02-28 19:55:31 +05:30
parent 0c569d7e97
commit ce6e5e18cc
3 changed files with 123 additions and 86 deletions

View file

@ -1,3 +1,4 @@
import "dart:async";
import 'dart:convert';
import "dart:io";
import 'dart:typed_data';
@ -18,6 +19,7 @@ import 'package:photos/db/trash_db.dart';
import 'package:photos/db/upload_locks_db.dart';
import 'package:photos/events/signed_in_event.dart';
import 'package:photos/events/user_logged_out_event.dart';
import "package:photos/main.dart";
import 'package:photos/models/key_attributes.dart';
import 'package:photos/models/key_gen_result.dart';
import 'package:photos/models/private_key_attributes.dart';
@ -174,6 +176,7 @@ class Configuration {
MemoriesService.instance.clearCache();
BillingService.instance.clearCache();
SearchService.instance.clearCache();
unawaited(clearHomeWidget());
Bus.instance.fire(UserLoggedOutEvent());
} else {
await _preferences.setBool("auto_logout", true);

View file

@ -72,23 +72,38 @@ const kBackgroundLockLatency = Duration(seconds: 3);
void initSlideshowWidget() {
Workmanager().executeTask(
(taskName, inputData) async {
try {
await _init(true, via: 'runViaSlideshowWidget');
await initHomeWidget();
return true;
} catch (e, s) {
_logger.severe("Error in initSlideshowWidget", e, s);
return false;
}
},
);
}
Future initHomeOnLogin() async {
_logger.info("Initializing SlideshowWidget on login");
initHomeWidget().catchError((e, s) {
_logger.severe("SlideshowWidget: Error in initHomeOnLogin", e, s);
}).ignore();
}
Future<void> initHomeWidget() async {
final user = Configuration.instance.getUserID();
if (user == null) {
await clearHomeWidget();
throw Exception("User not found");
}
final collectionID =
await FavoritesService.instance.getFavoriteCollectionID();
if (collectionID == null) {
await hw.HomeWidget.saveWidgetData(
"slideshow",
null,
);
await hw.HomeWidget.updateWidget(
name: 'SlideshowWidgetProvider',
androidName: 'SlideshowWidgetProvider',
qualifiedAndroidName: 'io.ente.photos.SlideshowWidgetProvider',
iOSName: 'SlideshowWidget',
);
return false;
await clearHomeWidget();
throw Exception("Collection not found");
}
try {
@ -109,7 +124,7 @@ void initSlideshowWidget() {
final randomNumber = Random().nextInt(files.length);
final randomFile = files.elementAt(randomNumber);
final fullImage = await getFileFromServer(randomFile);
if (fullImage == null) return false;
if (fullImage == null) throw Exception("File not found");
Image img = Image.file(fullImage);
var imgProvider = img.image;
@ -158,12 +173,29 @@ void initSlideshowWidget() {
_logger.info(
">>> SlideshowWidget rendered with size ${width}x$height",
);
return true;
} catch (_) {
return false;
throw Exception("Error rendering widget");
}
},
}
Future<void> clearHomeWidget() async {
final previousGeneratedId =
await hw.HomeWidget.getWidgetData<int>("home_widget_last_img");
if (previousGeneratedId == null) return;
_logger.info("Clearing SlideshowWidget");
await hw.HomeWidget.saveWidgetData(
"slideshow",
null,
);
await hw.HomeWidget.updateWidget(
name: 'SlideshowWidgetProvider',
androidName: 'SlideshowWidgetProvider',
qualifiedAndroidName: 'io.ente.photos.SlideshowWidgetProvider',
iOSName: 'SlideshowWidget',
);
_logger.info(">>> SlideshowWidget cleared");
}
Future<void> initWorkmanager() async {

View file

@ -24,6 +24,7 @@ import 'package:photos/events/tab_changed_event.dart';
import 'package:photos/events/trigger_logout_event.dart';
import 'package:photos/events/user_logged_out_event.dart';
import "package:photos/generated/l10n.dart";
import "package:photos/main.dart";
import 'package:photos/models/collection/collection_items.dart';
import 'package:photos/models/selected_files.dart';
import 'package:photos/services/app_lifecycle_service.dart';
@ -107,6 +108,7 @@ class _HomeWidgetState extends State<HomeWidget> {
@override
void initState() {
_logger.info("Building initstate");
unawaited(initHomeOnLogin());
_tabChangedEventSubscription =
Bus.instance.on<TabChangedEvent>().listen((event) {
_selectedTabIndex = event.selectedIndex;