mirror of
https://codeberg.org/timelimit/opentimelimit-android.git
synced 2025-10-05 10:49:29 +02:00
Get current app in background thread
This commit is contained in:
parent
ef8849db8b
commit
b7bf364aa6
6 changed files with 33 additions and 23 deletions
|
@ -38,7 +38,7 @@ abstract class PlatformIntegration(
|
||||||
|
|
||||||
abstract fun showAppLockScreen(currentPackageName: String)
|
abstract fun showAppLockScreen(currentPackageName: String)
|
||||||
// this should throw an SecurityException if the permission is missing
|
// this should throw an SecurityException if the permission is missing
|
||||||
abstract fun getForegroundAppPackageName(): String?
|
abstract suspend fun getForegroundAppPackageName(): String?
|
||||||
abstract fun setAppStatusMessage(message: AppStatusMessage?)
|
abstract fun setAppStatusMessage(message: AppStatusMessage?)
|
||||||
abstract fun isScreenOn(): Boolean
|
abstract fun isScreenOn(): Boolean
|
||||||
abstract fun setShowNotificationToRevokeTemporarilyAllowedApps(show: Boolean)
|
abstract fun setShowNotificationToRevokeTemporarilyAllowedApps(show: Boolean)
|
||||||
|
|
|
@ -90,7 +90,7 @@ class AndroidIntegration(context: Context): PlatformIntegration(maximumProtectio
|
||||||
return AdminStatus.getAdminStatus(context, policyManager)
|
return AdminStatus.getAdminStatus(context, policyManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getForegroundAppPackageName(): String? {
|
override suspend fun getForegroundAppPackageName(): String? {
|
||||||
return foregroundAppHelper.getForegroundAppPackage()
|
return foregroundAppHelper.getForegroundAppPackage()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ import io.timelimit.android.integration.platform.RuntimePermissionStatus
|
||||||
class CompatForegroundAppHelper(context: Context) : ForegroundAppHelper() {
|
class CompatForegroundAppHelper(context: Context) : ForegroundAppHelper() {
|
||||||
private val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
|
private val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
|
||||||
|
|
||||||
override fun getForegroundAppPackage(): String? {
|
override suspend fun getForegroundAppPackage(): String? {
|
||||||
return try {
|
return try {
|
||||||
activityManager.getRunningTasks(1)[0].topActivity.packageName
|
activityManager.getRunningTasks(1)[0].topActivity.packageName
|
||||||
} catch (ex: NullPointerException) {
|
} catch (ex: NullPointerException) {
|
||||||
|
|
|
@ -20,7 +20,7 @@ import android.os.Build
|
||||||
import io.timelimit.android.integration.platform.RuntimePermissionStatus
|
import io.timelimit.android.integration.platform.RuntimePermissionStatus
|
||||||
|
|
||||||
abstract class ForegroundAppHelper {
|
abstract class ForegroundAppHelper {
|
||||||
abstract fun getForegroundAppPackage(): String?
|
abstract suspend fun getForegroundAppPackage(): String?
|
||||||
abstract fun getPermissionStatus(): RuntimePermissionStatus
|
abstract fun getPermissionStatus(): RuntimePermissionStatus
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -21,44 +21,54 @@ import android.app.usage.UsageEvents
|
||||||
import android.app.usage.UsageStatsManager
|
import android.app.usage.UsageStatsManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import io.timelimit.android.async.Threads
|
||||||
|
import io.timelimit.android.coroutines.executeAndWait
|
||||||
import io.timelimit.android.integration.platform.RuntimePermissionStatus
|
import io.timelimit.android.integration.platform.RuntimePermissionStatus
|
||||||
|
import java.util.concurrent.Executor
|
||||||
|
import java.util.concurrent.Executors
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
class LollipopForegroundAppHelper(private val context: Context) : ForegroundAppHelper() {
|
class LollipopForegroundAppHelper(private val context: Context) : ForegroundAppHelper() {
|
||||||
|
companion object {
|
||||||
|
private val foregroundAppThread: Executor by lazy { Executors.newSingleThreadExecutor() }
|
||||||
|
}
|
||||||
|
|
||||||
private val usageStatsManager = context.getSystemService(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) Context.USAGE_STATS_SERVICE else "usagestats") as UsageStatsManager
|
private val usageStatsManager = context.getSystemService(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) Context.USAGE_STATS_SERVICE else "usagestats") as UsageStatsManager
|
||||||
private val appOpsManager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
|
private val appOpsManager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
|
||||||
|
|
||||||
@Throws(SecurityException::class)
|
@Throws(SecurityException::class)
|
||||||
override fun getForegroundAppPackage(): String? {
|
override suspend fun getForegroundAppPackage(): String? {
|
||||||
if (getPermissionStatus() == RuntimePermissionStatus.NotGranted) {
|
if (getPermissionStatus() == RuntimePermissionStatus.NotGranted) {
|
||||||
throw SecurityException()
|
throw SecurityException()
|
||||||
}
|
}
|
||||||
|
|
||||||
val time = System.currentTimeMillis()
|
return foregroundAppThread.executeAndWait {
|
||||||
// query data for last 7 days
|
val time = System.currentTimeMillis()
|
||||||
val usageEvents = usageStatsManager.queryEvents(time - 1000 * 60 * 60 * 24 * 7, time)
|
// query data for last 7 days
|
||||||
|
val usageEvents = usageStatsManager.queryEvents(time - 1000 * 60 * 60 * 24 * 7, time)
|
||||||
|
|
||||||
if (usageEvents != null) {
|
if (usageEvents != null) {
|
||||||
val event = UsageEvents.Event()
|
val event = UsageEvents.Event()
|
||||||
|
|
||||||
var lastTime: Long = 0
|
var lastTime: Long = 0
|
||||||
var lastPackage: String? = null
|
var lastPackage: String? = null
|
||||||
|
|
||||||
while (usageEvents.hasNextEvent()) {
|
while (usageEvents.hasNextEvent()) {
|
||||||
usageEvents.getNextEvent(event)
|
usageEvents.getNextEvent(event)
|
||||||
|
|
||||||
if (event.eventType == UsageEvents.Event.MOVE_TO_FOREGROUND) {
|
if (event.eventType == UsageEvents.Event.MOVE_TO_FOREGROUND) {
|
||||||
if (event.timeStamp > lastTime) {
|
if (event.timeStamp > lastTime) {
|
||||||
lastTime = event.timeStamp
|
lastTime = event.timeStamp
|
||||||
lastPackage = event.packageName
|
lastPackage = event.packageName
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lastPackage
|
||||||
|
} else {
|
||||||
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
return lastPackage
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getPermissionStatus(): RuntimePermissionStatus {
|
override fun getPermissionStatus(): RuntimePermissionStatus {
|
||||||
|
|
|
@ -80,7 +80,7 @@ class DummyIntegration(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getForegroundAppPackageName(): String? {
|
override suspend fun getForegroundAppPackageName(): String? {
|
||||||
if (foregroundAppPermission == RuntimePermissionStatus.NotGranted) {
|
if (foregroundAppPermission == RuntimePermissionStatus.NotGranted) {
|
||||||
throw SecurityException()
|
throw SecurityException()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue