aboutsummaryrefslogtreecommitdiffstats
path: root/lib/data/data_providers/app_config_provider.dart
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2023-12-31 16:24:51 -0500
committerScott Murray <scott.murray@konsulko.com>2024-01-03 18:23:52 -0500
commit4742fde5c48726357cc8db06d237e9db6c3df608 (patch)
treedcca2b3e3c6cb3a4a46b7ae603f64fa9ce5a086c /lib/data/data_providers/app_config_provider.dart
parentfcd868bd73d35bd79074f3425317152565aeb275 (diff)
Initial radio implementation
Notable changes: - Add radio gRPC API protobuf definitation and generated files. - Reworked existing single gRPC APIs library to split it into per-API libraries to avoid name collision issues. - Add radio gRPC client class and associated radio state class and RiverPod providers. - Split media controls and play list table classes into media player and radio specific versions to facilitate customization and wiring up their appropriate backends in a straightforward fashion. Some potential rationalization of styling widgets may be done as a follow up to avoid some duplication. - Added radio configuration and presets loading. The presets will be populated with the contents of a radio-presets.yaml file from the configured location, the default location is the /etc/xdg/AGL/ics-homescreen directory. - Implemented FM radio player against the radio gRPC API. For the sake of expediency, no attempt has been made to make the player able to handle AM band support. - Reworked media page navigation state so that active player is restored when coming back to the page. Logic has been added to start/stop the radio on navigating to or leaving the FM radio sub-page. This will potentially be reworked before CES to work with the pause/stop button present on the other pages. - Started pruning down global exports.dart a bit to remove files only used in a specific page/hierarchy, starting with media. Bug-AGL: SPEC-5029 Change-Id: I1ae0aca4a7a8218e69e4286c863f01509a1cccb7 Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Diffstat (limited to 'lib/data/data_providers/app_config_provider.dart')
-rw-r--r--lib/data/data_providers/app_config_provider.dart72
1 files changed, 65 insertions, 7 deletions
diff --git a/lib/data/data_providers/app_config_provider.dart b/lib/data/data_providers/app_config_provider.dart
index 7e0ddc6..a60a462 100644
--- a/lib/data/data_providers/app_config_provider.dart
+++ b/lib/data/data_providers/app_config_provider.dart
@@ -35,14 +35,40 @@ class KuksaConfig {
}
}
+class RadioConfig {
+ final String hostname;
+ final int port;
+ final String presets;
+
+ static String defaultHostname = 'localhost';
+ static int defaultPort = 50053;
+ static String defaultPresets =
+ '/etc/xdg/AGL/ics-homescreen/radio-presets.yaml';
+
+ RadioConfig(
+ {required this.hostname, required this.port, required this.presets});
+
+ static RadioConfig defaultConfig() {
+ return RadioConfig(
+ hostname: RadioConfig.defaultHostname,
+ port: RadioConfig.defaultPort,
+ presets: RadioConfig.defaultPresets);
+ }
+}
+
class AppConfig {
final bool disableBkgAnimation;
final bool randomHybridAnimation;
final KuksaConfig kuksaConfig;
+ final RadioConfig radioConfig;
static String configFilePath = '/etc/xdg/AGL/ics-homescreen.yaml';
- AppConfig({required this.disableBkgAnimation, required this.randomHybridAnimation, required this.kuksaConfig});
+ AppConfig(
+ {required this.disableBkgAnimation,
+ required this.randomHybridAnimation,
+ required this.kuksaConfig,
+ required this.radioConfig});
static KuksaConfig parseKuksaConfig(YamlMap kuksaMap) {
try {
@@ -64,7 +90,7 @@ class AppConfig {
debugPrint("Reading authorization token $s");
try {
token = File(s).readAsStringSync();
- } on Exception catch (_) {
+ } catch (_) {
print("ERROR: Could not read authorization token file $token");
token = "";
}
@@ -89,7 +115,7 @@ class AppConfig {
}
try {
ca_cert = File(ca_path).readAsBytesSync();
- } on Exception catch (_) {
+ } catch (_) {
print("ERROR: Could not read CA certificate file $ca_path");
ca_cert = [];
}
@@ -107,10 +133,33 @@ class AppConfig {
use_tls: use_tls,
ca_certificate: ca_cert,
tls_server_name: tls_server_name);
- } on Exception catch (_) {
+ } catch (_) {
return KuksaConfig.defaultConfig();
}
}
+
+ static RadioConfig parseRadioConfig(YamlMap radioMap) {
+ try {
+ String hostname = RadioConfig.defaultHostname;
+ if (radioMap.containsKey('hostname')) {
+ hostname = radioMap['hostname'];
+ }
+
+ int port = RadioConfig.defaultPort;
+ if (radioMap.containsKey('port')) {
+ port = radioMap['port'];
+ }
+
+ String presets = RadioConfig.defaultPresets;
+ if (radioMap.containsKey('presets')) {
+ hostname = radioMap['presets'];
+ }
+
+ return RadioConfig(hostname: hostname, port: port, presets: presets);
+ } catch (_) {
+ return RadioConfig.defaultConfig();
+ }
+ }
}
final appConfigProvider = Provider((ref) {
@@ -133,6 +182,13 @@ final appConfigProvider = Provider((ref) {
tls_server_name: "");
}
+ RadioConfig radioConfig;
+ if (yamlMap.containsKey('radio')) {
+ radioConfig = AppConfig.parseRadioConfig(yamlMap['radio']);
+ } else {
+ radioConfig = RadioConfig.defaultConfig();
+ }
+
bool disableBkgAnimation = disableBkgAnimationDefault;
if (yamlMap.containsKey('disable-bg-animation')) {
var value = yamlMap['disable-bg-animation'];
@@ -152,11 +208,13 @@ final appConfigProvider = Provider((ref) {
return AppConfig(
disableBkgAnimation: disableBkgAnimation,
randomHybridAnimation: randomHybridAnimation,
- kuksaConfig: kuksaConfig);
- } on Exception catch (_) {
+ kuksaConfig: kuksaConfig,
+ radioConfig: radioConfig);
+ } catch (_) {
return AppConfig(
disableBkgAnimation: false,
randomHybridAnimation: false,
- kuksaConfig: KuksaConfig.defaultConfig());
+ kuksaConfig: KuksaConfig.defaultConfig(),
+ radioConfig: RadioConfig.defaultConfig());
}
});