This commit is contained in:
lucky 2022-01-12 06:42:55 +03:00
parent 2ab1dce3f2
commit 22fedc85eb
9 changed files with 46 additions and 38 deletions

View File

@ -64,7 +64,7 @@ open class MainActivity : AppCompatActivity() {
wipeESIM.isChecked = prefs.isWipeESIM
wipeESIM.isEnabled = wipeData.isChecked
maxFailedPasswordAttempts.value = prefs.maxFailedPasswordAttempts.toFloat()
wipeOnInactiveSwitch.isChecked = prefs.isWipeOnInactive
wipeOnInactivitySwitch.isChecked = prefs.isWipeOnInactivity
toggle.isChecked = prefs.isServiceEnabled
}
}
@ -91,17 +91,17 @@ open class MainActivity : AppCompatActivity() {
maxFailedPasswordAttempts.addOnChangeListener { _, value, _ ->
prefs.maxFailedPasswordAttempts = value.toInt()
}
wipeOnInactiveSwitch.setOnCheckedChangeListener { _, isChecked ->
if (!setWipeOnInactiveComponentsState(prefs.isServiceEnabled && isChecked)) {
wipeOnInactiveSwitch.isChecked = false
wipeOnInactivitySwitch.setOnCheckedChangeListener { _, isChecked ->
if (!setWipeOnInactivityComponentsState(prefs.isServiceEnabled && isChecked)) {
wipeOnInactivitySwitch.isChecked = false
showWipeJobServiceStartFailedPopup()
return@setOnCheckedChangeListener
}
prefs.isWipeOnInactive = isChecked
prefs.isWipeOnInactivity = isChecked
}
wipeOnInactiveSwitch.setOnLongClickListener {
showWipeOnInactiveSettings()
wipeOnInactivitySwitch.setOnLongClickListener {
showWipeOnInactivitySettings()
true
}
toggle.setOnCheckedChangeListener { _, isChecked ->
@ -113,19 +113,19 @@ open class MainActivity : AppCompatActivity() {
}
}
private fun showWipeOnInactiveSettings() {
private fun showWipeOnInactivitySettings() {
val items = arrayOf("1", "2", "3", "5", "7", "10", "15", "30")
var days = prefs.wipeOnInactiveDays
var days = prefs.wipeOnInactivityDays
var checked = items.indexOf(days.toString())
if (checked == -1) checked = items
.indexOf(Preferences.DEFAULT_WIPE_ON_INACTIVE_DAYS.toString())
.indexOf(Preferences.DEFAULT_WIPE_ON_INACTIVITY_DAYS.toString())
MaterialAlertDialogBuilder(this)
.setTitle(R.string.wipe_on_inactive_days)
.setTitle(R.string.wipe_on_inactivity_days)
.setSingleChoiceItems(items, checked) { _, which ->
days = items[which].toInt()
}
.setPositiveButton(R.string.ok) { _, _ ->
prefs.wipeOnInactiveDays = days
prefs.wipeOnInactivityDays = days
}
.show()
}
@ -137,7 +137,7 @@ open class MainActivity : AppCompatActivity() {
}
private fun setOn() {
if (!setWipeOnInactiveComponentsState(prefs.isWipeOnInactive)) {
if (!setWipeOnInactivityComponentsState(prefs.isWipeOnInactivity)) {
binding.toggle.isChecked = false
showWipeJobServiceStartFailedPopup()
return
@ -158,7 +158,7 @@ open class MainActivity : AppCompatActivity() {
private fun setOff() {
prefs.isServiceEnabled = false
setCodeReceiverState(false)
setWipeOnInactiveComponentsState(false)
setWipeOnInactivityComponentsState(false)
shortcut.remove()
admin.remove()
}
@ -185,7 +185,7 @@ open class MainActivity : AppCompatActivity() {
}
}
private fun setWipeOnInactiveComponentsState(value: Boolean): Boolean {
private fun setWipeOnInactivityComponentsState(value: Boolean): Boolean {
val result = job.setState(value)
if (result) {
setUnlockServiceState(value)

View File

@ -7,7 +7,7 @@ import androidx.security.crypto.MasterKeys
class Preferences(ctx: Context) {
companion object {
const val DEFAULT_WIPE_ON_INACTIVE_DAYS = 7
const val DEFAULT_WIPE_ON_INACTIVITY_DAYS = 7
private const val SERVICE_ENABLED = "service_enabled"
private const val CODE = "code"
@ -15,12 +15,14 @@ class Preferences(ctx: Context) {
private const val WIPE_DATA = "wipe_data"
private const val WIPE_ESIM = "wipe_esim"
private const val MAX_FAILED_PASSWORD_ATTEMPTS = "max_failed_password_attempts"
private const val WIPE_ON_INACTIVE = "wipe_on_inactive"
private const val WIPE_ON_INACTIVE_DAYS = "wipe_on_inactive_days"
private const val WIPE_ON_INACTIVITY = "wipe_on_inactivity"
private const val WIPE_ON_INACTIVITY_DAYS = "wipe_on_inactivity_days"
private const val FILE_NAME = "sec_shared_prefs"
// migration
private const val DO_WIPE = "do_wipe"
private const val WIPE_ON_INACTIVE = "wipe_on_inactive"
private const val WIPE_ON_INACTIVE_DAYS = "wipe_on_inactive_days"
}
private val mk = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
@ -56,11 +58,17 @@ class Preferences(ctx: Context) {
get() = prefs.getInt(MAX_FAILED_PASSWORD_ATTEMPTS, 0)
set(value) = prefs.edit { putInt(MAX_FAILED_PASSWORD_ATTEMPTS, value) }
var isWipeOnInactive: Boolean
get() = prefs.getBoolean(WIPE_ON_INACTIVE, false)
set(value) = prefs.edit { putBoolean(WIPE_ON_INACTIVE, value) }
var isWipeOnInactivity: Boolean
get() = prefs.getBoolean(
WIPE_ON_INACTIVITY,
prefs.getBoolean(WIPE_ON_INACTIVE, false),
)
set(value) = prefs.edit { putBoolean(WIPE_ON_INACTIVITY, value) }
var wipeOnInactiveDays: Int
get() = prefs.getInt(WIPE_ON_INACTIVE_DAYS, DEFAULT_WIPE_ON_INACTIVE_DAYS)
set(value) = prefs.edit { putInt(WIPE_ON_INACTIVE_DAYS, value) }
var wipeOnInactivityDays: Int
get() = prefs.getInt(
WIPE_ON_INACTIVITY_DAYS,
prefs.getInt(WIPE_ON_INACTIVE_DAYS, DEFAULT_WIPE_ON_INACTIVITY_DAYS),
)
set(value) = prefs.edit { putInt(WIPE_ON_INACTIVITY_DAYS, value) }
}

View File

@ -10,7 +10,7 @@ class RestartReceiver : BroadcastReceiver() {
if (intent.action != Intent.ACTION_BOOT_COMPLETED &&
intent.action != Intent.ACTION_MY_PACKAGE_REPLACED) return
val prefs = Preferences(context)
if (!prefs.isServiceEnabled || !prefs.isWipeOnInactive) return
if (!prefs.isServiceEnabled || !prefs.isWipeOnInactivity) return
ContextCompat.startForegroundService(context, Intent(context, UnlockService::class.java))
}
}

View File

@ -18,7 +18,7 @@ class WipeJobManager(private val ctx: Context) {
fun schedule(): Int {
return jobScheduler.schedule(
JobInfo.Builder(JOB_ID, ComponentName(ctx, WipeJobService::class.java))
.setMinimumLatency(TimeUnit.DAYS.toMillis(prefs.wipeOnInactiveDays.toLong()))
.setMinimumLatency(TimeUnit.DAYS.toMillis(prefs.wipeOnInactivityDays.toLong()))
.setBackoffCriteria(0, JobInfo.BACKOFF_POLICY_LINEAR)
.setPersisted(true)
.build()

View File

@ -6,7 +6,7 @@ import android.app.job.JobService
class WipeJobService : JobService() {
override fun onStartJob(params: JobParameters?): Boolean {
val prefs = Preferences(this)
if (!prefs.isServiceEnabled || !prefs.isWipeOnInactive) return false
if (!prefs.isServiceEnabled || !prefs.isWipeOnInactivity) return false
try {
DeviceAdminManager(this).wipeData()
} catch (exc: SecurityException) {}

View File

@ -98,17 +98,17 @@
android:layout_marginVertical="8dp" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/wipeOnInactiveSwitch"
android:id="@+id/wipeOnInactivitySwitch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@string/wipe_on_inactive_switch" />
android:text="@string/wipe_on_inactivity_switch" />
<TextView
android:id="@+id/description3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/wipe_on_inactive_description" />
android:text="@string/wipe_on_inactivity_description" />
</LinearLayout>
</ScrollView>

View File

@ -15,12 +15,12 @@
<string name="shortcut_label">Паниковать</string>
<string name="max_failed_password_attempts_description">Максимальное количество неудачных попыток ввода пароля.</string>
<string name="max_failed_password_attempts_content_description">Количество</string>
<string name="wipe_on_inactive_switch">Стереть при неактивности</string>
<string name="wipe_on_inactive_description">Стереть данные когда устройство не разблокируется N дней.</string>
<string name="wipe_on_inactive_days">Дней</string>
<string name="wipe_on_inactivity_switch">Стереть при неактивности</string>
<string name="wipe_on_inactivity_description">Стереть данные когда устройство не разблокируется N дней.</string>
<string name="wipe_on_inactivity_days">Дней</string>
<string name="notification_channel_default_name">Дефолт</string>
<string name="ok">OK</string>
<string name="wipe_job_service_description">Стереть данные при условии</string>
<string name="wipe_job_service_description">Стереть данные при неактивности</string>
<string name="wipe_job_service_start_failed_popup">Не удалось запустить службу стирания данных</string>
<string name="unlock_service_description">Получать события разблокировки</string>
<string name="unlock_service_notification_title">Служба Разблокировки</string>

View File

@ -15,12 +15,12 @@
<string name="shortcut_label">Panic</string>
<string name="max_failed_password_attempts_description">Maximum number of failed password attempts.</string>
<string name="max_failed_password_attempts_content_description">Count</string>
<string name="wipe_on_inactive_switch">Wipe on inactive</string>
<string name="wipe_on_inactive_description">Wipe device when it was not unlocked for N days.</string>
<string name="wipe_on_inactive_days">Days</string>
<string name="wipe_on_inactivity_switch">Wipe on inactivity</string>
<string name="wipe_on_inactivity_description">Wipe device when it was not unlocked for N days.</string>
<string name="wipe_on_inactivity_days">Days</string>
<string name="notification_channel_default_name">Default</string>
<string name="ok">OK</string>
<string name="wipe_job_service_description">Wipe device on condition</string>
<string name="wipe_job_service_description">Wipe device on inactivity</string>
<string name="wipe_job_service_start_failed_popup">Failed to start wipe service</string>
<string name="unlock_service_description">Receive unlock events</string>
<string name="unlock_service_notification_title">Unlock Service</string>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 109 KiB