diff options
| author | Blaster4385 <[email protected]> | 2025-05-01 17:17:44 +0530 |
|---|---|---|
| committer | Blaster4385 <[email protected]> | 2025-05-02 09:58:01 +0530 |
| commit | 34712408abd6accff0d72ff3962dded2de81396a (patch) | |
| tree | 5b8a2361a39a2d331ff16fb83050c1173d2bca9a /app/src/main/java | |
Initial app
Diffstat (limited to 'app/src/main/java')
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() + } +} + |