11package com.blurr.voice.triggers.ui
22
3+ import android.content.Context
34import android.content.Intent
5+ import android.content.SharedPreferences
6+ import android.graphics.Color
47import android.os.Bundle
8+ import android.provider.Settings
9+ import android.widget.CheckBox
10+ import android.widget.TextView
11+ import androidx.appcompat.app.AlertDialog
512import androidx.appcompat.app.AppCompatActivity
613import androidx.recyclerview.widget.LinearLayoutManager
7- import android.provider.Settings
814import androidx.recyclerview.widget.RecyclerView
915import com.blurr.voice.R
1016import com.blurr.voice.triggers.TriggerManager
17+ import com.blurr.voice.triggers.TriggerMonitoringService
1118import com.blurr.voice.triggers.TriggerType
1219import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
13- import com.google.android.material.floatingactionbutton.FloatingActionButton
1420
1521class TriggersActivity : AppCompatActivity () {
1622
1723 private lateinit var triggerManager: TriggerManager
1824 private lateinit var triggerAdapter: TriggerAdapter
25+ private lateinit var enableTriggersCheckbox: CheckBox
26+ private lateinit var triggersNotWorkingText: TextView
27+ private lateinit var addTriggerFab: ExtendedFloatingActionButton
28+ private lateinit var triggersRecyclerView: RecyclerView
29+
30+ private lateinit var sharedPreferences: SharedPreferences
31+
32+ companion object {
33+ const val PREFS_NAME = " TriggerPrefs"
34+ const val KEY_TRIGGERS_ENABLED = " triggers_enabled"
35+ }
1936
2037 override fun onCreate (savedInstanceState : Bundle ? ) {
2138 super .onCreate(savedInstanceState)
@@ -25,13 +42,78 @@ class TriggersActivity : AppCompatActivity() {
2542 setSupportActionBar(toolbar)
2643 supportActionBar?.setDisplayHomeAsUpEnabled(true )
2744
28-
2945 triggerManager = TriggerManager .getInstance(this )
46+ sharedPreferences = getSharedPreferences(PREFS_NAME , Context .MODE_PRIVATE )
47+
48+ enableTriggersCheckbox = findViewById(R .id.enable_triggers_checkbox)
49+ triggersNotWorkingText = findViewById(R .id.triggers_not_working_text)
50+ addTriggerFab = findViewById(R .id.addTriggerFab)
51+ triggersRecyclerView = findViewById(R .id.triggersRecyclerView)
3052
3153 setupRecyclerView()
3254 setupFab()
55+ setupTriggerControls()
56+ }
57+
58+ private fun setupTriggerControls () {
59+ val triggersEnabled = sharedPreferences.getBoolean(KEY_TRIGGERS_ENABLED , false )
60+ enableTriggersCheckbox.isChecked = triggersEnabled
61+ updateUiState(triggersEnabled)
62+
63+ enableTriggersCheckbox.setOnCheckedChangeListener { _, isChecked ->
64+ if (isChecked) {
65+ showBatteryOptimizationWarning {
66+ startTriggerService()
67+ sharedPreferences.edit().putBoolean(KEY_TRIGGERS_ENABLED , true ).apply ()
68+ updateUiState(true )
69+ }
70+ } else {
71+ stopTriggerService()
72+ sharedPreferences.edit().putBoolean(KEY_TRIGGERS_ENABLED , false ).apply ()
73+ updateUiState(false )
74+ }
75+ }
76+
77+ triggersNotWorkingText.setOnClickListener {
78+ showBatteryOptimizationWarning {}
79+ }
3380 }
3481
82+ private fun updateUiState (enabled : Boolean ) {
83+ triggersRecyclerView.alpha = if (enabled) 1.0f else 0.5f
84+ addTriggerFab.isEnabled = enabled
85+ triggerAdapter.setInteractionsEnabled(enabled)
86+ }
87+
88+
89+ private fun showBatteryOptimizationWarning (onAcknowledge : () -> Unit ) {
90+ val dialog = AlertDialog .Builder (this )
91+ .setTitle(" Vendor Battery Optimization" )
92+ .setMessage(" Your vendor might not support Panda background trigger monitoring. To ensure Panda works properly, please disable any kind of battery optimization for the app." )
93+ .setPositiveButton(" OK" ) { dialog, _ ->
94+ onAcknowledge()
95+ dialog.dismiss()
96+ }
97+ .show()
98+
99+ dialog.getButton(AlertDialog .BUTTON_POSITIVE ).setTextColor(Color .parseColor(" #4CAF50" ))
100+ }
101+
102+ private fun startTriggerService () {
103+ val serviceIntent = Intent (this , TriggerMonitoringService ::class .java)
104+ if (android.os.Build .VERSION .SDK_INT >= android.os.Build .VERSION_CODES .O ) {
105+ startForegroundService(serviceIntent)
106+ } else {
107+ startService(serviceIntent)
108+ }
109+ }
110+
111+ private fun stopTriggerService () {
112+ val serviceIntent = Intent (this , TriggerMonitoringService ::class .java)
113+ stopService(serviceIntent)
114+ }
115+
116+
35117 override fun onSupportNavigateUp (): Boolean {
36118 onBackPressed()
37119 return true
@@ -51,7 +133,7 @@ class TriggersActivity : AppCompatActivity() {
51133 }
52134
53135 private fun showPermissionDialog () {
54- val dialog = androidx.appcompat.app. AlertDialog .Builder (this )
136+ val dialog = AlertDialog .Builder (this )
55137 .setTitle(" Permission Required" )
56138 .setMessage(" To use notification-based triggers, you need to grant Panda the Notification Listener permission in your system settings." )
57139 .setPositiveButton(" Grant Permission" ) { _, _ ->
@@ -60,12 +142,11 @@ class TriggersActivity : AppCompatActivity() {
60142 .setNegativeButton(" Cancel" , null )
61143 .show()
62144
63- dialog.getButton(androidx.appcompat.app. AlertDialog .BUTTON_POSITIVE ).setTextColor(getColor(R .color.white))
145+ dialog.getButton(AlertDialog .BUTTON_POSITIVE ).setTextColor(getColor(R .color.white))
64146 }
65147
66148 private fun setupRecyclerView () {
67- val recyclerView = findViewById<RecyclerView >(R .id.triggersRecyclerView)
68- recyclerView.layoutManager = LinearLayoutManager (this )
149+ triggersRecyclerView.layoutManager = LinearLayoutManager (this )
69150 triggerAdapter = TriggerAdapter (
70151 mutableListOf (),
71152 onCheckedChange = { trigger, isEnabled ->
@@ -82,11 +163,11 @@ class TriggersActivity : AppCompatActivity() {
82163 startActivity(intent)
83164 }
84165 )
85- recyclerView .adapter = triggerAdapter
166+ triggersRecyclerView .adapter = triggerAdapter
86167 }
87168
88169 private fun showDeleteConfirmationDialog (trigger : com.blurr.voice.triggers.Trigger ) {
89- val dialog = androidx.appcompat.app. AlertDialog .Builder (this )
170+ val dialog = AlertDialog .Builder (this )
90171 .setTitle(" Delete Trigger" )
91172 .setMessage(" Are you sure you want to delete this trigger?" )
92173 .setPositiveButton(" Delete" ) { _, _ ->
@@ -96,12 +177,11 @@ class TriggersActivity : AppCompatActivity() {
96177 .setNegativeButton(" Cancel" , null )
97178 .show()
98179
99- dialog.getButton(androidx.appcompat.app. AlertDialog .BUTTON_POSITIVE ).setTextColor(getColor(R .color.white))
180+ dialog.getButton(AlertDialog .BUTTON_POSITIVE ).setTextColor(getColor(R .color.white))
100181 }
101182
102183 private fun setupFab () {
103- val fab = findViewById<ExtendedFloatingActionButton >(R .id.addTriggerFab)
104- fab.setOnClickListener {
184+ addTriggerFab.setOnClickListener {
105185 startActivity(Intent (this , ChooseTriggerTypeActivity ::class .java))
106186 }
107187 }
0 commit comments