[mob][photos] additional fixes for widgets (#6428)
## Description Some more fixes for widgets. ## Tests
This commit is contained in:
@@ -10,6 +10,7 @@ import 'package:flutter/material.dart';
|
||||
import "package:flutter/rendering.dart";
|
||||
import "package:flutter/services.dart";
|
||||
import "package:flutter_displaymode/flutter_displaymode.dart";
|
||||
import "package:intl/date_symbol_data_local.dart";
|
||||
import 'package:logging/logging.dart';
|
||||
import "package:media_kit/media_kit.dart";
|
||||
import "package:package_info_plus/package_info_plus.dart";
|
||||
@@ -116,8 +117,13 @@ Future<void> _homeWidgetSync([bool isBackground = false]) async {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isBackground) {
|
||||
final locale = await getLocale();
|
||||
await initializeDateFormatting(locale?.languageCode ?? "en");
|
||||
}
|
||||
|
||||
try {
|
||||
await HomeWidgetService.instance.initHomeWidget();
|
||||
await HomeWidgetService.instance.initHomeWidget(isBackground);
|
||||
} catch (e, s) {
|
||||
_logger.severe("Error in syncing home widget", e, s);
|
||||
}
|
||||
|
||||
@@ -65,9 +65,9 @@ class AlbumHomeWidgetService {
|
||||
await _prefs.setString(ALBUMS_LAST_HASH_KEY, hash);
|
||||
}
|
||||
|
||||
Future<void> initAlbumHomeWidget() async {
|
||||
Future<void> initAlbumHomeWidget(bool isBg) async {
|
||||
await HomeWidgetService.instance.computeLock.synchronized(() async {
|
||||
if (await _hasAnyBlockers()) {
|
||||
if (await _hasAnyBlockers(isBg)) {
|
||||
await clearWidget();
|
||||
return;
|
||||
}
|
||||
@@ -133,13 +133,13 @@ class AlbumHomeWidgetService {
|
||||
|
||||
_logger.info("Checking pending albums sync");
|
||||
if (await _shouldUpdateWidgetCache()) {
|
||||
await initAlbumHomeWidget();
|
||||
await initAlbumHomeWidget(false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _refreshOnSelection() async {
|
||||
final lastHash = getAlbumsLastHash();
|
||||
final selectedAlbumIds = await _getEffectiveSelectedAlbumIds();
|
||||
final selectedAlbumIds = await _getEffectiveSelectedAlbumIds(false);
|
||||
final currentHash = _calculateHash(selectedAlbumIds);
|
||||
if (lastHash != null && currentHash == lastHash) {
|
||||
_logger.info("No changes detected in albums");
|
||||
@@ -147,7 +147,7 @@ class AlbumHomeWidgetService {
|
||||
}
|
||||
|
||||
await setSelectionChange(true);
|
||||
await initAlbumHomeWidget();
|
||||
await initAlbumHomeWidget(false);
|
||||
}
|
||||
|
||||
List<Collection> getAlbumsByIds(List<int> albumIds) {
|
||||
@@ -157,7 +157,7 @@ class AlbumHomeWidgetService {
|
||||
final collection = CollectionsService.instance.getCollectionByID(albumId);
|
||||
if (collection != null &&
|
||||
!collection.isDeleted &&
|
||||
collection.isHidden()) {
|
||||
!collection.isHidden()) {
|
||||
albums.add(collection);
|
||||
}
|
||||
}
|
||||
@@ -232,7 +232,7 @@ class AlbumHomeWidgetService {
|
||||
return hash;
|
||||
}
|
||||
|
||||
Future<bool> _hasAnyBlockers() async {
|
||||
Future<bool> _hasAnyBlockers([bool isBg = false]) async {
|
||||
// Check if first import is completed
|
||||
final hasCompletedFirstImport =
|
||||
LocalSyncService.instance.hasCompletedFirstImport();
|
||||
@@ -241,7 +241,7 @@ class AlbumHomeWidgetService {
|
||||
}
|
||||
|
||||
// Check if selected albums exist
|
||||
final selectedAlbumIds = await _getEffectiveSelectedAlbumIds();
|
||||
final selectedAlbumIds = await _getEffectiveSelectedAlbumIds(isBg);
|
||||
final albums = getAlbumsByIds(selectedAlbumIds);
|
||||
|
||||
if (albums.isEmpty) {
|
||||
@@ -254,7 +254,7 @@ class AlbumHomeWidgetService {
|
||||
|
||||
Future<void> _refreshAlbumsWidget() async {
|
||||
// only refresh if widget was synced without issues
|
||||
if (getAlbumsStatus() == WidgetStatus.syncedAll) return;
|
||||
if (await countHomeWidgets() == 0) return;
|
||||
await _refreshWidget(message: "Refreshing from existing album set");
|
||||
}
|
||||
|
||||
@@ -289,14 +289,18 @@ class AlbumHomeWidgetService {
|
||||
return true;
|
||||
}
|
||||
|
||||
Future<List<int>> _getEffectiveSelectedAlbumIds() async {
|
||||
Future<List<int>> _getEffectiveSelectedAlbumIds([bool isBg = false]) async {
|
||||
final selectedAlbumIds = getSelectedAlbumIds();
|
||||
|
||||
// If no albums selected, use favorites as default
|
||||
if (selectedAlbumIds == null || selectedAlbumIds.isEmpty) {
|
||||
if (isBg) {
|
||||
await FavoritesService.instance.initFav();
|
||||
}
|
||||
final favoriteId =
|
||||
await FavoritesService.instance.getFavoriteCollectionID();
|
||||
if (favoriteId != null) {
|
||||
await updateSelectedAlbums([favoriteId.toString()]);
|
||||
return [favoriteId];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,19 +62,19 @@ class HomeWidgetService {
|
||||
}
|
||||
|
||||
void _initializeWidgetServices(SharedPreferences prefs) {
|
||||
MemoryHomeWidgetService.instance.init(prefs);
|
||||
PeopleHomeWidgetService.instance.init(prefs);
|
||||
AlbumHomeWidgetService.instance.init(prefs);
|
||||
PeopleHomeWidgetService.instance.init(prefs);
|
||||
MemoryHomeWidgetService.instance.init(prefs);
|
||||
}
|
||||
|
||||
void setAppGroupID(String id) {
|
||||
hw.HomeWidget.setAppGroupId(id).ignore();
|
||||
}
|
||||
|
||||
Future<void> initHomeWidget() async {
|
||||
await MemoryHomeWidgetService.instance.initMemoryHomeWidget();
|
||||
Future<void> initHomeWidget([bool isBg = false]) async {
|
||||
await AlbumHomeWidgetService.instance.initAlbumHomeWidget(isBg);
|
||||
await PeopleHomeWidgetService.instance.initPeopleHomeWidget();
|
||||
await AlbumHomeWidgetService.instance.initAlbumHomeWidget();
|
||||
await MemoryHomeWidgetService.instance.initMemoryHomeWidget();
|
||||
}
|
||||
|
||||
Future<bool?> updateWidget({
|
||||
@@ -222,9 +222,9 @@ class HomeWidgetService {
|
||||
}
|
||||
|
||||
await Future.wait([
|
||||
MemoryHomeWidgetService.instance.clearWidget(),
|
||||
PeopleHomeWidgetService.instance.clearWidget(),
|
||||
AlbumHomeWidgetService.instance.clearWidget(),
|
||||
PeopleHomeWidgetService.instance.clearWidget(),
|
||||
MemoryHomeWidgetService.instance.clearWidget(),
|
||||
]);
|
||||
|
||||
try {
|
||||
|
||||
@@ -433,6 +433,7 @@ class MemoriesCacheService {
|
||||
required bool onThisDay,
|
||||
required bool pastYears,
|
||||
required bool smart,
|
||||
required bool hasAnyWidgets,
|
||||
}) async {
|
||||
if (!onThisDay && !pastYears && !smart) {
|
||||
_logger.info(
|
||||
@@ -440,7 +441,7 @@ class MemoriesCacheService {
|
||||
);
|
||||
return [];
|
||||
}
|
||||
final allMemories = await getMemories(onlyUseCache: true);
|
||||
final allMemories = await getMemories(onlyUseCache: !hasAnyWidgets);
|
||||
if (onThisDay && pastYears && smart) {
|
||||
return allMemories;
|
||||
}
|
||||
|
||||
@@ -182,7 +182,7 @@ class MemoryHomeWidgetService {
|
||||
|
||||
Future<void> _refreshMemoriesWidget() async {
|
||||
// only refresh if widget was synced without issues
|
||||
if (getMemoriesStatus() == WidgetStatus.syncedAll) return;
|
||||
if (await countHomeWidgets() == 0) return;
|
||||
await _refreshWidget(message: "Refreshing from existing memory set");
|
||||
}
|
||||
|
||||
@@ -222,6 +222,7 @@ class MemoryHomeWidgetService {
|
||||
onThisDay: onThisDayValue,
|
||||
pastYears: lastYearValue,
|
||||
smart: smartMemoryValue,
|
||||
hasAnyWidgets: await countHomeWidgets() > 0,
|
||||
);
|
||||
|
||||
return memories;
|
||||
|
||||
@@ -131,7 +131,7 @@ class PeopleHomeWidgetService {
|
||||
|
||||
Future<void> checkPeopleChanged() async {
|
||||
final havePeopleChanged = await peopleChangedLock.synchronized(() async {
|
||||
final peopleIds = getSelectedPeople() ?? [];
|
||||
final peopleIds = await _getEffectiveSelections();
|
||||
final currentHash = await _calculateHash(peopleIds);
|
||||
final lastHash = getPeopleLastHash();
|
||||
|
||||
@@ -204,6 +204,22 @@ class PeopleHomeWidgetService {
|
||||
await _refreshPeopleWidget();
|
||||
}
|
||||
|
||||
Future<List<String>> _getEffectiveSelections() async {
|
||||
var selection = getSelectedPeople();
|
||||
|
||||
if ((selection?.isEmpty ?? true) &&
|
||||
getPeopleStatus() == WidgetStatus.syncedAll) {
|
||||
selection = await SearchService.instance.getTopTwoFaces();
|
||||
if (selection.isEmpty) {
|
||||
await clearWidget();
|
||||
return [];
|
||||
}
|
||||
await setSelectedPeople(selection);
|
||||
}
|
||||
|
||||
return selection ?? [];
|
||||
}
|
||||
|
||||
Future<String> _calculateHash(List<String> peopleIds) async {
|
||||
return await entityService.getHashForIds(peopleIds);
|
||||
}
|
||||
@@ -226,7 +242,7 @@ class PeopleHomeWidgetService {
|
||||
}
|
||||
|
||||
// Check if selected people or hash exist
|
||||
final peopleIds = getSelectedPeople() ?? [];
|
||||
final peopleIds = await _getEffectiveSelections();
|
||||
final hash = await _calculateHash(peopleIds);
|
||||
|
||||
final noSelectionOrHashEmpty = peopleIds.isEmpty || hash.isEmpty;
|
||||
@@ -240,7 +256,7 @@ class PeopleHomeWidgetService {
|
||||
|
||||
Future<void> _refreshPeopleWidget() async {
|
||||
// only refresh if widget was synced without issues
|
||||
if (getPeopleStatus() == WidgetStatus.syncedAll) return;
|
||||
if (await countHomeWidgets() == 0) return;
|
||||
await _refreshWidget(message: "Refreshing from existing people set");
|
||||
}
|
||||
|
||||
@@ -304,7 +320,7 @@ class PeopleHomeWidgetService {
|
||||
}
|
||||
|
||||
Future<void> _updatePeopleWidgetCache() async {
|
||||
final peopleIds = getSelectedPeople() ?? [];
|
||||
final peopleIds = await _getEffectiveSelections();
|
||||
final peopleWithFiles = await _getPeople(peopleIds);
|
||||
|
||||
if (peopleWithFiles.isEmpty) {
|
||||
|
||||
@@ -663,6 +663,19 @@ class SearchService {
|
||||
return searchResults;
|
||||
}
|
||||
|
||||
Future<List<String>> getTopTwoFaces() async {
|
||||
final searchFilter = await SectionType.face.getData(null).then(
|
||||
(value) => (value as List<GenericSearchResult>).where(
|
||||
(element) => (element.params[kPersonParamID] as String?) != null,
|
||||
),
|
||||
);
|
||||
|
||||
return searchFilter
|
||||
.take(2)
|
||||
.map((e) => e.params[kPersonParamID] as String)
|
||||
.toList();
|
||||
}
|
||||
|
||||
Future<List<GenericSearchResult>> getLocationResults(String query) async {
|
||||
final locationTagEntities = (await locationService.getLocationTags());
|
||||
final Map<LocalEntity<LocationTag>, List<EnteFile>> result = {};
|
||||
|
||||
@@ -103,7 +103,6 @@ class _AlbumsWidgetSettingsState extends State<AlbumsWidgetSettings> {
|
||||
await AlbumHomeWidgetService.instance
|
||||
.updateSelectedAlbums(albums);
|
||||
Navigator.pop(context);
|
||||
|
||||
}
|
||||
: null,
|
||||
isDisabled: _selectedAlbums.albums.isEmpty,
|
||||
@@ -123,7 +122,7 @@ class _AlbumsWidgetSettingsState extends State<AlbumsWidgetSettings> {
|
||||
flexibleSpaceTitle: TitleBarTitleWidget(
|
||||
title: S.of(context).albums,
|
||||
),
|
||||
expandedHeight: 120,
|
||||
expandedHeight: MediaQuery.textScalerOf(context).scale(120),
|
||||
flexibleSpaceCaption: hasInstalledAny
|
||||
? S.of(context).albumsWidgetDesc
|
||||
: context.l10n.addAlbumWidgetPrompt,
|
||||
|
||||
@@ -104,7 +104,7 @@ class _MemoriesWidgetSettingsState extends State<MemoriesWidgetSettings> {
|
||||
flexibleSpaceTitle: TitleBarTitleWidget(
|
||||
title: S.of(context).memories,
|
||||
),
|
||||
expandedHeight: 120,
|
||||
expandedHeight: MediaQuery.textScalerOf(context).scale(120),
|
||||
flexibleSpaceCaption: hasInstalledAny
|
||||
? S.of(context).memoriesWidgetDesc
|
||||
: context.l10n.addMemoriesWidgetPrompt,
|
||||
|
||||
@@ -88,7 +88,7 @@ class _PeopleWidgetSettingsState extends State<PeopleWidgetSettings> {
|
||||
flexibleSpaceTitle: TitleBarTitleWidget(
|
||||
title: S.of(context).people,
|
||||
),
|
||||
expandedHeight: 120,
|
||||
expandedHeight: MediaQuery.textScalerOf(context).scale(120),
|
||||
flexibleSpaceCaption: hasInstalledAny
|
||||
? S.of(context).peopleWidgetDesc
|
||||
: context.l10n.addPeopleWidgetPrompt,
|
||||
|
||||
@@ -279,9 +279,9 @@ class _HomeWidgetState extends State<HomeWidget> {
|
||||
await Future.delayed(const Duration(seconds: 5));
|
||||
|
||||
_logger.info("Syncing home widget");
|
||||
await MemoryHomeWidgetService.instance.checkPendingMemorySync();
|
||||
await PeopleHomeWidgetService.instance.checkPendingPeopleSync();
|
||||
await AlbumHomeWidgetService.instance.checkPendingAlbumsSync();
|
||||
await PeopleHomeWidgetService.instance.checkPendingPeopleSync();
|
||||
await MemoryHomeWidgetService.instance.checkPendingMemorySync();
|
||||
}
|
||||
|
||||
final Map<Uri, (bool, int)> _linkedPublicAlbums = {};
|
||||
|
||||
@@ -399,14 +399,6 @@ class _PeopleSectionAllWidgetState extends State<PeopleSectionAllWidget> {
|
||||
results.removeWhere(
|
||||
(element) => element.params[kPersonParamID] == null,
|
||||
);
|
||||
if (widget.selectedPeople?.personIds.isEmpty ?? false) {
|
||||
widget.selectedPeople!.select(
|
||||
results
|
||||
.take(2)
|
||||
.map((e) => e.params[kPersonParamID] as String)
|
||||
.toSet(),
|
||||
);
|
||||
}
|
||||
}
|
||||
_isLoaded = true;
|
||||
return results;
|
||||
|
||||
Reference in New Issue
Block a user