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:convert';
import "dart:io"; import "dart:io";
import 'dart:typed_data'; 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/db/upload_locks_db.dart';
import 'package:photos/events/signed_in_event.dart'; import 'package:photos/events/signed_in_event.dart';
import 'package:photos/events/user_logged_out_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_attributes.dart';
import 'package:photos/models/key_gen_result.dart'; import 'package:photos/models/key_gen_result.dart';
import 'package:photos/models/private_key_attributes.dart'; import 'package:photos/models/private_key_attributes.dart';
@ -174,6 +176,7 @@ class Configuration {
MemoriesService.instance.clearCache(); MemoriesService.instance.clearCache();
BillingService.instance.clearCache(); BillingService.instance.clearCache();
SearchService.instance.clearCache(); SearchService.instance.clearCache();
unawaited(clearHomeWidget());
Bus.instance.fire(UserLoggedOutEvent()); Bus.instance.fire(UserLoggedOutEvent());
} else { } else {
await _preferences.setBool("auto_logout", true); await _preferences.setBool("auto_logout", true);

View file

@ -72,23 +72,38 @@ const kBackgroundLockLatency = Duration(seconds: 3);
void initSlideshowWidget() { void initSlideshowWidget() {
Workmanager().executeTask( Workmanager().executeTask(
(taskName, inputData) async { (taskName, inputData) async {
try {
await _init(true, via: 'runViaSlideshowWidget'); 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 = final collectionID =
await FavoritesService.instance.getFavoriteCollectionID(); await FavoritesService.instance.getFavoriteCollectionID();
if (collectionID == null) { if (collectionID == null) {
await hw.HomeWidget.saveWidgetData( await clearHomeWidget();
"slideshow", throw Exception("Collection not found");
null,
);
await hw.HomeWidget.updateWidget(
name: 'SlideshowWidgetProvider',
androidName: 'SlideshowWidgetProvider',
qualifiedAndroidName: 'io.ente.photos.SlideshowWidgetProvider',
iOSName: 'SlideshowWidget',
);
return false;
} }
try { try {
@ -109,7 +124,7 @@ void initSlideshowWidget() {
final randomNumber = Random().nextInt(files.length); final randomNumber = Random().nextInt(files.length);
final randomFile = files.elementAt(randomNumber); final randomFile = files.elementAt(randomNumber);
final fullImage = await getFileFromServer(randomFile); final fullImage = await getFileFromServer(randomFile);
if (fullImage == null) return false; if (fullImage == null) throw Exception("File not found");
Image img = Image.file(fullImage); Image img = Image.file(fullImage);
var imgProvider = img.image; var imgProvider = img.image;
@ -158,12 +173,29 @@ void initSlideshowWidget() {
_logger.info( _logger.info(
">>> SlideshowWidget rendered with size ${width}x$height", ">>> SlideshowWidget rendered with size ${width}x$height",
); );
return true;
} catch (_) { } 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 { 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/trigger_logout_event.dart';
import 'package:photos/events/user_logged_out_event.dart'; import 'package:photos/events/user_logged_out_event.dart';
import "package:photos/generated/l10n.dart"; import "package:photos/generated/l10n.dart";
import "package:photos/main.dart";
import 'package:photos/models/collection/collection_items.dart'; import 'package:photos/models/collection/collection_items.dart';
import 'package:photos/models/selected_files.dart'; import 'package:photos/models/selected_files.dart';
import 'package:photos/services/app_lifecycle_service.dart'; import 'package:photos/services/app_lifecycle_service.dart';
@ -107,6 +108,7 @@ class _HomeWidgetState extends State<HomeWidget> {
@override @override
void initState() { void initState() {
_logger.info("Building initstate"); _logger.info("Building initstate");
unawaited(initHomeOnLogin());
_tabChangedEventSubscription = _tabChangedEventSubscription =
Bus.instance.on<TabChangedEvent>().listen((event) { Bus.instance.on<TabChangedEvent>().listen((event) {
_selectedTabIndex = event.selectedIndex; _selectedTabIndex = event.selectedIndex;