From 30d4e3a5b091e5619d25075ac73d3ac8ebc90eab Mon Sep 17 00:00:00 2001 From: Dominic Letz Date: Fri, 17 Sep 2021 12:05:13 +0200 Subject: [PATCH] Improved navigation & startup time --- .gitignore | 3 +- app/build.gradle | 5 ++ app/proguard-rules.pro | 14 +++++- app/src/main/AndroidManifest.xml | 17 +++++-- app/src/main/cpp/native-lib.cpp | 6 +-- .../java/io/elixirdesktop/example/Bridge.kt | 47 +++++++++++++++++++ .../io/elixirdesktop/example/MainActivity.kt | 21 ++++++++- app/src/main/res/xml/provider_paths.xml | 4 ++ 8 files changed, 107 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/xml/provider_paths.xml diff --git a/.gitignore b/.gitignore index 9f2c308..42539e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.iml .gradle +/app/release /local.properties /.idea/caches /.idea/libraries @@ -15,4 +16,4 @@ local.properties /app/elixir-app /app/src/main/assets/app.zip -/app/src/main/assets/app.zip.xz \ No newline at end of file +/app/src/main/assets/app.zip.xz diff --git a/app/build.gradle b/app/build.gradle index 2b9b16b..be5f055 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,6 +57,11 @@ android { buildFeatures { viewBinding true } + packagingOptions { + jniLibs { + useLegacyPackaging = true + } + } } dependencies { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb43..17745d0 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,16 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +-dontskipnonpubliclibraryclasses +-dontobfuscate +-forceprocessing +-optimizationpasses 5 + +-keep class * extends android.app.Activity +-assumenosideeffects class android.util.Log { + public static *** d(...); + public static *** v(...); +} + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e4f316d..7f06f36 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + package="io.elixirdesktop.example" + android:installLocation="internalOnly"> @@ -13,6 +14,17 @@ android:supportsRtl="true" android:theme="@style/Theme.Default" android:extractNativeLibs="true"> + + + + + @@ -20,5 +32,4 @@ - - \ No newline at end of file + diff --git a/app/src/main/cpp/native-lib.cpp b/app/src/main/cpp/native-lib.cpp index edf61f5..db989c0 100644 --- a/app/src/main/cpp/native-lib.cpp +++ b/app/src/main/cpp/native-lib.cpp @@ -110,8 +110,8 @@ const char* startErlang(std::string root_dir, std::string log_dir) "enabled", "--", // "-heart", - "-pa", - update_dir.c_str(), + // "-pa", + // update_dir.c_str(), "-start_epmd", "false", //"-kernel", @@ -125,7 +125,7 @@ const char* startErlang(std::string root_dir, std::string log_dir) "elixir", "start_cli", "-mode", - "embedded", + "interactive", "-config", config_path.c_str(), "-boot", diff --git a/app/src/main/java/io/elixirdesktop/example/Bridge.kt b/app/src/main/java/io/elixirdesktop/example/Bridge.kt index 5a2ed20..f9d1c50 100644 --- a/app/src/main/java/io/elixirdesktop/example/Bridge.kt +++ b/app/src/main/java/io/elixirdesktop/example/Bridge.kt @@ -1,5 +1,6 @@ package io.elixirdesktop.example +import android.content.ActivityNotFoundException import android.content.Context import android.os.Build import android.system.Os @@ -12,8 +13,18 @@ import java.net.ServerSocket import java.net.Socket import kotlin.concurrent.thread import java.io.* +import java.net.URI import java.util.* import java.util.zip.ZipInputStream +import androidx.core.content.ContextCompat.startActivity + +import android.content.Intent +import android.net.Uri +import androidx.core.content.ContextCompat + +import androidx.core.content.FileProvider +import androidx.core.content.ContextCompat.startActivity +import io.elixirdesktop.example.MainActivity class Bridge(private val applicationContext : Context, private var webview : WebView) { @@ -225,6 +236,15 @@ class Bridge(private val applicationContext : Context, private var webview : Web lastURL = args.getString(1) webview.post { webview.loadUrl(lastURL) } } + if (method == ":launchDefaultBrowser") { + val uri = Uri.parse(args.getString(0)) + if (uri.scheme == "http") { + val browserIntent = Intent(Intent.ACTION_VIEW, uri) + applicationContext.startActivity(browserIntent) + } else if (uri.scheme == "file") { + openFile(uri.path) + } + } var response = ref response += if (method == ":getOsDescription") { @@ -253,6 +273,33 @@ class Bridge(private val applicationContext : Context, private var webview : Web } } + fun openFile(filename: String?) { + // Get URI and MIME type of file + val file = File(filename) + val uri = + FileProvider.getUriForFile(applicationContext, applicationContext.packageName + ".fileprovider", File(filename)) + + val mime: String? = if (file.isDirectory) { + "resource/folder" + } else { + applicationContext.contentResolver.getType(uri) + } + + // Open file with user selected app + var intent = Intent() + intent.action = Intent.ACTION_VIEW + intent.setDataAndType(uri, mime) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + intent = Intent.createChooser(intent, "") + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + try { + applicationContext.startActivity(intent) + } catch (e : ActivityNotFoundException) { + Log.d("Exception", e.toString()) + } + } + private fun stringToList(str : String): String { val numbers = str.toByteArray().map { it.toInt().toString() } return "[${numbers.joinToString(",")}]" diff --git a/app/src/main/java/io/elixirdesktop/example/MainActivity.kt b/app/src/main/java/io/elixirdesktop/example/MainActivity.kt index f18c3ca..eca1447 100644 --- a/app/src/main/java/io/elixirdesktop/example/MainActivity.kt +++ b/app/src/main/java/io/elixirdesktop/example/MainActivity.kt @@ -2,7 +2,8 @@ package io.elixirdesktop.example import android.app.Activity import android.os.Bundle -import android.util.Base64 +import android.system.Os +import android.view.KeyEvent import android.view.View import io.elixirdesktop.example.databinding.ActivityMainBinding import java.io.* @@ -40,7 +41,23 @@ class MainActivity : Activity() { } } + override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { + if (event.action == KeyEvent.ACTION_DOWN) { + when (keyCode) { + KeyEvent.KEYCODE_BACK -> { + if (binding.browser.canGoBack()) { + binding.browser.goBack() + } else { + finish() + } + return true + } + } + } + return super.onKeyDown(keyCode, event) + } + companion object { var bridge: Bridge? = null } -} \ No newline at end of file +} diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml new file mode 100644 index 0000000..d0235c7 --- /dev/null +++ b/app/src/main/res/xml/provider_paths.xml @@ -0,0 +1,4 @@ + + + +