diff options
author | Han Wang <416810799@qq.com> | 2019-08-29 15:48:26 +0200 |
---|---|---|
committer | Han Wang <416810799@qq.com> | 2019-08-30 12:25:30 +0200 |
commit | d952ef3afb21394bacafda6fe702186f1df9281f (patch) | |
tree | 8cf74f958f8462d9a8e910552cd3ea6bbbf9b7bd | |
parent | 453cab629fb4a26fd77aea7bee92cd151950b4f8 (diff) | |
download | lineage-sdk-d952ef3afb21394bacafda6fe702186f1df9281f.tar.gz lineage-sdk-d952ef3afb21394bacafda6fe702186f1df9281f.tar.bz2 lineage-sdk-d952ef3afb21394bacafda6fe702186f1df9281f.zip |
lineage-sdk: Refactor ActionUtils
* Use getFocusedStackInfo() to check active task, also do general
cleanups for this class. Hopefully this will get rid of the
strange issues of "kill foreground app" feature.
Change-Id: Ice1ca8e088ea4fec050fa171d990cb938dd3272c
-rw-r--r-- | sdk/src/java/org/lineageos/internal/util/ActionUtils.java | 80 |
1 files changed, 38 insertions, 42 deletions
diff --git a/sdk/src/java/org/lineageos/internal/util/ActionUtils.java b/sdk/src/java/org/lineageos/internal/util/ActionUtils.java index f7ccc043..a58b9f37 100644 --- a/sdk/src/java/org/lineageos/internal/util/ActionUtils.java +++ b/sdk/src/java/org/lineageos/internal/util/ActionUtils.java @@ -1,6 +1,7 @@ package org.lineageos.internal.util; import android.app.ActivityManager; +import android.app.ActivityManager.StackInfo; import android.app.ActivityManagerNative; import android.app.ActivityOptions; import android.app.IActivityManager; @@ -8,12 +9,9 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.util.Log; -import android.view.HapticFeedbackConstants; -import android.widget.Toast; import org.lineageos.platform.internal.R; @@ -43,43 +41,16 @@ public class ActionUtils { private static boolean killForegroundAppInternal(Context context, int userId) throws RemoteException { - try { - final Intent intent = new Intent(Intent.ACTION_MAIN); - String defaultHomePackage = "com.android.launcher"; - intent.addCategory(Intent.CATEGORY_HOME); - final ResolveInfo res = context.getPackageManager().resolveActivity(intent, 0); - - if (res.activityInfo != null && !res.activityInfo.packageName.equals("android")) { - defaultHomePackage = res.activityInfo.packageName; - } + final String packageName = getForegroundTaskPackageName(context, userId); - IActivityManager am = ActivityManagerNative.getDefault(); - List<ActivityManager.RunningAppProcessInfo> apps = am.getRunningAppProcesses(); - for (ActivityManager.RunningAppProcessInfo appInfo : apps) { - int uid = appInfo.uid; - // Make sure it's a foreground user application (not system, - // root, phone, etc.) - if (uid >= Process.FIRST_APPLICATION_UID && uid <= Process.LAST_APPLICATION_UID - && appInfo.importance == - ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { - if (appInfo.pkgList != null && (appInfo.pkgList.length > 0)) { - for (String pkg : appInfo.pkgList) { - if (!pkg.equals(SYSTEMUI_PACKAGE) - && !pkg.equals(defaultHomePackage)) { - am.forceStopPackage(pkg, UserHandle.USER_CURRENT); - return true; - } - } - } else { - Process.killProcess(appInfo.pid); - return true; - } - } - } - } catch (RemoteException remoteException) { - // Do nothing; just let it go. + if (packageName == null) { + return false; } - return false; + + final IActivityManager am = ActivityManagerNative.getDefault(); + am.forceStopPackage(packageName, UserHandle.USER_CURRENT); + + return true; } /** @@ -120,8 +91,8 @@ public class ActionUtils { private static ActivityManager.RecentTaskInfo getLastTask(Context context, int userId) throws RemoteException { final String defaultHomePackage = resolveCurrentLauncherPackage(context, userId); - final IActivityManager iam = ActivityManager.getService(); - final List<ActivityManager.RecentTaskInfo> tasks = iam.getRecentTasks(5, + final IActivityManager am = ActivityManager.getService(); + final List<ActivityManager.RecentTaskInfo> tasks = am.getRecentTasks(5, ActivityManager.RECENT_IGNORE_UNAVAILABLE, userId).getList(); for (int i = 1; i < tasks.size(); i++) { @@ -132,18 +103,43 @@ public class ActionUtils { String packageName = task.baseIntent.getComponent().getPackageName(); if (!packageName.equals(defaultHomePackage) && !packageName.equals(SYSTEMUI_PACKAGE)) { - return tasks.get(i); + return task; } } return null; } + private static String getForegroundTaskPackageName(Context context, int userId) + throws RemoteException { + final String defaultHomePackage = resolveCurrentLauncherPackage(context, userId); + final IActivityManager am = ActivityManager.getService(); + final StackInfo focusedStack = am.getFocusedStackInfo(); + + if (focusedStack == null || focusedStack.topActivity == null) { + return null; + } + + final String packageName = focusedStack.topActivity.getPackageName(); + if (!packageName.equals(defaultHomePackage) + && !packageName.equals(SYSTEMUI_PACKAGE)) { + return packageName; + } + + return null; + } + private static String resolveCurrentLauncherPackage(Context context, int userId) { final Intent launcherIntent = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME); final PackageManager pm = context.getPackageManager(); final ResolveInfo launcherInfo = pm.resolveActivityAsUser(launcherIntent, 0, userId); - return launcherInfo.activityInfo.packageName; + + if (launcherInfo.activityInfo != null && + !launcherInfo.activityInfo.packageName.equals("android")) { + return launcherInfo.activityInfo.packageName; + } + + return null; } } |