diff --git a/README.md b/README.md
index 68218a5..e26215b 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ Lock device and wipe data on panic trigger.
-The app will listen for broadcast message with authentication code. On receive, using
+You can use PanicKit or send broadcast message with authentication code. On trigger, using
[Device Administration API](https://developer.android.com/guide/topics/admin/device-admin), it
locks device and runs wipe.
diff --git a/SECURITY.md b/SECURITY.md
index b44be9b..1dc2545 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -4,8 +4,8 @@
| Version | Supported |
| ------- | ------------------ |
-| 1.0.x | :white_check_mark: |
-| < 1.0 | :x: |
+| 1.1.x | :white_check_mark: |
+| < 1.1 | :x: |
## Reporting a Vulnerability
diff --git a/app/build.gradle b/app/build.gradle
index bd643e7..35110ee 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -8,10 +8,10 @@ android {
defaultConfig {
applicationId "me.lucky.wasted"
- minSdk 25
+ minSdk 23
targetSdk 31
- versionCode 6
- versionName "1.0.5"
+ versionCode 7
+ versionName "1.1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -45,4 +45,5 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'androidx.security:security-crypto:1.0.0'
+ implementation 'info.guardianproject.panic:panic:1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6c01825..9a60b72 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,24 +4,24 @@
package="me.lucky.wasted">
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/app/src/main/java/me/lucky/wasted/MainActivity.kt b/app/src/main/java/me/lucky/wasted/MainActivity.kt
index bfc3f59..5023dbe 100644
--- a/app/src/main/java/me/lucky/wasted/MainActivity.kt
+++ b/app/src/main/java/me/lucky/wasted/MainActivity.kt
@@ -1,7 +1,6 @@
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
@@ -15,7 +14,7 @@ import java.util.*
import me.lucky.wasted.databinding.ActivityMainBinding
-class MainActivity : AppCompatActivity() {
+open class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val prefs by lazy { Preferences(this) }
@@ -26,7 +25,7 @@ class MainActivity : AppCompatActivity() {
private val requestAdminPolicy =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
when (result.resultCode) {
- Activity.RESULT_OK -> setOn()
+ RESULT_OK -> setOn()
else -> binding.toggle.isChecked = false
}
}
diff --git a/app/src/main/java/me/lucky/wasted/PanicConnectionActivity.kt b/app/src/main/java/me/lucky/wasted/PanicConnectionActivity.kt
new file mode 100644
index 0000000..94f8f6c
--- /dev/null
+++ b/app/src/main/java/me/lucky/wasted/PanicConnectionActivity.kt
@@ -0,0 +1,50 @@
+package me.lucky.wasted
+
+import android.content.pm.PackageManager
+import android.os.Bundle
+
+import androidx.appcompat.app.AlertDialog
+
+import info.guardianproject.panic.PanicResponder
+
+class PanicConnectionActivity : MainActivity() {
+
+ private val pm by lazy { packageManager }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ if (PanicResponder.checkForDisconnectIntent(this)) {
+ finish()
+ return
+ }
+ val sender = PanicResponder.getConnectIntentSender(this)
+ val packageName = PanicResponder.getTriggerPackageName(this)
+ if (sender != "" && sender != packageName) {
+ showOptInDialog()
+ }
+ }
+
+ private fun showOptInDialog() {
+ var app: CharSequence = getString(R.string.panic_app_unknown_app)
+ val packageName = callingActivity?.packageName
+ if (packageName != null) {
+ try {
+ app = pm.getApplicationLabel(pm.getApplicationInfo(packageName, 0))
+ } catch (exc: PackageManager.NameNotFoundException) {}
+ }
+
+ AlertDialog.Builder(this).apply {
+ setTitle(getString(R.string.panic_app_dialog_title))
+ setMessage(String.format(getString(R.string.panic_app_dialog_message), app))
+ setNegativeButton(R.string.allow) { _, _ ->
+ PanicResponder.setTriggerPackageName(this@PanicConnectionActivity)
+ setResult(RESULT_OK)
+ }
+ setPositiveButton(R.string.cancel) { _, _ ->
+ setResult(RESULT_CANCELED)
+ finish()
+ }
+ show()
+ }
+ }
+}
diff --git a/app/src/main/java/me/lucky/wasted/PanicResponderActivity.kt b/app/src/main/java/me/lucky/wasted/PanicResponderActivity.kt
new file mode 100644
index 0000000..4962d88
--- /dev/null
+++ b/app/src/main/java/me/lucky/wasted/PanicResponderActivity.kt
@@ -0,0 +1,30 @@
+package me.lucky.wasted
+
+import android.app.admin.DevicePolicyManager
+import android.content.Context
+import android.os.Bundle
+
+import androidx.appcompat.app.AppCompatActivity
+
+import info.guardianproject.panic.Panic
+import info.guardianproject.panic.PanicResponder
+
+class PanicResponderActivity : AppCompatActivity() {
+ private val prefs by lazy { Preferences(this) }
+ private val dpm by lazy {
+ getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ if (!Panic.isTriggerIntent(intent) || !prefs.isServiceEnabled) {
+ finish()
+ return
+ }
+ try {
+ dpm.lockNow()
+ if (PanicResponder.receivedTriggerFromConnectedApp(this) &&
+ prefs.doWipe) dpm.wipeData(0)
+ } catch (exc: SecurityException) {}
+ finish()
+ }
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 60f7e2e..99bc4b0 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,8 +1,13 @@
Wasted
- Turn on Wasted to lock device on panic trigger. The app will listen for broadcast message with this authentication code.
+ Turn on Wasted to lock device on panic trigger. You can use PanicKit or send broadcast message with this authentication code.
Wasted
Allow Wasted to lock device and wipe data on panic trigger
Admin service unavailable
Wipe data
+ Confirm Panic App
+ Are you sure that you want to allow %1$s to trigger destructive panic actions?
+ an unknown app
+ Allow
+ Cancel
diff --git a/fastlane/metadata/android/en-US/changelogs/7.txt b/fastlane/metadata/android/en-US/changelogs/7.txt
index e69de29..24d42a7 100644
--- a/fastlane/metadata/android/en-US/changelogs/7.txt
+++ b/fastlane/metadata/android/en-US/changelogs/7.txt
@@ -0,0 +1 @@
+add PanicKit
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
index e4d6f52..a980eee 100644
--- a/fastlane/metadata/android/en-US/full_description.txt
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -1,4 +1,4 @@
Lock device and wipe data on panic trigger.
-The app will listen for broadcast message with authentication code.
-On receive, using Device Administration API, it locks device and runs wipe.
+You can use PanicKit or send broadcast message with authentication code.
+On trigger, using Device Administration API, it locks device and runs wipe.
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
index c2797de..ea8b0e6 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png differ