Browse Source

[FIX] HomeWidget improvements (#737)

## Description
- Use Background fetch as workmanager is not working as expected.
- Use new asset for empty state.
Prateek Sunal 1 năm trước cách đây
mục cha
commit
5acef45118

+ 1 - 1
mobile/android/app/src/main/kotlin/io/ente/photos/SlideshowWidgetProvider.kt

@@ -54,7 +54,7 @@ class SlideshowWidgetProvider : HomeWidgetProvider() {
                             val drawable =
                                     ContextCompat.getDrawable(
                                             context,
-                                            R.drawable.ic_launcher_foreground
+                                            R.drawable.ic_home_widget_default
                                     )
                             val bitmap = (drawable as BitmapDrawable).bitmap
                             setImageViewBitmap(R.id.widget_placeholder, bitmap)

BIN
mobile/android/app/src/main/res/drawable-hdpi/ic_home_widget_default.png


BIN
mobile/android/app/src/main/res/drawable-ldpi/ic_home_widget_default.png


BIN
mobile/android/app/src/main/res/drawable-mdpi/ic_home_widget_default.png


BIN
mobile/android/app/src/main/res/drawable-xhdpi/ic_home_widget_default.png


BIN
mobile/android/app/src/main/res/drawable-xxhdpi/ic_home_widget_default.png


BIN
mobile/android/app/src/main/res/drawable-xxxhdpi/ic_home_widget_default.png


+ 0 - 1
mobile/android/app/src/main/res/layout/slideshow_layout.xml

@@ -14,7 +14,6 @@
         android:adjustViewBounds="true"
         android:visibility="visible"
         tools:visibility="visible"
-        android:background="@drawable/widget_background"
         />
     <ImageView
         android:id="@+id/widget_img"

+ 0 - 1
mobile/ios/Runner/AppDelegate.swift

@@ -1,6 +1,5 @@
 import Flutter
 import UIKit
-import workmanager
 
 @UIApplicationMain
 @objc class AppDelegate: FlutterAppDelegate {

+ 31 - 42
mobile/lib/main.dart

@@ -49,7 +49,6 @@ import 'package:photos/utils/file_uploader.dart';
 import "package:photos/utils/home_widget_util.dart";
 import 'package:photos/utils/local_settings.dart';
 import 'package:shared_preferences/shared_preferences.dart';
-import "package:workmanager/workmanager.dart";
 
 final _logger = Logger("main");
 
@@ -58,55 +57,17 @@ const kLastBGTaskHeartBeatTime = "bg_task_hb_time";
 const kLastFGTaskHeartBeatTime = "fg_task_hb_time";
 const kHeartBeatFrequency = Duration(seconds: 1);
 const kFGSyncFrequency = Duration(minutes: 5);
+const kFGHomeWidgetSyncFrequency = Duration(minutes: 15);
 const kBGTaskTimeout = Duration(seconds: 25);
 const kBGPushTimeout = Duration(seconds: 28);
 const kFGTaskDeathTimeoutInMicroseconds = 5000000;
 const kBackgroundLockLatency = Duration(seconds: 3);
 
-@pragma("vm:entry-point")
-void initSlideshowWidget() {
-  Workmanager().executeTask(
-    (taskName, inputData) async {
-      try {
-        if (await countHomeWidgets() != 0) {
-          await _init(true, via: 'runViaSlideshowWidget');
-          await initHomeWidget();
-        }
-        return true;
-      } catch (e, s) {
-        _logger.severe("Error in initSlideshowWidget", e, s);
-        return false;
-      }
-    },
-  );
-}
-
-Future<void> initWorkmanager() async {
-  await Workmanager()
-      .initialize(initSlideshowWidget, isInDebugMode: kDebugMode);
-  await Workmanager().registerPeriodicTask(
-    "slideshow-widget",
-    "updateSlideshowWidget",
-    initialDelay: const Duration(seconds: 10),
-    frequency: const Duration(
-      minutes: 15,
-    ),
-  );
-}
-
 void main() async {
   debugRepaintRainbowEnabled = false;
   WidgetsFlutterBinding.ensureInitialized();
   MediaKit.ensureInitialized();
 
-  if (Platform.isAndroid) {
-    unawaited(
-      initWorkmanager().catchError((e, s) {
-        _logger.severe("Error in initWorkmanager", e, s);
-      }),
-    );
-  }
-
   final savedThemeMode = await AdaptiveTheme.getThemeMode();
   await _runInForeground(savedThemeMode);
   unawaited(BackgroundFetch.registerHeadlessTask(_headlessTaskHandler));
@@ -118,6 +79,9 @@ Future<void> _runInForeground(AdaptiveThemeMode? savedThemeMode) async {
     _logger.info("Starting app in foreground");
     await _init(false, via: 'mainMethod');
     final Locale locale = await getLocale();
+    if (Platform.isAndroid) {
+      unawaited(_scheduleFGHomeWidgetSync());
+    }
     unawaited(_scheduleFGSync('appStart in FG'));
 
     runApp(
@@ -143,6 +107,17 @@ ThemeMode _themeMode(AdaptiveThemeMode? savedThemeMode) {
   return ThemeMode.system;
 }
 
+Future<void> _homeWidgetSync() async {
+  if (!Platform.isAndroid) return;
+  try {
+    if (await countHomeWidgets() != 0) {
+      await initHomeWidget();
+    }
+  } catch (e, s) {
+    _logger.severe("Error in initSlideshowWidget", e, s);
+  }
+}
+
 Future<void> _runBackgroundTask(String taskId, {String mode = 'normal'}) async {
   if (_isProcessRunning) {
     _logger.info("Background task triggered when process was already running");
@@ -176,8 +151,15 @@ Future<void> _runInBackground(String taskId) async {
     _scheduleSuicide(kBGTaskTimeout, taskId); // To prevent OS from punishing us
   }
   await _init(true, via: 'runViaBackgroundTask');
-  UpdateService.instance.showUpdateNotification().ignore();
-  await _sync('bgSync');
+  await Future.wait(
+    [
+      _homeWidgetSync(),
+      () async {
+        UpdateService.instance.showUpdateNotification().ignore();
+        await _sync('bgSync');
+      }(),
+    ],
+  );
   BackgroundFetch.finish(taskId);
 }
 
@@ -292,6 +274,13 @@ Future<void> _scheduleHeartBeat(
   });
 }
 
+Future<void> _scheduleFGHomeWidgetSync() async {
+  await _homeWidgetSync();
+  Future.delayed(kFGHomeWidgetSyncFrequency, () async {
+    unawaited(_scheduleFGHomeWidgetSync());
+  });
+}
+
 Future<void> _scheduleFGSync(String caller) async {
   await _sync(caller);
   Future.delayed(kFGSyncFrequency, () async {

+ 11 - 0
mobile/lib/utils/home_widget_util.dart

@@ -47,11 +47,22 @@ Future<void> initHomeWidget() async {
 
     final previousGeneratedId =
         await hw.HomeWidget.getWidgetData<int>("home_widget_last_img");
+
+    if (res.files.length == 1 &&
+        res.files[0].generatedID == previousGeneratedId) {
+      logger.info("Only one image found and it's the same as the previous one");
+      return;
+    }
+    if (res.files.isEmpty) {
+      await clearHomeWidget();
+      return;
+    }
     final files = res.files.where(
       (element) =>
           element.generatedID != previousGeneratedId &&
           element.fileType == FileType.image,
     );
+
     final randomNumber = Random().nextInt(files.length);
     final randomFile = files.elementAt(randomNumber);
     final fullImage = await getFileFromServer(randomFile);

+ 1 - 9
mobile/pubspec.lock

@@ -2449,14 +2449,6 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.0.0"
-  workmanager:
-    dependency: "direct main"
-    description:
-      name: workmanager
-      sha256: ed13530cccd28c5c9959ad42d657cd0666274ca74c56dea0ca183ddd527d3a00
-      url: "https://pub.dev"
-    source: hosted
-    version: "0.5.2"
   xdg_directories:
     dependency: transitive
     description:
@@ -2498,5 +2490,5 @@ packages:
     source: hosted
     version: "3.1.2"
 sdks:
-  dart: ">=3.1.2 <4.0.0"
+  dart: ">=3.1.0 <4.0.0"
   flutter: ">=3.13.0"

+ 0 - 1
mobile/pubspec.yaml

@@ -175,7 +175,6 @@ dependencies:
   wallpaper_manager_flutter: ^0.0.2
   wechat_assets_picker: ^8.6.3
   widgets_to_image: ^0.0.2
-  workmanager: ^0.5.2
 
 dependency_overrides:
   # current fork of tfite_flutter_helper depends on ffi: ^1.x.x