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