aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/dev/tablaster
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/dev/tablaster')
-rw-r--r--app/src/main/java/dev/tablaster/dashpanel/BootUpReceiver.kt21
-rw-r--r--app/src/main/java/dev/tablaster/dashpanel/MainActivity.kt102
-rw-r--r--app/src/main/java/dev/tablaster/dashpanel/PassCodeFragment.kt28
-rw-r--r--app/src/main/java/dev/tablaster/dashpanel/SettingsActivity.kt25
-rw-r--r--app/src/main/java/dev/tablaster/dashpanel/SettingsFragment.kt25
-rw-r--r--app/src/main/java/dev/tablaster/dashpanel/SettingsPassCodeFragment.kt61
6 files changed, 262 insertions, 0 deletions
diff --git a/app/src/main/java/dev/tablaster/dashpanel/BootUpReceiver.kt b/app/src/main/java/dev/tablaster/dashpanel/BootUpReceiver.kt
new file mode 100644
index 0000000..684194a
--- /dev/null
+++ b/app/src/main/java/dev/tablaster/dashpanel/BootUpReceiver.kt
@@ -0,0 +1,21 @@
+package dev.tablaster.dashpanel
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import androidx.preference.PreferenceManager
+
+class BootUpReceiver : BroadcastReceiver() {
+
+ override fun onReceive(context: Context, intent: Intent) {
+ if (Intent.ACTION_BOOT_COMPLETED == intent.action) {
+ val sharedPref = PreferenceManager.getDefaultSharedPreferences(context.applicationContext)
+ val startOnBootPref = sharedPref.getBoolean("start_on_boot", false)
+ if (startOnBootPref) {
+ val i = Intent(context, MainActivity::class.java)
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ context.startActivity(i)
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/dev/tablaster/dashpanel/MainActivity.kt b/app/src/main/java/dev/tablaster/dashpanel/MainActivity.kt
new file mode 100644
index 0000000..3857280
--- /dev/null
+++ b/app/src/main/java/dev/tablaster/dashpanel/MainActivity.kt
@@ -0,0 +1,102 @@
+package dev.tablaster.dashpanel
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import android.util.Log
+import android.view.WindowManager
+import android.webkit.WebChromeClient
+import android.webkit.WebSettings
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import android.widget.Toast
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.WindowInsetsControllerCompat
+import androidx.preference.PreferenceManager
+
+import com.google.android.material.floatingactionbutton.FloatingActionButton
+
+class MainActivity : AppCompatActivity() {
+ private lateinit var webView: WebView
+ private lateinit var settingsButton: FloatingActionButton
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
+ setupScreen()
+ setContentView(R.layout.activity_main)
+ val url = sharedPref.getString("dashboard_url", "")
+ val settingsPassCodePref = sharedPref.getInt("settings_passcode", 0)
+ settingsButton = findViewById(R.id.settings_button)
+ settingsButton.setOnClickListener { openSettings(settingsPassCodePref) }
+ if (url != null) {
+ setupWebView(url)
+ }
+ }
+
+ override fun onWindowFocusChanged(hasFocus: Boolean) {
+ super.onWindowFocusChanged(hasFocus)
+ if (hasFocus) {
+ setupScreen()
+ }
+ }
+
+ @SuppressLint("SetJavaScriptEnabled")
+ private fun setupWebView(url: String) {
+ if (url != "") {
+ webView = findViewById(R.id.webview)
+ val webSettings = webView.settings
+ webSettings.javaScriptEnabled = true
+ webSettings.domStorageEnabled = true
+ webSettings.javaScriptCanOpenWindowsAutomatically = true
+ webSettings.cacheMode = WebSettings.LOAD_NO_CACHE
+ webSettings.allowContentAccess = true
+ webSettings.allowFileAccess = true
+ webSettings.setSupportZoom(true)
+ webSettings.loadWithOverviewMode = true
+ webSettings.useWideViewPort = true
+ webSettings.mediaPlaybackRequiresUserGesture = false
+ webView.webViewClient = WebViewClient()
+ webView.webChromeClient = WebChromeClient()
+ webView.loadUrl(url)
+ } else {
+ openSettings(0)
+ }
+ }
+
+ private fun openSettings(settingsPassCodePreference: Int) {
+ if (settingsPassCodePreference != 0) {
+ val passCodeDialog = PassCodeFragment { enteredCode ->
+ if (enteredCode == settingsPassCodePreference) {
+ startActivity(Intent(this, SettingsActivity::class.java))
+ } else {
+ Toast.makeText(this, "Incorrect passcode", Toast.LENGTH_SHORT).show()
+ }
+ }
+ passCodeDialog.show(supportFragmentManager, "SettingsPassCode")
+ } else {
+ startActivity(Intent(this, SettingsActivity::class.java))
+ }
+ }
+
+ private fun setupScreen() {
+ val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
+ val fullScreenPref = sharedPref.getBoolean("full_screen", false)
+ val screenOnPref = sharedPref.getBoolean("screen_on", false)
+
+ if (fullScreenPref) {
+ enableEdgeToEdge()
+ val windowInsetsController =
+ WindowCompat.getInsetsController(window, window.decorView)
+ windowInsetsController.systemBarsBehavior =
+ WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
+ windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
+ }
+
+ if (screenOnPref) {
+ window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
+ }
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/dev/tablaster/dashpanel/PassCodeFragment.kt b/app/src/main/java/dev/tablaster/dashpanel/PassCodeFragment.kt
new file mode 100644
index 0000000..e62dcf4
--- /dev/null
+++ b/app/src/main/java/dev/tablaster/dashpanel/PassCodeFragment.kt
@@ -0,0 +1,28 @@
+package dev.tablaster.dashpanel
+
+import android.app.Dialog
+import android.os.Bundle
+import android.view.View
+import android.widget.EditText
+import androidx.fragment.app.DialogFragment
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+
+class PassCodeFragment(
+ private val onPassCodeEntered: (Int) -> Unit
+) : DialogFragment() {
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val view: View = layoutInflater.inflate(R.layout.dialog_passcode, null)
+ val passcodeInput = view.findViewById<EditText>(R.id.settings_passcode_input)
+
+ return MaterialAlertDialogBuilder(requireContext())
+ .setTitle("Enter Passcode")
+ .setView(view)
+ .setPositiveButton("OK") { _, _ ->
+ val passCode = passcodeInput.text.toString().toIntOrNull()
+ passCode?.let { onPassCodeEntered(it) }
+ }
+ .setNegativeButton("Cancel", null)
+ .create()
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/dev/tablaster/dashpanel/SettingsActivity.kt b/app/src/main/java/dev/tablaster/dashpanel/SettingsActivity.kt
new file mode 100644
index 0000000..d326cd7
--- /dev/null
+++ b/app/src/main/java/dev/tablaster/dashpanel/SettingsActivity.kt
@@ -0,0 +1,25 @@
+package dev.tablaster.dashpanel
+
+import android.content.Intent
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+
+import com.google.android.material.appbar.MaterialToolbar
+
+class SettingsActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_settings)
+ val toolbar : MaterialToolbar = findViewById(R.id.settings_toolbar)
+ toolbar.setNavigationOnClickListener{ openMain() }
+ supportFragmentManager
+ .beginTransaction()
+ .replace(R.id.settings_container, SettingsFragment())
+ .commit()
+ }
+
+ private fun openMain() {
+ val intent = Intent(this, MainActivity::class.java)
+ startActivity(intent)
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/dev/tablaster/dashpanel/SettingsFragment.kt b/app/src/main/java/dev/tablaster/dashpanel/SettingsFragment.kt
new file mode 100644
index 0000000..fe86dfe
--- /dev/null
+++ b/app/src/main/java/dev/tablaster/dashpanel/SettingsFragment.kt
@@ -0,0 +1,25 @@
+package dev.tablaster.dashpanel
+
+import android.os.Bundle
+import android.widget.Toast
+import androidx.preference.Preference
+import androidx.preference.PreferenceFragmentCompat
+import androidx.core.content.edit
+
+class SettingsFragment : PreferenceFragmentCompat(), SettingsPassCodeFragment.PasscodeListener {
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ setPreferencesFromResource(R.xml.preferences, rootKey)
+ findPreference<Preference>("settings_passcode")?.setOnPreferenceClickListener {
+ SettingsPassCodeFragment().show(childFragmentManager, "settingsPasscodeDialog")
+ true
+ }
+ }
+ override fun onPasscodeSet(passcode: Int) {
+ preferenceManager.sharedPreferences
+ ?.edit() {
+ putInt("settings_passcode", passcode)
+ }
+
+ Toast.makeText(requireContext(), "Passcode saved: $passcode", Toast.LENGTH_SHORT).show()
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/dev/tablaster/dashpanel/SettingsPassCodeFragment.kt b/app/src/main/java/dev/tablaster/dashpanel/SettingsPassCodeFragment.kt
new file mode 100644
index 0000000..fb1750f
--- /dev/null
+++ b/app/src/main/java/dev/tablaster/dashpanel/SettingsPassCodeFragment.kt
@@ -0,0 +1,61 @@
+package dev.tablaster.dashpanel
+
+import android.app.Dialog
+import android.content.Context
+import android.os.Bundle
+import android.view.View
+import android.widget.EditText
+import android.widget.Toast
+import androidx.fragment.app.DialogFragment
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+
+class SettingsPassCodeFragment : DialogFragment() {
+
+ interface PasscodeListener {
+ fun onPasscodeSet(passcode: Int)
+ }
+
+ private var listener: PasscodeListener? = null
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ listener = when {
+ parentFragment is PasscodeListener -> parentFragment as PasscodeListener
+ context is PasscodeListener -> context
+ else -> null
+ }
+ }
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val view: View = layoutInflater.inflate(R.layout.preference_passcode, null)
+
+ val passcodeInput = view.findViewById<EditText>(R.id.passcode_input)
+ val confirmPasscodeInput = view.findViewById<EditText>(R.id.confirm_passcode_input)
+
+ return MaterialAlertDialogBuilder(requireContext())
+ .setTitle("Set Passcode")
+ .setView(view)
+ .setPositiveButton("OK") { _, _ ->
+ val pass1 = passcodeInput.text.toString()
+ val pass2 = confirmPasscodeInput.text.toString()
+
+ val int1 = pass1.toIntOrNull()
+ val int2 = pass2.toIntOrNull()
+
+ when {
+ int1 == null || int2 == null -> {
+ Toast.makeText(context, "Passcode must be a number", Toast.LENGTH_SHORT).show()
+ }
+ int1 != int2 -> {
+ Toast.makeText(context, "Passcodes do not match", Toast.LENGTH_SHORT).show()
+ }
+ else -> {
+ listener?.onPasscodeSet(int1)
+ }
+ }
+ }
+ .setNegativeButton("Cancel", null)
+ .create()
+ }
+}
+