-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathfirebase_repository.dart
More file actions
95 lines (77 loc) · 3.15 KB
/
firebase_repository.dart
File metadata and controls
95 lines (77 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import 'dart:async';
import 'dart:io';
import 'package:app/access/forced_update/data/version.dart';
import 'package:app/access/forced_update/minimum_version_repository.dart';
import 'package:app/access/kill_switch/kill_switch_repository.dart';
import 'package:app/firebase_options.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_remote_config/firebase_remote_config.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:get_it/get_it.dart';
import 'package:logger/logger.dart';
import 'package:rxdart/rxdart.dart';
/// Repository that gets the values from Firebase Remote Config.
/// Implements the [MinimumVersionRepository] and [KillSwitchRepository].
class FirebaseRemoteConfigRepository
implements MinimumVersionRepository, KillSwitchRepository, Disposable {
final Logger _logger;
FirebaseRemoteConfigRepository(this._logger) {
_initializeFirebaseServices();
}
/// Initializes Firebase services.
Future _initializeFirebaseServices() async {
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.instance;
await remoteConfig.setConfigSettings(
RemoteConfigSettings(
fetchTimeout: const Duration(minutes: 1),
minimumFetchInterval: Duration(
minutes:
int.parse(dotenv.env["REMOTE_CONFIG_FETCH_INTERVAL_MINUTES"]!),
),
),
);
await remoteConfig.setDefaults(const {
"minimum_version": "1.0.0",
"is_kill_switch_active": false,
});
_logger.i("Firebase has been initialized and registered in the container.");
// Listen to updates to the remote config. This is only available on mobile platforms.
if (Platform.isAndroid || Platform.isIOS) {
remoteConfig.onConfigUpdated.listen((event) async {
await remoteConfig.activate();
_updateRemoteConfig();
});
}
// Fetch and activate gets the data from the server and makes it available through the singleton.
remoteConfig.fetchAndActivate().then((_) {
_updateRemoteConfig();
});
}
/// Updates the remote config values.
void _updateRemoteConfig() {
FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.instance;
final minimumVersion = remoteConfig.getString('minimum_version');
final version = Version.fromString(minimumVersion);
final isKillSwitchActive = remoteConfig.getBool('is_kill_switch_active');
_minimumVersionBehaviorSubject.add(version);
_isKillSwitchActiveBehaviorSubject.add(isKillSwitchActive);
}
final BehaviorSubject<Version> _minimumVersionBehaviorSubject =
BehaviorSubject<Version>.seeded(const Version(1, 0, 0));
@override
Stream<Version> get minimumVersionStream =>
_minimumVersionBehaviorSubject.distinct();
final BehaviorSubject<bool> _isKillSwitchActiveBehaviorSubject =
BehaviorSubject<bool>.seeded(false);
@override
Stream<bool> get isKillSwitchActivatedStream =>
_isKillSwitchActiveBehaviorSubject.distinct();
@override
FutureOr onDispose() {
_minimumVersionBehaviorSubject.close();
_isKillSwitchActiveBehaviorSubject.close();
}
}