Working commit with old app name

This commit is contained in:
2023-12-16 18:52:52 +01:00
parent bdf78b6ae7
commit 4b79b3bc51
57 changed files with 1535 additions and 93 deletions

1
app/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

49
app/build.gradle.kts Normal file
View File

@@ -0,0 +1,49 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "org.eu.octt.smswordpress"
compileSdk = 33
defaultConfig {
applicationId = "org.eu.octt.smswordpress"
minSdk = 16
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
viewBinding = true
}
}
dependencies {
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.8.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.navigation:navigation-fragment-ktx:2.5.3")
implementation("androidx.navigation:navigation-ui-ktx:2.5.3")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}

21
app/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,24 @@
package org.eu.octt.smswordpress
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("org.eu.octt.smswordpress", appContext.packageName)
}
}

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-feature android:name="android.hardware.telephony" android:required="false" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ShortWordPressService"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/title_activity_main"
android:theme="@style/Theme.ShortWordPressService">
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="org.eu.octt.smswordpress.SmsBroadcastReceiver" android:enabled="true"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>

View File

@@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<script src="./index.js"></script>
</head>
<body>
<p id="log">Ready.</p>
</body>
</html>

View File

@@ -0,0 +1,42 @@
//Android.ReadSharedPref = function(args){
// return JSON.parse(
// //decodeURIComponent(
// Android.ReadSharedPrefJSI(
// args.key, JSON.stringify({ value: args.default })
// )
// //)
// ).value;
//};
Android.ReadSharedPref = function(key, fallback){
return JSON.parse(
Android.ReadSharedPrefJSI(
key, JSON.stringify({ value: fallback })
)
).value;
};
Android.WriteSharedPref = function(key, value){
Android.WriteSharedPrefJSI(
key, JSON.stringify({ value: value })
);
};
//Android.Callback = function(){};
//Android.SmsQueue = [];
Android.onEvent = function(event){};
Android.onSmsReceived = function(message, sender){};
window.onload = function(){
try {
//var script = document.createElement('script');
//script.innerHTML = Android.ReadSharedPref({ key: "editScript", default: "" });
//document.head.appendChild(script);
eval( /*' try { ' +*/ Android.ReadSharedPref("editScript", "") /*+ ' } catch(er) { Android.Toast(er, null); }; '*/ );
//document.body.innerHTML += JSON.stringify(Android.ReadSharedPref({ key: "editScript", default: "" }));
} catch(e) {
document.body.querySelector('p#log').innerHTML += '<br/>' + e;
}
};

View File

@@ -0,0 +1,239 @@
package org.eu.octt.smswordpress
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.text.method.ScrollingMovementMethod
import android.util.Log
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
import java.net.URLEncoder
import java.util.Objects
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
//fun messageReceived(message: String) {
// Toast.makeText(this, "New Message Received: " + message, Toast.LENGTH_SHORT).show()
//}
@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()
//SmsBroadcastReceiver.bindListener(this)
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())
editScript!!.setText(ReadSharedPref("editScript", "").toString())//sharedPrefs!!.getString("editScript", ""))
//webview!!.setWebViewClient(WebViewClient())
webview!!.settings.javaScriptEnabled = true
webview!!.addJavascriptInterface(this, "Android")
reloadWebview()
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()
Toast.makeText(context, sender+" "+message+" ", Toast.LENGTH_SHORT).show()
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 -> {
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 -> {
editScript!!.setText(ReadSharedPref("editScript", "").toString())//sharedPrefs!!.getString("editScript", ""))
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 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!!.stopLoading()
//webview!!.loadUrl("about:blank")
//webview!!.loadUrl("data:text/html;utf8,<!DOCTYPE html><html><head><script> Android.ReadSharedPref = function(args){ return JSON.parse(Android.ReadSharedPrefJSI(args.key, JSON.stringify({ value: args.default }))).value }; Android.Callback = function(){}; Android.SmsQueue = []; } </script></head><body><p>Ready.</p><script>${editScript!!.text}</script></body></html>")
webview!!.loadUrl("file:///android_asset/index.html")
//execJavascript("window.onload = function(){ ${editScript!!.text} };")
//execJavascript("window.onload=function(){document.body.innerHTML=1}")
}
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 dummy(obj: JSONObject?) {
}
@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) {
//Log.i("URLENC", """{ "value": "${URLEncoder.encode(entry.value.toString(), "utf-8")}" }""".replace("+", "%20") )
//return """{ "value": "${URLEncoder.encode(entry.value.toString(), "utf-8")}" }""".replace("+", "%20")
val jsonValue = entry.value.toString().replace("\"", "\\\"").replace("\n", "\\n")
//Log.i("URLENC", """{ "value": "${jsonValue}" }""")
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()
var value = JSONObject(jsonValue).getString("value")
//when (value) {
// is String ->
sharedPrefsEditor!!.putString(key, value)
//}
sharedPrefsEditor!!.apply()
}
}

View File

