[mob][photos] additional fixes for widgets (#6428)

## Description

Some more fixes for widgets.

## Tests
This commit is contained in:
Neeraj
2025-07-02 14:13:00 +05:30
committed by GitHub
12 changed files with 70 additions and 38 deletions

View File

@@ -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);
}

View File

@@ -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];
}
}

View File

@@ -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 {

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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 = {};

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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 = {};

View File

@@ -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;