@@ -2,6 +2,7 @@ package io.github.sds100.keymapper.system.apps
22
33import android.annotation.SuppressLint
44import android.app.ActivityOptions
5+ import android.app.KeyguardManager
56import android.app.PendingIntent
67import android.content.ActivityNotFoundException
78import android.content.BroadcastReceiver
@@ -48,6 +49,10 @@ class AndroidPackageManagerAdapter @Inject constructor(
4849 private val ctx: Context = context.applicationContext
4950 private val packageManager: PackageManager = ctx.packageManager
5051
52+ private val keyguardManager: KeyguardManager by lazy {
53+ ctx.getSystemService(KeyguardManager ::class .java)
54+ }
55+
5156 private val fetchPackages: MutableSharedFlow <Unit > = MutableSharedFlow ()
5257 override val onPackagesChanged: MutableSharedFlow <Unit > = MutableSharedFlow ()
5358 override val installedPackages = MutableStateFlow <State <List <PackageInfo >>>(State .Loading )
@@ -62,7 +67,7 @@ class AndroidPackageManagerAdapter @Inject constructor(
6267 Intent .ACTION_PACKAGE_ADDED ,
6368 Intent .ACTION_PACKAGE_REMOVED ,
6469 Intent .ACTION_PACKAGE_REPLACED ,
65- -> {
70+ -> {
6671 coroutineScope.launch {
6772 fetchPackages.emit(Unit )
6873 onPackagesChanged.emit(Unit )
@@ -233,10 +238,10 @@ class AndroidPackageManagerAdapter @Inject constructor(
233238 val leanbackIntent = packageManager.getLeanbackLaunchIntentForPackage(packageName)
234239 val normalIntent = packageManager.getLaunchIntentForPackage(packageName)
235240
236- val intent = leanbackIntent ? : normalIntent
241+ val packageIntent = leanbackIntent ? : normalIntent
237242
238243 // intent = null if the app doesn't exist
239- if (intent == null ) {
244+ if (packageIntent == null ) {
240245 try {
241246 val appInfo = ctx.packageManager.getApplicationInfo(packageName, 0 )
242247
@@ -250,12 +255,18 @@ class AndroidPackageManagerAdapter @Inject constructor(
250255 return KMError .AppNotFound (packageName)
251256 }
252257 } else {
253- val pendingIntent = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
254- PendingIntent .getActivity(ctx, 0 , intent, PendingIntent .FLAG_IMMUTABLE )
258+ // Use a trampoline activity that will dismiss the keyguard when it is locked.
259+ val intent = if (keyguardManager.isKeyguardLocked) {
260+ Intent (ctx, TrampolineActivity ::class .java).apply {
261+ putExtra(TrampolineActivity .EXTRA_INTENT , packageIntent)
262+ }
255263 } else {
256- PendingIntent .getActivity(ctx, 0 , intent, 0 )
264+ packageIntent
257265 }
258266
267+ val pendingIntent =
268+ PendingIntent .getActivity(ctx, 0 , intent, PendingIntent .FLAG_IMMUTABLE )
269+
259270 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
260271 val bundle = ActivityOptions .makeBasic()
261272 .setPendingIntentBackgroundActivityStartMode(
0 commit comments