Skip to content

Commit 3eaf86c

Browse files
Merge pull request #361 from Ayush0Chaudhary/permission-manager
Jules PR
2 parents 95fa58c + 1236dde commit 3eaf86c

File tree

3 files changed

+130
-1
lines changed

3 files changed

+130
-1
lines changed

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

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.blurr.voice.triggers.ui
22

3+
import android.content.Intent
34
import android.content.pm.PackageManager
45
import android.os.Bundle
6+
import android.provider.Settings
57
import android.text.Editable
68
import android.text.TextWatcher
79
import android.view.View
810
import android.widget.Button
9-
import android.widget.EditText
1011
import android.widget.CheckBox
12+
import android.widget.EditText
1113
import android.widget.LinearLayout
1214
import android.widget.RadioGroup
1315
import android.widget.ScrollView
@@ -18,6 +20,7 @@ import androidx.lifecycle.lifecycleScope
1820
import androidx.recyclerview.widget.LinearLayoutManager
1921
import androidx.recyclerview.widget.RecyclerView
2022
import com.blurr.voice.R
23+
import com.blurr.voice.triggers.PermissionUtils
2124
import com.blurr.voice.triggers.Trigger
2225
import com.blurr.voice.triggers.TriggerManager
2326
import 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) {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<shape xmlns:android="http://schemas.android.com/apk/res/android">
3+
<solid android:color="#4DFF0000" /> <!-- Red with 30% opacity -->
4+
<corners android:radius="8dp" />
5+
<stroke android:width="1dp" android:color="#FF0000" />
6+
</shape>

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

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,38 @@
5151
android:layout_height="wrap_content"
5252
android:orientation="vertical">
5353

54+
<LinearLayout
55+
android:id="@+id/alarmPermissionWarning"
56+
android:layout_width="match_parent"
57+
android:layout_height="wrap_content"
58+
android:orientation="vertical"
59+
android:visibility="gone"
60+
android:background="@drawable/warning_background"
61+
android:padding="8dp"
62+
android:layout_marginBottom="16dp">
63+
64+
<TextView
65+
android:layout_width="wrap_content"
66+
android:layout_height="wrap_content"
67+
android:text="Permission Required"
68+
android:textColor="@color/white"
69+
android:textStyle="bold"/>
70+
71+
<TextView
72+
android:layout_width="wrap_content"
73+
android:layout_height="wrap_content"
74+
android:text="To schedule tasks at precise times, Panda needs the 'Alarms &amp; Reminders' permission."
75+
android:textColor="@color/white"/>
76+
77+
<Button
78+
android:id="@+id/grantAlarmPermissionButton"
79+
android:layout_width="wrap_content"
80+
android:layout_height="wrap_content"
81+
android:text="Grant Permission"
82+
android:layout_marginTop="8dp"
83+
android:background="@drawable/rounded_button_secondary"/>
84+
</LinearLayout>
85+
5486
<TextView
5587
style="@style/PermissionHeading"
5688
android:text="Set Trigger Time" />
@@ -91,6 +123,38 @@
91123
android:orientation="vertical"
92124
android:visibility="gone">
93125

126+
<LinearLayout
127+
android:id="@+id/notificationPermissionWarning"
128+
android:layout_width="match_parent"
129+
android:layout_height="wrap_content"
130+
android:orientation="vertical"
131+
android:visibility="gone"
132+
android:background="@drawable/warning_background"
133+
android:padding="8dp"
134+
android:layout_marginBottom="16dp">
135+
136+
<TextView
137+
android:layout_width="wrap_content"
138+
android:layout_height="wrap_content"
139+
android:text="Permission Required"
140+
android:textColor="@color/white"
141+
android:textStyle="bold"/>
142+
143+
<TextView
144+
android:layout_width="wrap_content"
145+
android:layout_height="wrap_content"
146+
android:text="To read notifications, Panda needs permission to access them."
147+
android:textColor="@color/white"/>
148+
149+
<Button
150+
android:id="@+id/grantNotificationPermissionButton"
151+
android:layout_width="wrap_content"
152+
android:layout_height="wrap_content"
153+
android:text="Grant Permission"
154+
android:layout_marginTop="8dp"
155+
android:background="@drawable/rounded_button_secondary"/>
156+
</LinearLayout>
157+
94158
<CheckBox
95159
android:id="@+id/selectAllAppsCheckbox"
96160
android:layout_width="wrap_content"

0 commit comments

Comments
 (0)