P>s>}BhXO%>vt6%kSdi9
z8=u*aC9{VTL;5&oA#YTAMGD#ulJujfso;;t?i{OQuBbslOl}^xUMZQ)?l@mbp#1Z{
zl5`YDJi-uc)b&|OkFT_h=l=z+?Pf0MK5J#dPUa?qJC(_#kMrG(dARU}4cA7@EQFxs
zQ{g;u%5h{dcx9ZP-$o^&5Y#VOHE*590#r;Bq9EBs)d+T{E9UzS*kSuLK#{&u3x7r?
ze?ET?2M40dL_-=q3wdydoWyELSd<``d{L4VJboNC4xOp}ab(*4Zqv0*hI&Y}6|(BW
zSrvkh4dKVvnS7ZLsCwO!M70$DOst!h7c==G{*l2LA*-pksNZq%YbWEJie)RNjVv7e
z&Tr2qeNKrFI`oSlnlJ??*Lw*Y?>vQVV
z$79VRZ*7}zM^+Ytet=>if1UxdMj}n#GS$
zy{wiV$9L?!TMf!s)%I`xT&H3E$wg{1?ojh#Oj1(Ea~`L3UfBDmy+NHiJaL#5(!_oqci9AG
z{gE!7XOS^M`#er+z?qGC?JVJNtUfS#bv3F)}b_`1oSdgHYq?9;^szDI4(XouDgoaNsK
zCVuep&JHleiY9&4+(^*?Gv=yT%z=ETwVy3NNa@n?FZ*M${_J}OMVus|fOnZ8^TnW7
z8!uWP!D?{oG@n7oM^19Ke(t>T^X+$R0l|^m(B?kfqYhgZmi(uuL{QKafP5(!B`|zR
zetD&^|CZC?d65s}H^O2+h
zq8Vid!&W_x;o`an%OYSWoScNWd?QD_lQuS@SQyX!V%k@%dW8=W_^
zDPvzLbbBg`9LtVa138=x%SB^v&gJkn%8Ljqn6
zdJIo0o)&O4J(K9gim;TZdq*R_UF2$lxee2Jq{a~_T}CKJM#C_liE9PtQbsUnbx)L&
zol0H4&7a5auKw(pN;pGtfSqTBF^zl-C$o=Yy6GK&WqseD=Bfn?f0Z5_zAY3n2Mc4HJF7lk)0m5&vSQcR
zOqu_A3OQreh8Gb(J1r4Dtg0-l
zxeGQg=gku1Ibalt$Rr`3EJu0g_6y5PWFSUPxD101R?;#gFqzW)uWT^GA+<%L`>&oku0w2{{Pgo?gy7B
z_y&8%UMX(IwLbBuSEk4cnZJXGjJcBS@x5LSTGz=xON|NqqTdLsTGoThy&w6^uOBVRP}lj{pml2@0jkg*K@
EACMtlQUCw|
literal 0
HcmV?d00001
diff --git a/app/src/main/java/me/lucky/wasted/ControlReceiver.kt b/app/src/main/java/me/lucky/wasted/ControlReceiver.kt
new file mode 100644
index 0000000..785d2a8
--- /dev/null
+++ b/app/src/main/java/me/lucky/wasted/ControlReceiver.kt
@@ -0,0 +1,22 @@
+package me.lucky.wasted
+
+import android.app.admin.DevicePolicyManager
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+
+class ControlReceiver : BroadcastReceiver() {
+ companion object {
+ private const val ESCAPE = "me.lucky.wasted.action.ESCAPE"
+ }
+
+ override fun onReceive(context: Context, intent: Intent) {
+ val prefs by lazy { Preferences(context) }
+ if (intent.action != ESCAPE ||
+ !prefs.isServiceEnabled ||
+ intent.getStringExtra("code") != prefs.code) return
+ val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ dpm.lockNow()
+ dpm.wipeData(0)
+ }
+}
diff --git a/app/src/main/java/me/lucky/wasted/DeviceAdminReceiver.kt b/app/src/main/java/me/lucky/wasted/DeviceAdminReceiver.kt
new file mode 100644
index 0000000..b8068c4
--- /dev/null
+++ b/app/src/main/java/me/lucky/wasted/DeviceAdminReceiver.kt
@@ -0,0 +1,5 @@
+package me.lucky.wasted
+
+import android.app.admin.DeviceAdminReceiver
+
+class DeviceAdminReceiver : DeviceAdminReceiver()
diff --git a/app/src/main/java/me/lucky/wasted/MainActivity.kt b/app/src/main/java/me/lucky/wasted/MainActivity.kt
new file mode 100644
index 0000000..82b10cb
--- /dev/null
+++ b/app/src/main/java/me/lucky/wasted/MainActivity.kt
@@ -0,0 +1,109 @@
+package me.lucky.wasted
+
+import android.app.admin.DevicePolicyManager
+import android.app.Activity
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.os.Bundle
+import android.widget.Toast
+
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.appcompat.app.AppCompatActivity
+import java.util.*
+
+import me.lucky.wasted.databinding.ActivityMainBinding
+
+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 requestAdminPolicy =
+ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
+ when (result.resultCode) {
+ Activity.RESULT_OK -> setOn()
+ else -> binding.toggle.isChecked = false
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ setup()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ update()
+ }
+
+ private fun update() {
+ if (prefs.code == "") prefs.code = makeCode()
+ binding.apply {
+ code.text = prefs.code
+ toggle.isChecked = prefs.isServiceEnabled
+ }
+ if (!isAdminActive() && prefs.isServiceEnabled)
+ Toast.makeText(
+ this,
+ getString(R.string.service_unavailable_toast),
+ Toast.LENGTH_SHORT,
+ ).show()
+ }
+
+ private fun setup() {
+ binding.apply {
+ code.setOnLongClickListener {
+ prefs.code = makeCode()
+ code.text = prefs.code
+ true
+ }
+ toggle.setOnCheckedChangeListener { _, isChecked ->
+ when (isChecked) {
+ true -> if (!isAdminActive()) requestAdmin() else setOn()
+ false -> setOff()
+ }
+ }
+ }
+ }
+
+ private fun setOn() {
+ prefs.isServiceEnabled = true
+ setControlReceiverState(this, true)
+ }
+
+ private fun setOff() {
+ dpm.removeActiveAdmin(deviceAdmin)
+ 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_ADD_EXPLANATION,
+ getString(R.string.device_admin_description),
+ )
+ }
+ requestAdminPolicy.launch(intent)
+ }
+
+ private fun makeCode(): String = UUID.randomUUID().toString()
+ private fun isAdminActive(): Boolean = dpm.isAdminActive(deviceAdmin)
+
+ private fun setControlReceiverState(ctx: Context, value: Boolean) {
+ ctx.packageManager.setComponentEnabledSetting(
+ ComponentName(ctx, ControlReceiver::class.java),
+ if (value) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP,
+ )
+ }
+}
diff --git a/app/src/main/java/me/lucky/wasted/Preferences.kt b/app/src/main/java/me/lucky/wasted/Preferences.kt
new file mode 100644
index 0000000..bafa0bb
--- /dev/null
+++ b/app/src/main/java/me/lucky/wasted/Preferences.kt
@@ -0,0 +1,23 @@
+package me.lucky.wasted
+
+import android.content.Context
+
+import androidx.core.content.edit
+import androidx.preference.PreferenceManager
+
+class Preferences(context: Context) {
+ companion object {
+ private const val SERVICE_ENABLED = "service_enabled"
+ private const val CODE = "code"
+ }
+
+ private val prefs = PreferenceManager.getDefaultSharedPreferences(context)
+
+ var isServiceEnabled: Boolean
+ get() = prefs.getBoolean(SERVICE_ENABLED, false)
+ set(value) = prefs.edit { putBoolean(SERVICE_ENABLED, value) }
+
+ var code: String?
+ get() = prefs.getString(CODE, "")
+ set(value) = prefs.edit { putString(CODE, value) }
+}
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..ddf2e2f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..ba9df39
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..7353dbd
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..7353dbd
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..7d9e4aa
--- /dev/null
+++ b/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..f8c6127
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 0000000..c5d5899
--- /dev/null
+++ b/app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #FFFFFF
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..d00b691
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,7 @@
+
+ Wasted
+ Turn on Wasted to wipe data on panic trigger. The app will listen for broadcast message with authentication code.
+ Wasted
+ Allow Wasted to wipe data on panic trigger
+ Admin service unavailable
+
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..2ce8462
--- /dev/null
+++ b/app/src/main/res/values/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/device_admin.xml b/app/src/main/res/xml/device_admin.xml
new file mode 100644
index 0000000..37b37b2
--- /dev/null
+++ b/app/src/main/res/xml/device_admin.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/test/java/me/lucky/wasted/ExampleUnitTest.kt b/app/src/test/java/me/lucky/wasted/ExampleUnitTest.kt
new file mode 100644
index 0000000..8c05551
--- /dev/null
+++ b/app/src/test/java/me/lucky/wasted/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package me.lucky.wasted
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..8c50564
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,18 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath "com.android.tools.build:gradle:7.0.3"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0"
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/1.txt b/fastlane/metadata/android/en-US/changelogs/1.txt
new file mode 100644
index 0000000..b1b7161
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/1.txt
@@ -0,0 +1 @@
+init
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
new file mode 100644
index 0000000..65292ea
--- /dev/null
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -0,0 +1,2 @@
+Wipe data on panic trigger.
+The app will listen for broadcast message with authentication code.
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e3d95cd211fb6555efa723f13ee2b443feff2f6
GIT binary patch
literal 34628
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