Permissions.kt raw
1 package io.github.domi04151309.alwayson.helpers
2
3 import android.Manifest
4 import android.app.admin.DevicePolicyManager
5 import android.content.ComponentName
6 import android.content.Context
7 import android.content.pm.PackageManager
8 import android.provider.Settings
9 import android.text.TextUtils
10 import io.github.domi04151309.alwayson.receivers.AdminReceiver
11
12 object Permissions {
13 val NOTIFICATION_PERMISSION_PREFS: Array<String> =
14 arrayOf(
15 P.SHOW_MUSIC_CONTROLS, P.SHOW_NOTIFICATION_COUNT, P.SHOW_NOTIFICATION_ICONS,
16 P.TINT_NOTIFICATIONS, "pref_filter_notifications", P.EDGE_GLOW, P.EDGE_GLOW_DURATION,
17 P.EDGE_GLOW_DELAY, P.EDGE_GLOW_STYLE, P.DISPLAY_COLOR_EDGE_GLOW, "rules_ambient_mode",
18 )
19
20 val DEVICE_ADMIN_OR_ROOT_PERMISSION_PREFS: Array<String> =
21 arrayOf(
22 "charging_animation",
23 P.RULES_CHARGING_STATE,
24 P.RULES_BATTERY,
25 "rules_time",
26 P.RULES_TIMEOUT,
27 P.CHARGING_STYLE,
28 )
29
30 private val CALENDAR_PERMISSION_PREFS: Array<String> =
31 arrayOf(
32 P.SHOW_CALENDAR,
33 )
34
35 @Suppress("ReturnCount")
36 fun isNotificationServiceEnabled(context: Context): Boolean {
37 val flat =
38 Settings.Secure.getString(context.contentResolver, "enabled_notification_listeners")
39 if (TextUtils.isEmpty(flat)) return false
40 val names = flat.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
41 for (name in names) {
42 val componentName = ComponentName.unflattenFromString(name)
43 if (componentName != null &&
44 TextUtils.equals(
45 context.packageName,
46 componentName.packageName,
47 )
48 ) {
49 return true
50 }
51 }
52 return false
53 }
54
55 fun needsNotificationPermissions(context: Context): Boolean {
56 val prefs = P.getPreferences(context).all
57 for (i in NOTIFICATION_PERMISSION_PREFS) {
58 if (prefs.containsKey(i) && prefs[i] is Boolean && prefs[i] == true) {
59 return !isNotificationServiceEnabled(context)
60 }
61 }
62 return false
63 }
64
65 fun isDeviceAdminOrRoot(context: Context): Boolean =
66 if (
67 P.getPreferences(context).getBoolean("root_mode", false)
68 ) {
69 true
70 } else {
71 (context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager)
72 .isAdminActive(ComponentName(context, AdminReceiver::class.java))
73 }
74
75 fun needsDeviceAdminOrRoot(context: Context): Boolean {
76 val prefs = P.getPreferences(context).all
77 for (i in DEVICE_ADMIN_OR_ROOT_PERMISSION_PREFS) {
78 if (prefs.containsKey(i) && prefs[i] is Boolean && prefs[i] == true) {
79 return !isDeviceAdminOrRoot(context)
80 }
81 }
82 return false
83 }
84
85 fun hasPhoneStatePermission(context: Context): Boolean =
86 context.applicationContext
87 .checkSelfPermission(Manifest.permission.READ_PHONE_STATE) ==
88 PackageManager
89 .PERMISSION_GRANTED
90
91 fun hasCalendarPermission(context: Context): Boolean =
92 context.applicationContext
93 .checkSelfPermission(Manifest.permission.READ_CALENDAR) ==
94 PackageManager
95 .PERMISSION_GRANTED
96
97 fun hasLocationPermission(context: Context): Boolean =
98 context.applicationContext
99 .checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) ==
100 PackageManager.PERMISSION_GRANTED ||
101 context.applicationContext
102 .checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) ==
103 PackageManager.PERMISSION_GRANTED
104
105 fun needsCalendarPermission(context: Context): Boolean {
106 val prefs = P.getPreferences(context).all
107 for (i in CALENDAR_PERMISSION_PREFS) {
108 if (prefs.containsKey(i) && prefs[i] is Boolean && prefs[i] == true) {
109 return !hasCalendarPermission(context)
110 }
111 }
112 return false
113 }
114 }
115