@@ -0,0 +1,50 @@
package org.eu.octt.smswordpress
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.widget.Toast
import android.telephony.SmsMessage
//import org.eu.octt.smswordpress.MyApplication
// <https://stackoverflow.com/questions/11435354/receiving-sms-on-android-app>
class SmsBroadcastReceiver : BroadcastReceiver() {
//var smsListener: SmsEventListener? = null
override fun onReceive(p0: Context?, p1: Intent?) {
// implemented in MainActivity
}
// 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()
// //Toast.makeText(context, sender+" "+message+" ", Toast.LENGTH_SHORT).show()
// //smsListener!!.messageReceived(message)
// // prevent any other broadcast receivers from receiving broadcast
// // abortBroadcast();
// }
// }
// }
//fun bindListener(listener: SmsEventListener){
// smsListener = listener;
//}
}

View File

@@ -0,0 +1,8 @@
package org.eu.octt.smswordpress
//open class SmsEventListener {
// fun messageReceived(message: String) = null
// companion object {
// fun messageReceived(message: String) = null
// }
//}

View File

@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/layout_configuration"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--
<Space
android:layout_width="wrap_content"
android:layout_height="15dp"/>
<Switch
android:id="@+id/switch_sensitiveinfo"
android:text="Show Sensitive Information"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
-->
<!--<Space
android:layout_width="wrap_content"
android:layout_height="15dp"/>-->
<TextView
android:text="JavaScript"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edit_script"
android:hint="document.body.style.background = 'gray';"
android:gravity="top"
android:inputType="textMultiLine|textNoSuggestions"
android:typeface="monospace"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!--
<Space
android:layout_width="wrap_content"
android:layout_height="15dp"/>
<TextView
android:text="WordPress Site URL"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edit_website_url"
android:singleLine="true"
android:hint="https://blog.example.com"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Space
android:layout_width="wrap_content"
android:layout_height="15dp"/>
<TextView
android:text="WordPress Session Cookies"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edit_cookies"
android:singleLine="true"
android:hint="wordpress_sec_...=...; wordpress_logged_in_...=..."
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Space
android:layout_width="wrap_content"
android:layout_height="15dp"/>
<TextView
android:text="Allowed SMS Phone Numbers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edit_allowed_phone_numbers"
android:singleLine="true"
android:inputType="phone"
android:hint="1234567890 +11234567890"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Space
android:layout_width="wrap_content"
android:layout_height="15dp"/>
<TextView
android:text="Optional SMS Verification Password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edit_message_password"
android:singleLine="true"
android:hint="hunter2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"/>
-->
</LinearLayout>
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!--
<TextView
android:id="@+id/label_log"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
-->
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,21 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/button_configuration_open"
android:title="Configuration"
app:showAsAction="never" />
<item
android:id="@+id/button_configuration_save"
android:title="Save"
app:showAsAction="never" />
<item
android:id="@+id/button_configuration_cancel"
android:title="Cancel"
app:showAsAction="never" />
<!-- <item
android:id="@+id/button_clearlog"
android:title="Clear Log"
app:showAsAction="never" /> -->
</menu>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/FirstFragment">
<fragment
android:id="@+id/FirstFragment"
android:name="org.eu.octt.smswordpress.FirstFragment"
android:label="@string/first_fragment_label"
tools:layout="@layout/fragment_first">
<action
android:id="@+id/action_FirstFragment_to_SecondFragment"
app:destination="@id/SecondFragment" />
</fragment>
<fragment
android:id="@+id/SecondFragment"
android:name="org.eu.octt.smswordpress.SecondFragment"
android:label="@string/second_fragment_label"
tools:layout="@layout/fragment_second">
<action
android:id="@+id/action_SecondFragment_to_FirstFragment"
app:destination="@id/FirstFragment" />
</fragment>
</navigation>

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">48dp</dimen>
</resources>

View File

@@ -0,0 +1,21 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.ShortWordPressService" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="21">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
<!-- Base application theme. -->
<style name="Base.Theme.ShortWordPressService" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your dark theme here. -->
<!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
</style>
</resources>

View File

@@ -0,0 +1,9 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.ShortWordPressService" parent="Base.Theme.ShortWordPressService">
<!-- Transparent system bars for edge-to-edge. -->
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar">?attr/isLightTheme</item>
</style>
</resources>

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">200dp</dimen>
</resources>

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">48dp</dimen>
</resources>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">16dp</dimen>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable name="ic_settings" />
</resources>

View File

@@ -0,0 +1,46 @@
<resources>
<string name="app_name">Short WordPress Service</string>
<string name="title_activity_main">MainActivity</string>
<!-- Strings used for fragments for navigation -->
<string name="first_fragment_label">First Fragment</string>
<string name="second_fragment_label">Second Fragment</string>
<string name="next">Next</string>
<string name="previous">Previous</string>
<string name="lorem_ipsum">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris
volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus
dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad
litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend
diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a,
ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.\n\n
Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus
egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed
neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada
fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae,
molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor
bibendum, vel congue leo egestas.\n\n
Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit
amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel,
molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer
interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at
lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula,
in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque
est.\n\n
Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh.
Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui
non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In
eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc,
quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra
ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a
placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus
convallis.\n\n
Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa
gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper,
libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper
sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus
libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus
vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
</string>
</resources>

View File

@@ -0,0 +1,21 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.ShortWordPressService" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="21">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
<!-- Base application theme. -->
<style name="Base.Theme.ShortWordPressService" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style>
</resources>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older that API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>

View File

@@ -0,0 +1,17 @@
package org.eu.octt.smswordpress
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}