Get current app in background thread

This commit is contained in:
Jonas L 2019-01-28 14:15:46 +01:00
parent ef8849db8b
commit b7bf364aa6
6 changed files with 33 additions and 23 deletions

View file

@ -38,7 +38,7 @@ abstract class PlatformIntegration(
abstract fun showAppLockScreen(currentPackageName: String)
// 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 isScreenOn(): Boolean
abstract fun setShowNotificationToRevokeTemporarilyAllowedApps(show: Boolean)

View file

@ -90,7 +90,7 @@ class AndroidIntegration(context: Context): PlatformIntegration(maximumProtectio
return AdminStatus.getAdminStatus(context, policyManager)
}
override fun getForegroundAppPackageName(): String? {
override suspend fun getForegroundAppPackageName(): String? {
return foregroundAppHelper.getForegroundAppPackage()
}

View file

@ -22,7 +22,7 @@ import io.timelimit.android.integration.platform.RuntimePermissionStatus
class CompatForegroundAppHelper(context: Context) : ForegroundAppHelper() {
private val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
override fun getForegroundAppPackage(): String? {
override suspend fun getForegroundAppPackage(): String? {
return try {
activityManager.getRunningTasks(1)[0].topActivity.packageName
} catch (ex: NullPointerException) {

View file

@ -20,7 +20,7 @@ import android.os.Build
import io.timelimit.android.integration.platform.RuntimePermissionStatus
abstract class ForegroundAppHelper {
abstract fun getForegroundAppPackage(): String?
abstract suspend fun getForegroundAppPackage(): String?
abstract fun getPermissionStatus(): RuntimePermissionStatus
companion object {

View file

@ -21,44 +21,54 @@ import android.app.usage.UsageEvents
import android.app.usage.UsageStatsManager
import android.content.Context
import android.os.Build
import io.timelimit.android.async.Threads
import io.timelimit.android.coroutines.executeAndWait
import io.timelimit.android.integration.platform.RuntimePermissionStatus
import java.util.concurrent.Executor
import java.util.concurrent.Executors
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
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 appOpsManager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
@Throws(SecurityException::class)
override fun getForegroundAppPackage(): String? {
override suspend fun getForegroundAppPackage(): String? {
if (getPermissionStatus() == RuntimePermissionStatus.NotGranted) {
throw SecurityException()
}
val time = System.currentTimeMillis()
// query data for last 7 days
val usageEvents = usageStatsManager.queryEvents(time - 1000 * 60 * 60 * 24 * 7, time)
return foregroundAppThread.executeAndWait {
val time = System.currentTimeMillis()
// query data for last 7 days
val usageEvents = usageStatsManager.queryEvents(time - 1000 * 60 * 60 * 24 * 7, time)
if (usageEvents != null) {
val event = UsageEvents.Event()
if (usageEvents != null) {
val event = UsageEvents.Event()
var lastTime: Long = 0
var lastPackage: String? = null
var lastTime: Long = 0
var lastPackage: String? = null
while (usageEvents.hasNextEvent()) {
usageEvents.getNextEvent(event)
while (usageEvents.hasNextEvent()) {
usageEvents.getNextEvent(event)
if (event.eventType == UsageEvents.Event.MOVE_TO_FOREGROUND) {
if (event.timeStamp > lastTime) {
lastTime = event.timeStamp
lastPackage = event.packageName
if (event.eventType == UsageEvents.Event.MOVE_TO_FOREGROUND) {
if (event.timeStamp > lastTime) {
lastTime = event.timeStamp
lastPackage = event.packageName
}
}
}
lastPackage
} else {
null
}
return lastPackage
}
return null
}
override fun getPermissionStatus(): RuntimePermissionStatus {

View file

@ -80,7 +80,7 @@ class DummyIntegration(
}
}
override fun getForegroundAppPackageName(): String? {
override suspend fun getForegroundAppPackageName(): String? {
if (foregroundAppPermission == RuntimePermissionStatus.NotGranted) {
throw SecurityException()
}