notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 3c79724a81374a5e93f8b1d255b234916d6b8c30
parent 36c0971fd95bdab33ab1e410c6627a565034a4f1
Author: William Casarin <jb55@jb55.com>
Date:   Mon, 16 Sep 2024 15:24:14 -0700

Merge 'Read android args from config file on device' #298

Ken Sedgwick (1):
      Read android args from config file on device

Diffstat:
Msrc/lib.rs | 80++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 73 insertions(+), 7 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs @@ -70,11 +70,66 @@ pub async fn android_main(app: AndroidApp) { let path = app.internal_data_path().expect("data path"); let mut options = eframe::NativeOptions::default(); options.renderer = eframe::Renderer::Wgpu; + // Clone `app` to use it both in the closure and later in the function + let app_clone_for_event_loop = app.clone(); options.event_loop_builder = Some(Box::new(move |builder| { - builder.with_android_app(app); + builder.with_android_app(app_clone_for_event_loop); })); - let args = vec![ + let app_args = get_app_args(app); + + let _res = eframe::run_native( + "Damus NoteDeck", + options, + Box::new(move |cc| Ok(Box::new(Damus::new(cc, path, app_args)))), + ); +} + +#[cfg(target_os = "android")] +use serde_json::Value; +#[cfg(target_os = "android")] +use std::fs; +#[cfg(target_os = "android")] +use std::path::PathBuf; + +/* +Read args from a config file: +- allows use of more interesting args w/o risk of checking them in by mistake +- allows use of different args w/o rebuilding the app +- uses compiled in defaults if config file missing or broken + +Example android-config.json: +``` +{ + "args": [ + "--npub", + "npub1h50pnxqw9jg7dhr906fvy4mze2yzawf895jhnc3p7qmljdugm6gsrurqev", + "-c", + "contacts", + "-c", + "notifications" + ] +} +``` + +Install/update android-config.json with: +``` +adb push android-config.json /sdcard/Android/data/com.damus.app/files/android-config.json +``` + +Using internal storage would be better but it seems hard to get the config file onto +the device ... +*/ + +#[cfg(target_os = "android")] +fn get_app_args(app: AndroidApp) -> Vec<String> { + let external_data_path: PathBuf = app + .external_data_path() + .expect("external data path") + .to_path_buf(); + let config_file = external_data_path.join("android-config.json"); + + let default_args = vec![ "--pub", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245", "-c", @@ -88,9 +143,20 @@ pub async fn android_main(app: AndroidApp) { .map(|s| s.to_string()) .collect(); - let _res = eframe::run_native( - "Damus NoteDeck", - options, - Box::new(move |cc| Ok(Box::new(Damus::new(cc, path, args)))), - ); + if config_file.exists() { + if let Ok(config_contents) = fs::read_to_string(config_file) { + if let Ok(json) = serde_json::from_str::<Value>(&config_contents) { + if let Some(args_array) = json.get("args").and_then(|v| v.as_array()) { + let config_args = args_array + .iter() + .filter_map(|v| v.as_str().map(String::from)) + .collect(); + + return config_args; + } + } + } + } + + default_args // Return the default args if config is missing or invalid }