222 lines
9.4 KiB
Kotlin
222 lines
9.4 KiB
Kotlin
package org.eu.octt.droidscriptin
|
|
|
|
import android.annotation.SuppressLint
|
|
import android.content.BroadcastReceiver
|
|
import android.content.Context
|
|
import android.content.Intent
|
|
import android.content.IntentFilter
|
|
import android.content.SharedPreferences
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
import android.os.Bundle
|
|
import android.telephony.SmsMessage
|
|
import android.view.Menu
|
|
import android.view.MenuItem
|
|
import android.view.View
|
|
import android.view.Window
|
|
import android.webkit.JavascriptInterface
|
|
import android.webkit.WebView
|
|
import android.widget.EditText
|
|
import android.widget.LinearLayout
|
|
import android.widget.TextView
|
|
import android.widget.Toast
|
|
import org.json.JSONObject
|
|
|
|
class MainActivity : AppCompatActivity() {
|
|
private var buttonConfigurationOpen: MenuItem? = null
|
|
private var buttonConfigurationSave: MenuItem? = null
|
|
private var buttonConfigurationCancel: MenuItem? = null
|
|
//private var buttonClearlog: MenuItem? = null
|
|
private var webview: WebView? = null
|
|
private var labelLog: TextView? = null
|
|
private var layoutConfiguration: LinearLayout? = null
|
|
private var editScript: EditText? = null
|
|
private var sharedPrefs: SharedPreferences? = null
|
|
private var sharedPrefsEditor: SharedPreferences.Editor? = null
|
|
|
|
@SuppressLint("JavascriptInterface")
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
window.requestFeature(Window.FEATURE_ACTION_BAR)
|
|
setContentView(R.layout.activity_main)
|
|
sharedPrefs = getSharedPreferences("Prefs", 0)
|
|
sharedPrefsEditor = sharedPrefs!!.edit()
|
|
webview = this.findViewById(R.id.webview)
|
|
//labelLog = this.findViewById(R.id.label_log)
|
|
layoutConfiguration = this.findViewById(R.id.layout_configuration)
|
|
editScript = this.findViewById(R.id.edit_script)
|
|
//editScript!!.setMovementMethod(ScrollingMovementMethod())
|
|
reloadConfiguration()
|
|
//webview!!.setWebViewClient(WebViewClient())
|
|
webview!!.settings.javaScriptEnabled = true
|
|
webview!!.addJavascriptInterface(this, "Android")
|
|
reloadWebview()
|
|
|
|
// <https://stackoverflow.com/questions/11435354/receiving-sms-on-android-app>
|
|
val messageReceiver = object: BroadcastReceiver() {
|
|
override fun onReceive(context: Context, intent: Intent) {
|
|
val sharedPrefs: SharedPreferences = context.getSharedPreferences("Prefs", 0)
|
|
if (intent.action == "android.provider.Telephony.SMS_RECEIVED") {
|
|
val bundle = intent.extras
|
|
if (bundle != null) {
|
|
// get sms objects
|
|
val pdus = bundle["pdus"] as Array<Any>?
|
|
if (pdus!!.size == 0) {
|
|
return
|
|
}
|
|
// large message might be broken into many
|
|
val messages: Array<SmsMessage?> = arrayOfNulls<SmsMessage>(pdus.size)
|
|
val sb = StringBuilder()
|
|
for (i in pdus.indices) {
|
|
messages[i] = SmsMessage.createFromPdu(pdus[i] as ByteArray)
|
|
sb.append(messages[i]!!.getMessageBody())
|
|
}
|
|
val sender: String? = messages[0]!!.getOriginatingAddress()
|
|
val message = sb.toString()
|
|
execJavascript(" Android.onEvent('android.provider.Telephony.SMS_RECEIVED'); Android.onSmsReceived('${message}', '${sender}'); ")
|
|
//execJavascript("Android.SmsQueue.push({ sender: '${sender}', message: '${message}' }); Android.Callback('android.provider.Telephony.SMS_RECEIVED');")
|
|
//execJavascript("Android.SmsQueue.push({ sender: 1, message: 2 ); Android.Callback('android.provider.Telephony.SMS_RECEIVED')")
|
|
//smsListener!!.messageReceived(message)
|
|
// prevent any other broadcast receivers from receiving broadcast
|
|
// abortBroadcast();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this.registerReceiver(messageReceiver, IntentFilter("android.provider.Telephony.SMS_RECEIVED"))
|
|
}
|
|
|
|
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
|
|
menuInflater.inflate(R.menu.menu_main, menu!!)
|
|
buttonConfigurationOpen = menu.findItem(R.id.button_configuration_open)
|
|
buttonConfigurationSave = menu.findItem(R.id.button_configuration_save)
|
|
buttonConfigurationCancel = menu.findItem(R.id.button_configuration_cancel)
|
|
//buttonClearlog = menu.findItem(R.id.button_clearlog)
|
|
setConfigurationView(false)
|
|
return true
|
|
}
|
|
|
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
|
when (item.itemId) {
|
|
R.id.button_configuration_open -> {
|
|
reloadConfiguration()
|
|
setConfigurationView(true)
|
|
}
|
|
R.id.button_configuration_save -> {
|
|
//sharedPrefsEditor!!.putString("editScript", editScript!!.text.toString())
|
|
WriteSharedPref("editScript", editScript!!.text.toString())
|
|
//sharedPrefsEditor!!.apply()
|
|
setConfigurationView(false)
|
|
reloadWebview()
|
|
}
|
|
R.id.button_configuration_cancel -> {
|
|
reloadConfiguration()
|
|
setConfigurationView(false)
|
|
}
|
|
//R.id.button_clearlog -> {
|
|
//sharedPrefsEditor!!.putString("Log", "")
|
|
// setConfigurationView(false)
|
|
//val url = new URL("https://example.com")
|
|
//val con = url.openConnection()
|
|
//con.setRequestMethod("GET")
|
|
//con.setRequestProperty("Cookie", "")
|
|
//var os = con.getOutputStream()
|
|
//os.write(input, 0, input.length)
|
|
//thread {
|
|
// Looper.prepare()
|
|
// val connection = URL("https://example.com").openConnection() as HttpURLConnection
|
|
// val data = connection.inputStream.bufferedReader().readText()
|
|
// runOnUiThread { Toast.makeText(applicationContext, data, Toast.LENGTH_SHORT).show() }
|
|
//}
|
|
//}
|
|
}
|
|
return super.onOptionsItemSelected(item)
|
|
}
|
|
|
|
private fun showHideView(view: View) {
|
|
view.visibility = (if (view.visibility == View.VISIBLE) View.INVISIBLE else View.VISIBLE)
|
|
}
|
|
|
|
private fun setViewVisibility(view: View, status: Boolean) {
|
|
view.visibility = (if (status) View.VISIBLE else View.INVISIBLE)
|
|
}
|
|
|
|
private fun reloadConfiguration() {
|
|
editScript!!.setText(ReadSharedPref("editScript", "").toString())//sharedPrefs!!.getString("editScript", ""))
|
|
}
|
|
|
|
private fun setConfigurationView(status: Boolean) {
|
|
buttonConfigurationOpen!!.isVisible = !status
|
|
buttonConfigurationSave!!.isVisible = status
|
|
buttonConfigurationCancel!!.isVisible = status
|
|
//buttonClearlog!!.isVisible = status
|
|
setViewVisibility(webview!!, !status)
|
|
//setViewVisibility(labelLog!!, !status)
|
|
setViewVisibility(layoutConfiguration!!, status)
|
|
setTitle(if (status) "Configuration" else "WebView")
|
|
}
|
|
|
|
private fun reloadWebview() {
|
|
webview!!.loadUrl("file:///android_asset/index.html")
|
|
}
|
|
|
|
fun execJavascript(text: String) {
|
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
|
|
webview!!.evaluateJavascript("(function(){${text}})();", null)
|
|
} else {
|
|
webview!!.loadUrl("javascript:(function(){${text}})();")
|
|
}
|
|
}
|
|
|
|
@JavascriptInterface
|
|
fun Toast(text: String, length: Int?) {
|
|
Toast.makeText(this, text, (length ?: Toast.LENGTH_LONG)).show()
|
|
}
|
|
|
|
private fun ReadSharedPref(key: String, default: Any): Any? {
|
|
val keys = sharedPrefs!!.all
|
|
for (entry in keys) {
|
|
if (entry.key == key) {
|
|
return entry.value
|
|
}
|
|
}
|
|
return default
|
|
}
|
|
|
|
// TODO: Actually handle non-strings
|
|
@JavascriptInterface
|
|
fun ReadSharedPrefJSI(key: String, fallback: String): String? {
|
|
sharedPrefs = getSharedPreferences("Prefs", 0)
|
|
val keys = sharedPrefs!!.all
|
|
for (entry in keys) {
|
|
if (entry.key == key) {
|
|
val jsonValue = entry.value.toString().replace("\"", "\\\"").replace("\n", "\\n")
|
|
return """{ "value": "${jsonValue}" }"""
|
|
}
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
private fun WriteSharedPref(key: String, value: Any) {
|
|
when (value) {
|
|
is String -> sharedPrefsEditor!!.putString(key, value)
|
|
is Boolean -> sharedPrefsEditor!!.putBoolean(key, value)
|
|
is Int -> sharedPrefsEditor!!.putInt(key, value)
|
|
is Float -> sharedPrefsEditor!!.putFloat(key, value)
|
|
is Long -> sharedPrefsEditor!!.putLong(key, value)
|
|
}
|
|
sharedPrefsEditor!!.apply()
|
|
}
|
|
|
|
// TODO: Actually handle non-strings
|
|
@JavascriptInterface
|
|
fun WriteSharedPrefJSI(key: String, jsonValue: String) {
|
|
sharedPrefs = getSharedPreferences("Prefs", 0)
|
|
sharedPrefsEditor = sharedPrefs!!.edit()
|
|
val value = JSONObject(jsonValue).getString("value")
|
|
//when (value) {
|
|
// is String ->
|
|
sharedPrefsEditor!!.putString(key, value)
|
|
//}
|
|
sharedPrefsEditor!!.apply()
|
|
}
|
|
} |