mirror of
https://codeberg.org/timelimit/timelimit-android.git
synced 2025-10-05 02:39:30 +02:00
Add option to annoy user after manipulation
This commit is contained in:
parent
31c49c8195
commit
1ff5ab6575
14 changed files with 311 additions and 9 deletions
|
@ -19,6 +19,7 @@ import android.util.Log
|
|||
import android.util.SparseArray
|
||||
import android.util.SparseLongArray
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import io.timelimit.android.BuildConfig
|
||||
import io.timelimit.android.R
|
||||
import io.timelimit.android.async.Threads
|
||||
|
@ -37,6 +38,7 @@ import io.timelimit.android.integration.platform.android.AndroidIntegrationApps
|
|||
import io.timelimit.android.livedata.*
|
||||
import io.timelimit.android.sync.actions.UpdateDeviceStatusAction
|
||||
import io.timelimit.android.sync.actions.apply.ApplyActionUtil
|
||||
import io.timelimit.android.ui.IsAppInForeground
|
||||
import io.timelimit.android.util.AndroidVersion
|
||||
import io.timelimit.android.util.TimeTextUtil
|
||||
import io.timelimit.android.work.PeriodicSyncInBackgroundWorker
|
||||
|
@ -67,6 +69,7 @@ class BackgroundTaskLogic(val appLogic: AppLogic) {
|
|||
runAsyncExpectForever { backgroundServiceLoop() }
|
||||
runAsyncExpectForever { syncDeviceStatusLoop() }
|
||||
runAsyncExpectForever { backupDatabaseLoop() }
|
||||
runAsyncExpectForever { annoyUserOnManipulationLoop() }
|
||||
runAsync {
|
||||
// this is effective after an reboot
|
||||
|
||||
|
@ -691,4 +694,66 @@ class BackgroundTaskLogic(val appLogic: AppLogic) {
|
|||
appLogic.timeApi.sleep(1000 * 60 * 60 * 3 /* 3 hours */)
|
||||
}
|
||||
}
|
||||
|
||||
// first time: annoy for 20 seconds; free for 5 minutes
|
||||
// second time: annoy for 30 seconds; free for 2 minutes
|
||||
// third time: annoy for 1 minute; free for 1 minute
|
||||
// then: annoy for 2 minutes; free for 1 minute
|
||||
private suspend fun annoyUserOnManipulationLoop() {
|
||||
val isManipulated = appLogic.deviceEntryIfEnabled.map { it?.hasActiveManipulationWarning ?: false }
|
||||
val enableAnnoy = appLogic.database.config().isExperimentalFlagsSetAsync(ExperimentalFlags.MANIPULATION_ANNOY_USER)
|
||||
val timeLimitNotActive = IsAppInForeground.isRunning.invert()
|
||||
|
||||
var counter = 0
|
||||
var globalCounter = 0
|
||||
|
||||
val shouldAnnoyNow = isManipulated.and(enableAnnoy).and(timeLimitNotActive)
|
||||
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(LOG_TAG, "delay before enabling annoying")
|
||||
}
|
||||
|
||||
delay(1000 * 15)
|
||||
|
||||
while (true) {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(LOG_TAG, "wait until should annoy")
|
||||
}
|
||||
|
||||
shouldAnnoyNow.waitUntilValueMatches { it == true }
|
||||
|
||||
val annoyDurationInSeconds = when (counter) {
|
||||
0 -> 20
|
||||
1 -> 30
|
||||
2 -> 60
|
||||
else -> 120
|
||||
}
|
||||
|
||||
val freeDurationInSeconds = when (counter) {
|
||||
0 -> 5 * 60
|
||||
1 -> 2 * 60
|
||||
else -> 60
|
||||
}
|
||||
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(LOG_TAG, "annoy for $annoyDurationInSeconds seconds; free for $freeDurationInSeconds seconds")
|
||||
}
|
||||
|
||||
appLogic.platformIntegration.showAnnoyScreen(annoyDurationInSeconds.toLong())
|
||||
|
||||
counter++
|
||||
globalCounter++
|
||||
|
||||
// reset counter if there was nothing for one hour
|
||||
val globalCounterBackup = globalCounter
|
||||
appLogic.timeApi.runDelayed(Runnable {
|
||||
if (globalCounter == globalCounterBackup) {
|
||||
counter = 0
|
||||
}
|
||||
}, 1000 * 60 * 60 /* 1 hour */)
|
||||
|
||||
// wait before annoying next time
|
||||
delay((annoyDurationInSeconds + freeDurationInSeconds) * 1000L)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue