Skip to content

Commit 95fa58c

Browse files
Merge pull request #360 from Ayush0Chaudhary/feature/fix-bg-service
Jules PR
2 parents fbf703a + 8f852c1 commit 95fa58c

File tree

4 files changed

+130
-20
lines changed

4 files changed

+130
-20
lines changed

app/src/main/java/com/blurr/voice/MyApplication.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,6 @@ class MyApplication : Application(), PurchasesUpdatedListener {
5151
IntentRegistry.register(ShareTextIntent())
5252
IntentRegistry.register(EmailComposeIntent())
5353
IntentRegistry.init(this)
54-
55-
val serviceIntent = Intent(this, TriggerMonitoringService::class.java)
56-
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
57-
startForegroundService(serviceIntent)
58-
} else {
59-
startService(serviceIntent)
60-
}
6154
}
6255

6356
private fun connectToBillingService() {

app/src/main/java/com/blurr/voice/triggers/ui/TriggerAdapter.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ class TriggerAdapter(
1818
private val onEditClick: (Trigger) -> Unit
1919
) : RecyclerView.Adapter<TriggerAdapter.TriggerViewHolder>() {
2020

21+
private var interactionsEnabled: Boolean = true
22+
23+
fun setInteractionsEnabled(enabled: Boolean) {
24+
this.interactionsEnabled = enabled
25+
notifyDataSetChanged()
26+
}
27+
2128
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TriggerViewHolder {
2229
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_trigger, parent, false)
2330
return TriggerViewHolder(view)
@@ -77,6 +84,10 @@ class TriggerAdapter(
7784
enabledSwitch.setOnCheckedChangeListener { _, isChecked ->
7885
onCheckedChange(trigger, isChecked)
7986
}
87+
88+
enabledSwitch.isEnabled = interactionsEnabled
89+
deleteButton.isEnabled = interactionsEnabled
90+
editButton.isEnabled = interactionsEnabled
8091
}
8192
}
8293
}

app/src/main/java/com/blurr/voice/triggers/ui/TriggersActivity.kt

Lines changed: 92 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,38 @@
11
package com.blurr.voice.triggers.ui
22

3+
import android.content.Context
34
import android.content.Intent
5+
import android.content.SharedPreferences
6+
import android.graphics.Color
47
import android.os.Bundle
8+
import android.provider.Settings
9+
import android.widget.CheckBox
10+
import android.widget.TextView
11+
import androidx.appcompat.app.AlertDialog
512
import androidx.appcompat.app.AppCompatActivity
613
import androidx.recyclerview.widget.LinearLayoutManager
7-
import android.provider.Settings
814
import androidx.recyclerview.widget.RecyclerView
915
import com.blurr.voice.R
1016
import com.blurr.voice.triggers.TriggerManager
17+
import com.blurr.voice.triggers.TriggerMonitoringService
1118
import com.blurr.voice.triggers.TriggerType
1219
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
13-
import com.google.android.material.floatingactionbutton.FloatingActionButton
1420

1521
class 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
}

app/src/main/res/layout/activity_triggers.xml

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,37 @@
1616
app:title="Your Triggers"
1717
app:titleTextColor="@color/white" />
1818

19+
<LinearLayout
20+
android:id="@+id/trigger_options_container"
21+
android:layout_width="match_parent"
22+
android:layout_height="wrap_content"
23+
android:layout_below="@id/toolbar"
24+
android:orientation="vertical"
25+
android:padding="16dp">
26+
27+
<CheckBox
28+
android:id="@+id/enable_triggers_checkbox"
29+
android:layout_width="wrap_content"
30+
android:layout_height="wrap_content"
31+
android:text="Enable Triggers"
32+
android:textColor="@color/white" />
33+
34+
<TextView
35+
android:id="@+id/triggers_not_working_text"
36+
android:layout_width="wrap_content"
37+
android:layout_height="wrap_content"
38+
android:text="Triggers not working for you?"
39+
android:textColor="@color/button_blue"
40+
android:layout_marginTop="8dp"
41+
android:clickable="true"
42+
android:focusable="true" />
43+
</LinearLayout>
44+
1945
<androidx.recyclerview.widget.RecyclerView
2046
android:id="@+id/triggersRecyclerView"
2147
android:layout_width="match_parent"
2248
android:layout_height="match_parent"
23-
android:layout_below="@id/toolbar"
49+
android:layout_below="@id/trigger_options_container"
2450
android:padding="8dp"
2551
android:clipToPadding="false"
2652
tools:listitem="@layout/item_trigger" />

0 commit comments

Comments
 (0)