ente/lib/services/feature_flag_service.dart

79 lines
1.9 KiB
Dart
Raw Normal View History

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