diff --git a/app/build.gradle b/app/build.gradle
index ca2b8dd..9be6d6f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,8 +10,8 @@ android {
applicationId "me.lucky.wasted"
minSdk 23
targetSdk 31
- versionCode 8
- versionName "1.1.1"
+ versionCode 9
+ versionName "1.1.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
diff --git a/app/src/main/java/me/lucky/wasted/CodeReceiver.kt b/app/src/main/java/me/lucky/wasted/CodeReceiver.kt
index c676086..50600f8 100644
--- a/app/src/main/java/me/lucky/wasted/CodeReceiver.kt
+++ b/app/src/main/java/me/lucky/wasted/CodeReceiver.kt
@@ -20,7 +20,7 @@ class CodeReceiver : BroadcastReceiver() {
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
try {
dpm.lockNow()
- if (prefs.doWipe) dpm.wipeData(0)
+ if (prefs.doWipe) dpm.wipeData(Utils.getWipeDataFlags())
} catch (exc: SecurityException) {}
}
}
diff --git a/app/src/main/java/me/lucky/wasted/DeviceAdmin.kt b/app/src/main/java/me/lucky/wasted/DeviceAdmin.kt
new file mode 100644
index 0000000..da4e38c
--- /dev/null
+++ b/app/src/main/java/me/lucky/wasted/DeviceAdmin.kt
@@ -0,0 +1,15 @@
+package me.lucky.wasted
+
+import android.app.admin.DevicePolicyManager
+import android.content.ComponentName
+import android.content.Context
+
+class DeviceAdmin(ctx: Context) {
+ val dpm by lazy {
+ ctx.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ }
+ val deviceAdmin by lazy { ComponentName(ctx, DeviceAdminReceiver::class.java) }
+
+ fun remove() = dpm.removeActiveAdmin(deviceAdmin)
+ fun isActive(): Boolean = dpm.isAdminActive(deviceAdmin)
+}
diff --git a/app/src/main/java/me/lucky/wasted/MainActivity.kt b/app/src/main/java/me/lucky/wasted/MainActivity.kt
index 325e528..23b621e 100644
--- a/app/src/main/java/me/lucky/wasted/MainActivity.kt
+++ b/app/src/main/java/me/lucky/wasted/MainActivity.kt
@@ -17,10 +17,7 @@ open class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val prefs by lazy { Preferences(this) }
- private val dpm by lazy {
- getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
- }
- private val deviceAdmin by lazy { ComponentName(this, DeviceAdminReceiver::class.java) }
+ private val admin by lazy { DeviceAdmin(this) }
private val requestAdminPolicy =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
@@ -44,7 +41,7 @@ open class MainActivity : AppCompatActivity() {
}
private fun update() {
- if (!isAdminActive() && prefs.isServiceEnabled)
+ if (!admin.isActive() && prefs.isServiceEnabled)
Toast.makeText(
this,
getString(R.string.service_unavailable_toast),
@@ -73,7 +70,7 @@ open class MainActivity : AppCompatActivity() {
}
toggle.setOnCheckedChangeListener { _, isChecked ->
when (isChecked) {
- true -> if (!isAdminActive()) requestAdmin() else setOn()
+ true -> if (!admin.isActive()) requestAdmin() else setOn()
false -> setOff()
}
}
@@ -86,14 +83,14 @@ open class MainActivity : AppCompatActivity() {
}
private fun setOff() {
- dpm.removeActiveAdmin(deviceAdmin)
+ admin.remove()
setControlReceiverState(this, false)
prefs.isServiceEnabled = false
}
private fun requestAdmin() {
val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply {
- putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdmin)
+ putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin.deviceAdmin)
putExtra(
DevicePolicyManager.EXTRA_ADD_EXPLANATION,
getString(R.string.device_admin_description),
@@ -103,7 +100,6 @@ open class MainActivity : AppCompatActivity() {
}
private fun makeCode(): String = UUID.randomUUID().toString()
- private fun isAdminActive(): Boolean = dpm.isAdminActive(deviceAdmin)
private fun setControlReceiverState(ctx: Context, value: Boolean) {
ctx.packageManager.setComponentEnabledSetting(
diff --git a/app/src/main/java/me/lucky/wasted/PanicResponderActivity.kt b/app/src/main/java/me/lucky/wasted/PanicResponderActivity.kt
index c029b65..62179c4 100644
--- a/app/src/main/java/me/lucky/wasted/PanicResponderActivity.kt
+++ b/app/src/main/java/me/lucky/wasted/PanicResponderActivity.kt
@@ -23,7 +23,7 @@ class PanicResponderActivity : AppCompatActivity() {
try {
dpm.lockNow()
if (PanicResponder.receivedTriggerFromConnectedApp(this) &&
- prefs.doWipe) dpm.wipeData(0)
+ prefs.doWipe) dpm.wipeData(Utils.getWipeDataFlags())
} catch (exc: SecurityException) {}
finish()
}
diff --git a/app/src/main/java/me/lucky/wasted/QSTileService.kt b/app/src/main/java/me/lucky/wasted/QSTileService.kt
index 053ed8a..3233497 100644
--- a/app/src/main/java/me/lucky/wasted/QSTileService.kt
+++ b/app/src/main/java/me/lucky/wasted/QSTileService.kt
@@ -1,7 +1,5 @@
package me.lucky.wasted
-import android.app.admin.DevicePolicyManager
-import android.content.Context
import android.os.Build
import android.service.quicksettings.Tile
import android.service.quicksettings.TileService
@@ -13,22 +11,25 @@ import kotlin.concurrent.timerTask
@RequiresApi(Build.VERSION_CODES.N)
class QSTileService : TileService() {
private val prefs by lazy { Preferences(this) }
- private val dpm by lazy {
- getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
- }
+ private val admin by lazy { DeviceAdmin(this) }
private val counter = AtomicInteger(0)
private var timer: Timer? = null
override fun onStartListening() {
super.onStartListening()
- update(if (prefs.isServiceEnabled) Tile.STATE_INACTIVE else Tile.STATE_UNAVAILABLE)
+ update(
+ if (prefs.isServiceEnabled && admin.isActive()) Tile.STATE_INACTIVE
+ else Tile.STATE_UNAVAILABLE
+ )
}
override fun onClick() {
super.onClick()
if (!prefs.isServiceEnabled) return
if (!prefs.doWipe) {
- dpm.lockNow()
+ try {
+ admin.dpm.lockNow()
+ } catch (exc: SecurityException) {}
return
}
when (counter.getAndIncrement()) {
@@ -37,13 +38,16 @@ class QSTileService : TileService() {
timer?.cancel()
timer = Timer()
timer?.schedule(timerTask {
- update(Tile.STATE_INACTIVE)
- counter.set(0)
+ try {
+ admin.dpm.lockNow()
+ admin.dpm.wipeData(Utils.getWipeDataFlags())
+ } catch (exc: SecurityException) {}
}, 2000)
}
- 1 -> {
- dpm.lockNow()
- dpm.wipeData(0)
+ else -> {
+ timer?.cancel()
+ update(Tile.STATE_INACTIVE)
+ counter.set(0)
}
}
}
diff --git a/app/src/main/java/me/lucky/wasted/Utils.kt b/app/src/main/java/me/lucky/wasted/Utils.kt
new file mode 100644
index 0000000..26250b1
--- /dev/null
+++ b/app/src/main/java/me/lucky/wasted/Utils.kt
@@ -0,0 +1,13 @@
+package me.lucky.wasted
+
+import android.app.admin.DevicePolicyManager
+import android.os.Build
+
+class Utils {
+ companion object {
+ fun getWipeDataFlags(): Int {
+ return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
+ DevicePolicyManager.WIPE_SILENTLY else 0
+ }
+ }
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b69882b..fba4cda 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2,7 +2,7 @@
Wasted
Turn on Wasted to lock device on panic trigger. You can use PanicKit, Tile or send broadcast message with this authentication code.
Wasted
- Allow Wasted to lock device and wipe data on panic trigger
+ Allow Wasted to lock device and (optionally) wipe data on panic trigger
Admin service unavailable
Wipe data
Confirm Panic App
diff --git a/fastlane/metadata/android/en-US/changelogs/9.txt b/fastlane/metadata/android/en-US/changelogs/9.txt
new file mode 100644
index 0000000..90b1846
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/9.txt
@@ -0,0 +1 @@
+change Tile logic