From 994559ea50d4b91d705d83d74b56ee7c1e745603 Mon Sep 17 00:00:00 2001 From: Syed Ahkam Date: Sat, 12 Aug 2023 20:38:26 +0530 Subject: [PATCH] feat: impl the run command Allows you to build the project and launch the main activity --- src/commands/create.rs | 2 +- src/commands/mod.rs | 1 + src/commands/run.rs | 44 ++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 15 ++++++++++++-- src/main.rs | 6 ++++-- 5 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 src/commands/run.rs diff --git a/src/commands/create.rs b/src/commands/create.rs index d951f6a..7bbb465 100644 --- a/src/commands/create.rs +++ b/src/commands/create.rs @@ -88,7 +88,7 @@ fn post_create(args: Create) -> Result<()> { let dest = args.dest.clone().unwrap(); android_cli::create_local_properties_file(&dest, &args.sdk_path.unwrap())?; - android_cli::create_dot_file(&dest, args.package_id.unwrap())?; + android_cli::create_dot_android(&dest, args.package_id.unwrap())?; Ok(()) } diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 27387a3..11a360e 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -1,3 +1,4 @@ pub mod create; pub mod build; pub mod install; +pub mod run; diff --git a/src/commands/run.rs b/src/commands/run.rs new file mode 100644 index 0000000..7aed457 --- /dev/null +++ b/src/commands/run.rs @@ -0,0 +1,44 @@ +use anyhow::{bail, Context, Result, anyhow}; +use clap::{ArgAction, Parser}; + +#[derive(Parser, Debug)] +pub struct Run { + /// Should build in release mode + #[clap(short, long, default_value="false", action = ArgAction::SetTrue)] + release: bool, +} + +pub fn handle(args: Run) -> Result<()> { + // Decide gradle subcommand to use + let build_cmd = match args.release { + true => "assembleRelease", + false => "assembleDebug", + }; + + // Trigger a build + let build_status = + android_cli::invoke_gradle_command(build_cmd).context("failed to invoke gradle command")?; + + if !build_status.success() { + bail!("failed to build project"); + } + + // Fetch and deserialize .android + let dot_android = android_cli::get_dot_android().ok_or_else(|| anyhow!(".android not found, can't launch activity"))?; + + // Try to launch MainActivity using ADB + let run_status = android_cli::invoke_adb_command(&[ + "shell", + "am", + "start", + "-n", + &format!("{}/.{}", dot_android.package_id, dot_android.main_activity_name) + ]) + .context("failed to invoke adb command")?; + + if !run_status.success() { + bail!("failed to run the APK"); + } + + Ok(()) +} diff --git a/src/lib.rs b/src/lib.rs index f5903ee..196fd97 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,11 +19,13 @@ const DEFAULT_TEMPLATE_REPO: &str = "https://github.com/SyedAhkam/android-cli-te const TEMPLATE_REV: &str = "master"; const DOTFILE_COMMENT: &str = "// DO NOT MODIFY; Generated by Android CLI for internal usage.\n"; +const DEFAULT_MAIN_ACTIVITY: &str = "MainActivity"; #[derive(Debug, Serialize, Deserialize)] -struct DotAndroid { +pub struct DotAndroid { pub package_id: String, pub gen_at_version: String, + pub main_activity_name: String } pub fn copy_template(dest: &Path, vars: BTreeMap) -> Result<()> { @@ -80,11 +82,12 @@ pub fn invoke_adb_command(args: &[&str]) -> Result { Ok(run.status()?) } -pub fn create_dot_file(dest: &Path, package_id: String) -> Result<()> { +pub fn create_dot_android(dest: &Path, package_id: String) -> Result<()> { // Construct the structure let dot_android = DotAndroid { package_id, gen_at_version: VERSION.to_owned(), + main_activity_name: DEFAULT_MAIN_ACTIVITY.to_owned() }; // Serialize into Ron @@ -100,3 +103,11 @@ pub fn create_dot_file(dest: &Path, package_id: String) -> Result<()> { Ok(()) } + +pub fn get_dot_android() -> Option { + if let Ok(contents) = std::fs::read_to_string(".android") { + return ron::from_str::(&contents).ok(); + }; + + None +} diff --git a/src/main.rs b/src/main.rs index 0f3bba1..c714064 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,8 @@ struct Cli { enum SubCommand { Create(commands::create::Create), Build(commands::build::Build), - Install(commands::install::Install) + Install(commands::install::Install), + Run(commands::run::Run) } fn main() { @@ -29,7 +30,8 @@ fn main() { let result = match args.command { SubCommand::Create(args) => commands::create::handle(args), SubCommand::Build(args) => commands::build::handle(args), - SubCommand::Install(args) => commands::install::handle(args) + SubCommand::Install(args) => commands::install::handle(args), + SubCommand::Run(args) => commands::run::handle(args) }; if result.is_err() {