Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(android): inject tauri.conf.json asset, add plugin config load API #6837

Merged
merged 2 commits into from May 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changes/android-load-config.md
@@ -0,0 +1,5 @@
---
"tauri": patch
---

Added static function `loadConfig` on the Android `PluginManager` class.
6 changes: 6 additions & 0 deletions .changes/inject-config.md
@@ -0,0 +1,6 @@
---
"cli.rs": patch
"cli.js": patch
---

Inject Tauri configuration in the Android assets.
Expand Up @@ -6,6 +6,7 @@ package app.tauri

import android.content.ContentUris
import android.content.Context
import android.content.res.AssetManager
import android.database.Cursor
import android.net.Uri
import android.os.Environment
Expand All @@ -18,6 +19,12 @@ import kotlin.math.min

internal class FsUtils {
companion object {
fun readAsset(assetManager: AssetManager, fileName: String): String {
assetManager.open(fileName).bufferedReader().use {
return it.readText()
}
}

fun getFileUrlForUri(context: Context, uri: Uri): String? {
// DocumentProvider
if (DocumentsContract.isDocumentUri(context, uri)) {
Expand Down
Expand Up @@ -4,12 +4,14 @@

package app.tauri.plugin

import android.content.Context
import android.content.Intent
import android.webkit.WebView
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import app.tauri.FsUtils
import app.tauri.JniMethod
import app.tauri.Logger

Expand Down Expand Up @@ -123,5 +125,14 @@ class PluginManager(val activity: AppCompatActivity) {
}
}

companion object {
fun loadConfig(context: Context, plugin: String): JSObject {
val tauriConfigJson = FsUtils.readAsset(context.assets, "tauri.conf.json")
val tauriConfig = JSObject(tauriConfigJson)
val plugins = tauriConfig.getJSObject("plugins", JSObject())
return plugins.getJSObject(plugin, JSObject())
}
}

private external fun handlePluginResponse(id: Int, success: String?, error: String?)
}
1 change: 0 additions & 1 deletion core/tauri/mobile/proguard-tauri.pro
@@ -1,6 +1,5 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.


-keep class $PACKAGE.TauriActivity {
public app.tauri.plugin.PluginManager getPluginManager();
}
20 changes: 19 additions & 1 deletion tooling/cli/src/mobile/android.rs
Expand Up @@ -3,7 +3,13 @@
// SPDX-License-Identifier: MIT

use clap::{Parser, Subcommand};
use std::{env::set_var, fs::create_dir, process::exit, thread::sleep, time::Duration};
use std::{
env::set_var,
fs::{create_dir, create_dir_all, write},
process::exit,
thread::sleep,
time::Duration,
};
use sublime_fuzzy::best_match;
use tauri_mobile::{
android::{
Expand Down Expand Up @@ -296,3 +302,15 @@ fn open_and_wait(config: &AndroidConfig, env: &Env) -> ! {
sleep(Duration::from_secs(24 * 60 * 60));
}
}

fn inject_assets(config: &AndroidConfig, tauri_config: &TauriConfig) -> Result<()> {
let asset_dir = config.project_dir().join("app/src/main/assets");
create_dir_all(&asset_dir)?;

write(
asset_dir.join("tauri.conf.json"),
serde_json::to_string(&tauri_config)?,
)?;

Ok(())
}
10 changes: 7 additions & 3 deletions tooling/cli/src/mobile/android/build.rs
Expand Up @@ -3,8 +3,8 @@
// SPDX-License-Identifier: MIT

use super::{
configure_cargo, delete_codegen_vars, ensure_init, env, log_finished, open_and_wait, with_config,
MobileTarget,
configure_cargo, delete_codegen_vars, ensure_init, env, inject_assets, log_finished,
open_and_wait, with_config, MobileTarget,
};
use crate::{
build::Options as BuildOptions,
Expand Down Expand Up @@ -152,14 +152,16 @@ fn run_build(
let out_dir = bin_path.parent().unwrap();
let _lock = flock::open_rw(out_dir.join("lock").with_extension("android"), "Android")?;

let tauri_config = get_config(options.config.as_deref())?;

let cli_options = CliOptions {
features: build_options.features.clone(),
args: build_options.args.clone(),
noise_level,
vars: Default::default(),
};
let _handle = write_options(
&get_config(options.config.as_deref())?
&tauri_config
.lock()
.unwrap()
.as_ref()
Expand All @@ -175,6 +177,8 @@ fn run_build(
.get_or_insert(Vec::new())
.push("custom-protocol".into());

inject_assets(config, tauri_config.lock().unwrap().as_ref().unwrap())?;

let apk_outputs = if options.apk {
apk::build(
config,
Expand Down
10 changes: 7 additions & 3 deletions tooling/cli/src/mobile/android/dev.rs
Expand Up @@ -3,8 +3,8 @@
// SPDX-License-Identifier: MIT

use super::{
configure_cargo, delete_codegen_vars, device_prompt, ensure_init, env, open_and_wait,
setup_dev_config, with_config, MobileTarget,
configure_cargo, delete_codegen_vars, device_prompt, ensure_init, env, inject_assets,
open_and_wait, setup_dev_config, with_config, MobileTarget,
};
use crate::{
dev::Options as DevOptions,
Expand Down Expand Up @@ -186,8 +186,10 @@ fn run_dev(
noise_level,
vars: Default::default(),
};

let tauri_config = get_config(options.config.as_deref())?;
let _handle = write_options(
&get_config(options.config.as_deref())?
&tauri_config
.lock()
.unwrap()
.as_ref()
Expand All @@ -198,6 +200,8 @@ fn run_dev(
cli_options,
)?;

inject_assets(config, tauri_config.lock().unwrap().as_ref().unwrap())?;

if open {
open_and_wait(config, &env)
} else if let Some(device) = &device {
Expand Down
5 changes: 3 additions & 2 deletions tooling/cli/src/mobile/android/open.rs
Expand Up @@ -2,15 +2,16 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

use super::{ensure_init, env, with_config, MobileTarget};
use crate::Result;
use super::{ensure_init, env, inject_assets, with_config, MobileTarget};
use crate::{helpers::config::get as get_config, Result};
use tauri_mobile::os;

pub fn command() -> Result<()> {
with_config(
Some(Default::default()),
|_root_conf, config, _metadata, _cli_options| {
ensure_init(config.project_dir(), MobileTarget::Android)?;
inject_assets(config, get_config(None)?.lock().unwrap().as_ref().unwrap())?;
let env = env()?;
os::open_file_with("Android Studio", config.project_dir(), &env.base).map_err(Into::into)
},
Expand Down
1 change: 1 addition & 0 deletions tooling/cli/templates/mobile/android/app/.gitignore
@@ -1,4 +1,5 @@
/src/main/{{package-path}}/generated
/src/main/jniLibs/**/*.so
/src/main/assets/tauri.conf.json
/tauri.build.gradle.kts
/proguard-tauri.pro