11package com.blurr.voice.triggers.ui
22
3+ import android.content.Intent
34import android.content.pm.PackageManager
45import android.os.Bundle
6+ import android.provider.Settings
57import android.text.Editable
68import android.text.TextWatcher
79import android.view.View
810import android.widget.Button
9- import android.widget.EditText
1011import android.widget.CheckBox
12+ import android.widget.EditText
1113import android.widget.LinearLayout
1214import android.widget.RadioGroup
1315import android.widget.ScrollView
@@ -18,6 +20,7 @@ import androidx.lifecycle.lifecycleScope
1820import androidx.recyclerview.widget.LinearLayoutManager
1921import androidx.recyclerview.widget.RecyclerView
2022import com.blurr.voice.R
23+ import com.blurr.voice.triggers.PermissionUtils
2124import com.blurr.voice.triggers.Trigger
2225import com.blurr.voice.triggers.TriggerManager
2326import com.blurr.voice.triggers.TriggerType
@@ -40,6 +43,10 @@ class CreateTriggerActivity : AppCompatActivity() {
4043 private lateinit var appAdapter: AppAdapter
4144 private lateinit var scrollView: ScrollView
4245 private lateinit var selectAllAppsCheckbox: CheckBox
46+ private lateinit var notificationPermissionWarning: LinearLayout
47+ private lateinit var grantNotificationPermissionButton: Button
48+ private lateinit var alarmPermissionWarning: LinearLayout
49+ private lateinit var grantAlarmPermissionButton: Button
4350
4451 private var selectedTriggerType = TriggerType .SCHEDULED_TIME
4552 private var selectedApps = listOf<AppInfo >()
@@ -62,6 +69,10 @@ class CreateTriggerActivity : AppCompatActivity() {
6269 timePicker = findViewById(R .id.timePicker)
6370 appsRecyclerView = findViewById(R .id.appsRecyclerView)
6471 dayOfWeekChipGroup = findViewById(R .id.dayOfWeekChipGroup)
72+ notificationPermissionWarning = findViewById(R .id.notificationPermissionWarning)
73+ grantNotificationPermissionButton = findViewById(R .id.grantNotificationPermissionButton)
74+ alarmPermissionWarning = findViewById(R .id.alarmPermissionWarning)
75+ grantAlarmPermissionButton = findViewById(R .id.grantAlarmPermissionButton)
6576// scrollView = findViewById(R.id.scrollView)
6677
6778// instructionEditText.setOnFocusChangeListener { view, hasFocus ->
@@ -135,6 +146,41 @@ class CreateTriggerActivity : AppCompatActivity() {
135146 }
136147 }
137148
149+ override fun onResume () {
150+ super .onResume()
151+ checkNotificationPermission()
152+ checkAlarmPermission()
153+ }
154+
155+ private fun checkNotificationPermission () {
156+ if (selectedTriggerType == TriggerType .NOTIFICATION ) {
157+ if (PermissionUtils .isNotificationListenerEnabled(this )) {
158+ notificationPermissionWarning.visibility = View .GONE
159+ } else {
160+ notificationPermissionWarning.visibility = View .VISIBLE
161+ grantNotificationPermissionButton.setOnClickListener {
162+ val intent = Intent (Settings .ACTION_NOTIFICATION_LISTENER_SETTINGS )
163+ startActivity(intent)
164+ }
165+ }
166+ }
167+ }
168+
169+ private fun checkAlarmPermission () {
170+ if (selectedTriggerType == TriggerType .SCHEDULED_TIME ) {
171+ if (PermissionUtils .canScheduleExactAlarms(this )) {
172+ alarmPermissionWarning.visibility = View .GONE
173+ } else {
174+ alarmPermissionWarning.visibility = View .VISIBLE
175+ grantAlarmPermissionButton.setOnClickListener {
176+ if (android.os.Build .VERSION .SDK_INT >= android.os.Build .VERSION_CODES .S ) {
177+ startActivity(Intent (Settings .ACTION_REQUEST_SCHEDULE_EXACT_ALARM ))
178+ }
179+ }
180+ }
181+ }
182+ }
183+
138184 private fun testTrigger () {
139185 val instruction = instructionEditText.text.toString()
140186 if (instruction.isBlank()) {
@@ -191,16 +237,23 @@ class CreateTriggerActivity : AppCompatActivity() {
191237 scheduledTimeOptions.visibility = View .VISIBLE
192238 notificationOptions.visibility = View .GONE
193239 chargingStateOptions.visibility = View .GONE
240+ // Hide other permission warnings
241+ notificationPermissionWarning.visibility = View .GONE
194242 }
195243 TriggerType .NOTIFICATION -> {
196244 scheduledTimeOptions.visibility = View .GONE
197245 notificationOptions.visibility = View .VISIBLE
198246 chargingStateOptions.visibility = View .GONE
247+ // Hide other permission warnings
248+ alarmPermissionWarning.visibility = View .GONE
199249 }
200250 TriggerType .CHARGING_STATE -> {
201251 scheduledTimeOptions.visibility = View .GONE
202252 notificationOptions.visibility = View .GONE
203253 chargingStateOptions.visibility = View .VISIBLE
254+ // Hide other permission warnings
255+ notificationPermissionWarning.visibility = View .GONE
256+ alarmPermissionWarning.visibility = View .GONE
204257 }
205258 }
206259 }
@@ -269,6 +322,12 @@ class CreateTriggerActivity : AppCompatActivity() {
269322 )
270323 }
271324 TriggerType .NOTIFICATION -> {
325+ if (! PermissionUtils .isNotificationListenerEnabled(this )) {
326+ Toast .makeText(this , " Notification listener permission is required." , Toast .LENGTH_SHORT ).show()
327+ checkNotificationPermission()
328+ return
329+ }
330+
272331 val packageName: String
273332 val appName: String
274333 if (selectAllAppsCheckbox.isChecked) {
0 commit comments