aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHan Wang <416810799@qq.com>2019-08-29 15:48:26 +0200
committerHan Wang <416810799@qq.com>2019-08-30 12:25:30 +0200
commitd952ef3afb21394bacafda6fe702186f1df9281f (patch)
tree8cf74f958f8462d9a8e910552cd3ea6bbbf9b7bd
parent453cab629fb4a26fd77aea7bee92cd151950b4f8 (diff)
downloadlineage-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.java80
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;
}
}