Prechádzať zdrojové kódy

Add feature flag to enable/disable CF Worker

Neeraj Gupta 3 rokov pred
rodič
commit
c1e0886757

+ 2 - 0
lib/main.dart

@@ -13,6 +13,7 @@ import 'package:photos/core/network.dart';
 import 'package:photos/db/upload_locks_db.dart';
 import 'package:photos/services/billing_service.dart';
 import 'package:photos/services/collections_service.dart';
+import 'package:photos/services/feature_flag_service.dart';
 import 'package:photos/services/local_sync_service.dart';
 import 'package:photos/services/memories_service.dart';
 import 'package:photos/services/notification_service.dart';
@@ -109,6 +110,7 @@ void _backgroundTask(String taskId) async {
   _logger.info("[BackgroundFetch] Event received: $taskId");
   _scheduleBGTaskKill(taskId);
   await _init(true);
+  FeatureFlagService.instance.sync();
   UpdateService.instance.showUpdateNotification();
   await _sync(isAppInBackground: true);
   BackgroundFetch.finish(taskId);

+ 3 - 2
lib/models/file.dart

@@ -7,6 +7,7 @@ import 'package:photos/core/configuration.dart';
 import 'package:photos/core/constants.dart';
 import 'package:photos/models/file_type.dart';
 import 'package:photos/models/location.dart';
+import 'package:photos/services/feature_flag_service.dart';
 import 'package:photos/utils/crypto_util.dart';
 
 class File {
@@ -145,7 +146,7 @@ class File {
   }
 
   String getDownloadUrl() {
-    if (kDebugMode) {
+    if (kDebugMode || FeatureFlagService.instance.disableCFWorker()) {
       return Configuration.instance.getHttpEndpoint() +
           "/files/download/" +
           uploadedFileID.toString();
@@ -156,7 +157,7 @@ class File {
   }
 
   String getThumbnailUrl() {
-    if (kDebugMode) {
+    if (kDebugMode || FeatureFlagService.instance.disableCFWorker()) {
       return Configuration.instance.getHttpEndpoint() +
           "/files/preview/" +
           uploadedFileID.toString();

+ 78 - 0
lib/services/feature_flag_service.dart

@@ -0,0 +1,78 @@
+import 'dart:convert';
+
+import 'package:logging/logging.dart';
+import 'package:photos/core/network.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+class FeatureFlagService {
+  FeatureFlagService._privateConstructor();
+
+  static final FeatureFlagService instance =
+      FeatureFlagService._privateConstructor();
+  static const kBooleanFeatureFlagsKey = "feature_flags_key";
+
+  final _logger = Logger("FeatureFlagService");
+  FeatureFlags _featureFlags;
+  SharedPreferences _prefs;
+
+  Future<void> init() async {
+    _prefs = await SharedPreferences.getInstance();
+  }
+
+  bool disableCFWorker() {
+    try {
+      _featureFlags ??=
+          FeatureFlags.fromJson(_prefs.getString(kBooleanFeatureFlagsKey));
+      return _featureFlags != null ? _featureFlags.disableCFWorker : false;
+    } catch (e) {
+      _logger.severe(e);
+      return false;
+    }
+  }
+
+  Future<void> sync() async {
+    try {
+      final response = await Network.instance
+          .getDio()
+          .get("https://static.ente.io/feature_flags.json");
+      final featureFlags = FeatureFlags.fromMap(response.data);
+      if (featureFlags != null) {
+        _prefs.setString(kBooleanFeatureFlagsKey, featureFlags.toJson());
+        _featureFlags = featureFlags;
+      }
+    } catch (e) {
+      _logger.severe("Failed to sync feature flags ", e);
+    }
+  }
+}
+
+class FeatureFlags {
+  bool disableCFWorker = false; // default to false
+
+  FeatureFlags(
+    this.disableCFWorker,
+  );
+
+  @override
+  Map<String, dynamic> toMap() {
+    return {
+      "disableCFWorker": disableCFWorker,
+    };
+  }
+
+  String toJson() => json.encode(toMap());
+
+  factory FeatureFlags.fromJson(String source) =>
+      FeatureFlags.fromMap(json.decode(source));
+
+  factory FeatureFlags.fromMap(Map<String, dynamic> json) {
+    return FeatureFlags(
+      json["disableCFWorker"] ?? false,
+    );
+  }
+
+  @override
+  String toString() {
+    return toMap().toString();
+  }
+}