Fix #155437855: "dumpsys activity" package filtering doesn't filter everything

Clean up various code paths to correctly use the "packageName" option to
limit its output to only information about that package.

Also do a little re-arranging of the output to cleanup a bit recent
stuff that was added, so the end of the output is still the important
high-level summary of process states.

Bug: 155437855
Test: manually inspected various "dumpsys activity" output.
Change-Id: I2ebe6f7ab3d433281993eb3959d375e2e53e0df9
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 0bd134c..8d35152 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -10535,12 +10535,14 @@
             }
             mAtmInternal.dump(
                     DUMP_STARTER_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
-            pw.println();
-            if (dumpAll) {
-                pw.println("-------------------------------------------------------------------------------");
+            if (dumpPackage == null) {
+                pw.println();
+                if (dumpAll) {
+                    pw.println("-------------------------------------------------------------------------------");
+                }
+                mAtmInternal.dump(
+                        DUMP_CONTAINERS_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
             }
-            mAtmInternal.dump(
-                    DUMP_CONTAINERS_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
             // Activities section is dumped as part of the Critical priority dump. Exclude the
             // section if priority is Normal.
             if (!dumpNormalPriority) {
@@ -10558,6 +10560,11 @@
                 }
                 dumpAssociationsLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
             }
+            pw.println();
+            if (dumpAll) {
+                pw.println("-------------------------------------------------------------------------------");
+            }
+            mProcessList.mAppExitInfoTracker.dumpHistoryProcessExitInfo(pw, dumpPackage);
             if (dumpPackage == null) {
                 pw.println();
                 if (dumpAll) {
@@ -10574,17 +10581,6 @@
             if (dumpAll) {
                 pw.println("-------------------------------------------------------------------------------");
             }
-            dumpLruLocked(pw, dumpPackage);
-            pw.println();
-            if (dumpAll) {
-                pw.println("-------------------------------------------------------------------------------");
-            }
-            mProcessList.mAppExitInfoTracker.dumpHistoryProcessExitInfo(pw, dumpPackage);
-            pw.println();
-            if (dumpAll) {
-                pw.println("-------------------------------------------------------------------"
-                        + "------------");
-            }
             dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage, dumpAppId);
             pw.println();
             if (dumpAll) {
@@ -10788,7 +10784,7 @@
                 }
             } else if ("oom".equals(cmd) || "o".equals(cmd)) {
                 synchronized (this) {
-                    dumpOomLocked(fd, pw, args, opti, true);
+                    dumpOomLocked(fd, pw, false, args, opti, true, dumpPackage, true);
                 }
             } else if ("lmk".equals(cmd)) {
                 synchronized (this) {
@@ -10796,11 +10792,11 @@
                 }
             } else if ("lru".equals(cmd)) {
                 synchronized (this) {
-                    dumpLruLocked(pw, null);
+                    dumpLruLocked(pw, dumpPackage, null);
                 }
             } else if ("permissions".equals(cmd) || "perm".equals(cmd)) {
                 synchronized (this) {
-                    dumpPermissionsLocked(fd, pw, args, opti, true, null);
+                    dumpPermissionsLocked(fd, pw, args, opti, true, dumpPackage);
                 }
             } else if ("provider".equals(cmd)) {
                 String[] newArgs;
@@ -10820,7 +10816,7 @@
                 }
             } else if ("providers".equals(cmd) || "prov".equals(cmd)) {
                 synchronized (this) {
-                    dumpProvidersLocked(fd, pw, args, opti, true, null);
+                    dumpProvidersLocked(fd, pw, args, opti, true, dumpPackage);
                 }
             } else if ("service".equals(cmd)) {
                 String[] newArgs;
@@ -11106,8 +11102,9 @@
                 "  Counts of Binder Proxies held by SYSTEM");
     }
 
-    void dumpLruEntryLocked(PrintWriter pw, int index, ProcessRecord proc) {
-        pw.print("    #");
+    void dumpLruEntryLocked(PrintWriter pw, int index, ProcessRecord proc, String prefix) {
+        pw.print(prefix);
+        pw.print("#");
         pw.print(index);
         pw.print(": ");
         pw.print(ProcessList.makeOomAdjString(proc.setAdj, false));
@@ -11149,9 +11146,29 @@
     }
 
     // TODO: Move to ProcessList?
-    void dumpLruLocked(PrintWriter pw, String dumpPackage) {
-        pw.println("ACTIVITY MANAGER LRU PROCESSES (dumpsys activity lru)");
+    boolean dumpLruLocked(PrintWriter pw, String dumpPackage, String prefix) {
         final int N = mProcessList.mLruProcesses.size();
+        final String innerPrefix;
+        if (prefix == null) {
+            pw.println("ACTIVITY MANAGER LRU PROCESSES (dumpsys activity lru)");
+            innerPrefix = "  ";
+        } else {
+            boolean haveAny = false;
+            for (int i = N - 1; i >= 0; i--) {
+                final ProcessRecord r = mProcessList.mLruProcesses.get(i);
+                if (dumpPackage != null && !r.pkgList.containsKey(dumpPackage)) {
+                    continue;
+                }
+                haveAny = true;
+                break;
+            }
+            if (!haveAny) {
+                return false;
+            }
+            pw.print(prefix);
+            pw.println("Raw LRU list (dumpsys activity lru):");
+            innerPrefix = prefix + "  ";
+        }
         int i;
         boolean first = true;
         for (i = N - 1; i >= mProcessList.mLruProcessActivityStart; i--) {
@@ -11160,10 +11177,11 @@
                 continue;
             }
             if (first) {
-                pw.println("  Activities:");
+                pw.print(innerPrefix);
+                pw.println("Activities:");
                 first = false;
             }
-            dumpLruEntryLocked(pw, i, r);
+            dumpLruEntryLocked(pw, i, r, innerPrefix);
         }
         first = true;
         for (; i >= mProcessList.mLruProcessServiceStart; i--) {
@@ -11172,10 +11190,11 @@
                 continue;
             }
             if (first) {
-                pw.println("  Services:");
+                pw.print(innerPrefix);
+                pw.println("Services:");
                 first = false;
             }
-            dumpLruEntryLocked(pw, i, r);
+            dumpLruEntryLocked(pw, i, r, innerPrefix);
         }
         first = true;
         for (; i >= 0; i--) {
@@ -11184,11 +11203,13 @@
                 continue;
             }
             if (first) {
-                pw.println("  Other:");
+                pw.print(innerPrefix);
+                pw.println("Other:");
                 first = false;
             }
-            dumpLruEntryLocked(pw, i, r);
+            dumpLruEntryLocked(pw, i, r, innerPrefix);
         }
+        return true;
     }
 
     // TODO: Move to ProcessList?
@@ -11200,7 +11221,7 @@
 
         pw.println("ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)");
 
-        if (dumpAll) {
+        if (dumpAll || dumpPackage != null) {
             final int NP = mProcessList.mProcessNames.getMap().size();
             for (int ip=0; ip<NP; ip++) {
                 SparseArray<ProcessRecord> procs = mProcessList.mProcessNames.getMap().valueAt(ip);
@@ -11267,6 +11288,12 @@
             }
         }
 
+        if (dumpOomLocked(fd, pw, needSep, args, opti, dumpAll, dumpPackage, false)) {
+            needSep = true;
+        }
+
+        needSep = dumpProcessesToGc(pw, needSep, dumpPackage);
+
         if (mProcessList.mActiveUids.size() > 0) {
             if (dumpUids(pw, dumpPackage, dumpAppId, mProcessList.mActiveUids,
                     "UID states:", needSep)) {
@@ -11283,6 +11310,13 @@
             }
         }
 
+        if (needSep) {
+            pw.println();
+        }
+        if (dumpLruLocked(pw, dumpPackage, "  ")) {
+            needSep = true;
+        }
+
         if (mProcessList.getLruSizeLocked() > 0) {
             if (needSep) {
                 pw.println();
@@ -11387,8 +11421,6 @@
                     "OnHold Norm", "OnHold PERS", dumpPackage);
         }
 
-        needSep = dumpProcessesToGc(pw, needSep, dumpPackage);
-
         needSep = mAppErrors.dumpLocked(fd, pw, needSep, dumpPackage);
 
         needSep = mAtmInternal.dumpForProcesses(fd, pw, dumpAll, dumpPackage, dumpAppId, needSep,
@@ -11931,10 +11963,8 @@
         pw.println(")");
     }
 
-    boolean dumpOomLocked(FileDescriptor fd, PrintWriter pw, String[] args,
-            int opti, boolean dumpAll) {
-        boolean needSep = false;
-
+    boolean dumpOomLocked(FileDescriptor fd, PrintWriter pw, boolean needSep, String[] args,
+            int opti, boolean dumpAll, String dumpPackage, boolean inclGc) {
         if (mProcessList.getLruSizeLocked() > 0) {
             if (needSep) pw.println();
             needSep = true;
@@ -11965,11 +11995,11 @@
                             - mProcessList.mLruProcessServiceStart);
                     pw.println("):");
             dumpProcessOomList(pw, this, mProcessList.mLruProcesses, "    ", "Proc", "PERS", true,
-                    null);
+                    dumpPackage);
             needSep = true;
         }
 
-        dumpProcessesToGc(pw, needSep, null);
+        dumpProcessesToGc(pw, needSep, dumpPackage);
 
         pw.println();
         mAtmInternal.dumpForOom(pw);
diff --git a/services/core/java/com/android/server/am/AppExitInfoTracker.java b/services/core/java/com/android/server/am/AppExitInfoTracker.java
index 0c3d02d..02fb34e 100644
--- a/services/core/java/com/android/server/am/AppExitInfoTracker.java
+++ b/services/core/java/com/android/server/am/AppExitInfoTracker.java
@@ -785,7 +785,7 @@
     }
 
     void dumpHistoryProcessExitInfo(PrintWriter pw, String packageName) {
-        pw.println("ACTIVITY MANAGER LRU PROCESSES (dumpsys activity exit-info)");
+        pw.println("ACTIVITY MANAGER PROCESS EXIT INFO (dumpsys activity exit-info)");
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
         synchronized (mLock) {
             pw.println("Last Timestamp of Persistence Into Persistent Storage: "
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 9edc03e..5df84f2 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -803,7 +803,7 @@
                 pw.print(" icon=0x"); pw.print(Integer.toHexString(icon));
                 pw.print(" theme=0x"); pw.println(Integer.toHexString(theme));
         pw.println(prefix + "mLastReportedConfigurations:");
-        mLastReportedConfiguration.dump(pw, prefix + " ");
+        mLastReportedConfiguration.dump(pw, prefix + "  ");
 
         pw.print(prefix); pw.print("CurrentConfiguration="); pw.println(getConfiguration());
         if (!getRequestedOverrideConfiguration().equals(EMPTY)) {
@@ -839,7 +839,7 @@
                         pw.print(" iconFilename="); pw.print(taskDescription.getIconFilename());
                         pw.print(" primaryColor=");
                         pw.println(Integer.toHexString(taskDescription.getPrimaryColor()));
-                        pw.print(prefix + " backgroundColor=");
+                        pw.print(prefix); pw.print("  backgroundColor=");
                         pw.print(Integer.toHexString(taskDescription.getBackgroundColor()));
                         pw.print(" statusBarColor=");
                         pw.print(Integer.toHexString(taskDescription.getStatusBarColor()));
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 68c6627..d71381e 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -162,6 +162,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Consumer;
 
 /**
@@ -2802,67 +2803,91 @@
     }
 
     boolean dump(FileDescriptor fd, PrintWriter pw, boolean dumpAll, boolean dumpClient,
-            String dumpPackage, boolean needSep) {
-        pw.println("  Stack #" + getRootTaskId()
-                + ": type=" + activityTypeToString(getActivityType())
-                + " mode=" + windowingModeToString(getWindowingMode()));
-        pw.println("  isSleeping=" + shouldSleepActivities());
-        pw.println("  mBounds=" + getRequestedOverrideBounds());
-
-        boolean printed = dumpActivities(fd, pw, dumpAll, dumpClient, dumpPackage, needSep);
-
-        needSep = printed;
-        boolean pr = printThisActivity(pw, mPausingActivity, dumpPackage, needSep,
-                "    mPausingActivity: ");
-        if (pr) {
-            printed = true;
-            needSep = false;
-        }
-        pr = printThisActivity(pw, getResumedActivity(), dumpPackage, needSep,
-                "    mResumedActivity: ");
-        if (pr) {
-            printed = true;
-            needSep = false;
-        }
-        if (dumpAll) {
-            pr = printThisActivity(pw, mLastPausedActivity, dumpPackage, needSep,
-                    "    mLastPausedActivity: ");
-            if (pr) {
-                printed = true;
-                needSep = true;
+            String dumpPackage, final boolean needSep) {
+        Runnable headerPrinter = () -> {
+            if (needSep) {
+                pw.println();
             }
-            printed |= printThisActivity(pw, mLastNoHistoryActivity, dumpPackage,
-                    needSep, "    mLastNoHistoryActivity: ");
+            pw.println("  Stack #" + getRootTaskId()
+                    + ": type=" + activityTypeToString(getActivityType())
+                    + " mode=" + windowingModeToString(getWindowingMode()));
+            pw.println("  isSleeping=" + shouldSleepActivities());
+            pw.println("  mBounds=" + getRequestedOverrideBounds());
+        };
+
+        boolean printed = false;
+
+        if (dumpPackage == null) {
+            // If we are not filtering by package, we want to print absolutely everything,
+            // so always print the header even if there are no tasks/activities inside.
+            headerPrinter.run();
+            headerPrinter = null;
+            printed = true;
         }
+
+        printed |= printThisActivity(pw, mPausingActivity, dumpPackage, false,
+                "    mPausingActivity: ", null);
+        printed |= printThisActivity(pw, getResumedActivity(), dumpPackage, false,
+                "    mResumedActivity: ", null);
+        if (dumpAll) {
+            printed |= printThisActivity(pw, mLastPausedActivity, dumpPackage, false,
+                    "    mLastPausedActivity: ", null);
+            printed |= printThisActivity(pw, mLastNoHistoryActivity, dumpPackage,
+                    false, "    mLastNoHistoryActivity: ", null);
+        }
+
+        printed |= dumpActivities(fd, pw, dumpAll, dumpClient, dumpPackage, false, headerPrinter);
+
         return printed;
     }
 
     private boolean dumpActivities(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
-            boolean dumpClient, String dumpPackage, boolean needSep) {
+            boolean dumpClient, String dumpPackage, boolean needSep, Runnable header) {
         if (!hasChild()) {
             return false;
         }
-        final String prefix = "    ";
+        final AtomicBoolean printedHeader = new AtomicBoolean(false);
+        final AtomicBoolean printed = new AtomicBoolean(false);
         forAllLeafTasks((task) -> {
-            if (needSep) {
-                pw.println("");
+            final String prefix = "    ";
+            Runnable headerPrinter = () -> {
+                printed.set(true);
+                if (!printedHeader.get()) {
+                    if (needSep) {
+                        pw.println("");
+                    }
+                    if (header != null) {
+                        header.run();
+                    }
+                    printedHeader.set(true);
+                }
+                pw.print(prefix); pw.print("* "); pw.println(task);
+                pw.print(prefix); pw.print("  mBounds=");
+                pw.println(task.getRequestedOverrideBounds());
+                pw.print(prefix); pw.print("  mMinWidth="); pw.print(task.mMinWidth);
+                pw.print(" mMinHeight="); pw.println(task.mMinHeight);
+                if (mLastNonFullscreenBounds != null) {
+                    pw.print(prefix);
+                    pw.print("  mLastNonFullscreenBounds=");
+                    pw.println(task.mLastNonFullscreenBounds);
+                }
+                task.dump(pw, prefix + "  ");
+            };
+            if (dumpPackage == null) {
+                // If we are not filtering by package, we want to print absolutely everything,
+                // so always print the header even if there are no activities inside.
+                headerPrinter.run();
+                headerPrinter = null;
             }
-            pw.println(prefix + "Task id #" + task.mTaskId);
-            pw.println(prefix + "mBounds=" + task.getRequestedOverrideBounds());
-            pw.println(prefix + "mMinWidth=" + task.mMinWidth);
-            pw.println(prefix + "mMinHeight=" + task.mMinHeight);
-            pw.println(prefix + "mLastNonFullscreenBounds=" + task.mLastNonFullscreenBounds);
-            pw.println(prefix + "* " + task);
-            task.dump(pw, prefix + "  ");
             final ArrayList<ActivityRecord> activities = new ArrayList<>();
             // Add activities by traversing the hierarchy from bottom to top, since activities
             // are dumped in reverse order in {@link ActivityStackSupervisor#dumpHistoryList()}.
             task.forAllActivities((Consumer<ActivityRecord>) activities::add,
                     false /* traverseTopToBottom */);
             dumpHistoryList(fd, pw, activities, prefix, "Hist", true, !dumpAll, dumpClient,
-                    dumpPackage, false, null, task);
+                    dumpPackage, false, headerPrinter, task);
         }, true /* traverseTopToBottom */);
-        return true;
+        return printed.get();
     }
 
     ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index 6f0a339..f692660 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -1937,12 +1937,15 @@
     }
 
     static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage,
-            boolean needSep, String prefix) {
+            boolean needSep, String prefix, Runnable header) {
         if (activity != null) {
             if (dumpPackage == null || dumpPackage.equals(activity.packageName)) {
                 if (needSep) {
                     pw.println();
                 }
+                if (header != null) {
+                    header.run();
+                }
                 pw.print(prefix);
                 pw.println(activity);
                 return true;
@@ -1953,7 +1956,7 @@
 
     static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
             String prefix, String label, boolean complete, boolean brief, boolean client,
-            String dumpPackage, boolean needNL, String header, Task lastTask) {
+            String dumpPackage, boolean needNL, Runnable header, Task lastTask) {
         String innerPrefix = null;
         String[] args = null;
         boolean printed = false;
@@ -1973,7 +1976,7 @@
                 needNL = false;
             }
             if (header != null) {
-                pw.println(header);
+                header.run();
                 header = null;
             }
             if (lastTask != r.getTask()) {
diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java
index 7fad395..dfa3fe0 100644
--- a/services/core/java/com/android/server/wm/ActivityStartController.java
+++ b/services/core/java/com/android/server/wm/ActivityStartController.java
@@ -549,19 +549,28 @@
         return mPendingRemoteAnimationRegistry;
     }
 
-    void dump(PrintWriter pw, String prefix, String dumpPackage) {
+    void dumpLastHomeActivityStartResult(PrintWriter pw, String prefix) {
         pw.print(prefix);
         pw.print("mLastHomeActivityStartResult=");
         pw.println(mLastHomeActivityStartResult);
+    }
 
-        if (mLastHomeActivityStartRecord != null) {
+    void dump(PrintWriter pw, String prefix, String dumpPackage) {
+        boolean dumped = false;
+
+        final boolean dumpPackagePresent = dumpPackage != null;
+
+        if (mLastHomeActivityStartRecord != null && (!dumpPackagePresent
+                || dumpPackage.equals(mLastHomeActivityStartRecord.packageName))) {
+            if (!dumped) {
+                dumped = true;
+                dumpLastHomeActivityStartResult(pw, prefix);
+            }
             pw.print(prefix);
             pw.println("mLastHomeActivityStartRecord:");
             mLastHomeActivityStartRecord.dump(pw, prefix + "  ", true /* dumpAll */);
         }
 
-        final boolean dumpPackagePresent = dumpPackage != null;
-
         if (mLastStarter != null) {
             final boolean dump = !dumpPackagePresent
                     || mLastStarter.relatedToPackage(dumpPackage)
@@ -569,6 +578,10 @@
                             && dumpPackage.equals(mLastHomeActivityStartRecord.packageName));
 
             if (dump) {
+                if (!dumped) {
+                    dumped = true;
+                    dumpLastHomeActivityStartResult(pw, prefix);
+                }
                 pw.print(prefix);
                 mLastStarter.dump(pw, prefix + "  ");
 
@@ -578,7 +591,7 @@
             }
         }
 
-        if (dumpPackagePresent) {
+        if (!dumped) {
             pw.print(prefix);
             pw.println("(nothing)");
         }
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 511baa5..6a8d5d9 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -4926,7 +4926,7 @@
 
         boolean printed = ActivityStackSupervisor.printThisActivity(pw,
                 mRootWindowContainer.getTopResumedActivity(),  dumpPackage, needSep,
-                "  ResumedActivity: ");
+                "  ResumedActivity: ", null);
         if (printed) {
             printedAnything = true;
             needSep = false;
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java
index 09700c5..ccd51de 100644
--- a/services/core/java/com/android/server/wm/RecentTasks.java
+++ b/services/core/java/com/android/server/wm/RecentTasks.java
@@ -1718,9 +1718,31 @@
         final int size = mTasks.size();
         for (int i = 0; i < size; i++) {
             final Task task = mTasks.get(i);
-            if (dumpPackage != null && (task.realActivity == null ||
-                    !dumpPackage.equals(task.realActivity.getPackageName()))) {
-                continue;
+            if (dumpPackage != null) {
+                boolean match = task.intent != null
+                        && task.intent.getComponent() != null
+                        && dumpPackage.equals(
+                        task.intent.getComponent().getPackageName());
+                if (!match) {
+                    match |= task.affinityIntent != null
+                            && task.affinityIntent.getComponent() != null
+                            && dumpPackage.equals(
+                            task.affinityIntent.getComponent().getPackageName());
+                }
+                if (!match) {
+                    match |= task.origActivity != null
+                            && dumpPackage.equals(task.origActivity.getPackageName());
+                }
+                if (!match) {
+                    match |= task.realActivity != null
+                            && dumpPackage.equals(task.realActivity.getPackageName());
+                }
+                if (!match) {
+                    match |= dumpPackage.equals(task.mCallingPackage);
+                }
+                if (!match) {
+                    continue;
+                }
             }
 
             if (!printedHeader) {
@@ -1743,6 +1765,31 @@
                     0, true /* getTasksAllowed */, mService.getCurrentUserId(), SYSTEM_UID);
             for (int i = 0; i < tasks.size(); i++) {
                 final ActivityManager.RecentTaskInfo taskInfo = tasks.get(i);
+                if (dumpPackage != null) {
+                    boolean match = taskInfo.baseIntent != null
+                            && taskInfo.baseIntent.getComponent() != null
+                            && dumpPackage.equals(
+                                    taskInfo.baseIntent.getComponent().getPackageName());
+                    if (!match) {
+                        match |= taskInfo.baseActivity != null
+                                && dumpPackage.equals(taskInfo.baseActivity.getPackageName());
+                    }
+                    if (!match) {
+                        match |= taskInfo.topActivity != null
+                                && dumpPackage.equals(taskInfo.topActivity.getPackageName());
+                    }
+                    if (!match) {
+                        match |= taskInfo.origActivity != null
+                                && dumpPackage.equals(taskInfo.origActivity.getPackageName());
+                    }
+                    if (!match) {
+                        match |= taskInfo.realActivity != null
+                                && dumpPackage.equals(taskInfo.realActivity.getPackageName());
+                    }
+                    if (!match) {
+                        continue;
+                    }
+                }
                 if (!printedHeader) {
                     if (printedAnything) {
                         // Separate from the last block if it printed
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 77841dc..a691736 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -3602,31 +3602,40 @@
         boolean needSep = false;
         for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
             DisplayContent displayContent = getChildAt(displayNdx);
+            if (printed) {
+                pw.println();
+            }
             pw.print("Display #"); pw.print(displayContent.mDisplayId);
             pw.println(" (activities from top to bottom):");
             for (int tdaNdx = displayContent.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
                 final TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(tdaNdx);
                 for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) {
                     final ActivityStack stack = taskDisplayArea.getStackAt(sNdx);
-                    pw.println();
-                    printed = stack.dump(fd, pw, dumpAll, dumpClient, dumpPackage, needSep);
-                    needSep = printed;
+                    if (needSep) {
+                        pw.println();
+                    }
+                    needSep = stack.dump(fd, pw, dumpAll, dumpClient, dumpPackage, false);
+                    printed |= needSep;
                 }
             }
-            pw.println(" (resumed activities in task display areas from top to bottom):");
             for (int tdaNdx = displayContent.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
                 final TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(tdaNdx);
-                printThisActivity(pw, taskDisplayArea.getFocusedActivity(), dumpPackage, needSep,
-                        "   ResumedActivity:");
+                printed |= printThisActivity(pw, taskDisplayArea.getFocusedActivity(),
+                        dumpPackage, needSep, "    Resumed: ", () -> {
+                            pw.println("  Resumed activities in task display areas"
+                                    + " (from top to bottom):");
+                        });
             }
         }
 
         printed |= dumpHistoryList(fd, pw, mStackSupervisor.mFinishingActivities, "  ",
                 "Fin", false, !dumpAll,
-                false, dumpPackage, true, "  Activities waiting to finish:", null);
+                false, dumpPackage, true,
+                () -> { pw.println("  Activities waiting to finish:"); }, null);
         printed |= dumpHistoryList(fd, pw, mStackSupervisor.mStoppingActivities, "  ",
                 "Stop", false, !dumpAll,
-                false, dumpPackage, true, "  Activities waiting to stop:", null);
+                false, dumpPackage, true,
+                () -> { pw.println("  Activities waiting to stop:"); }, null);
 
         return printed;
     }
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 8f8ca77..6c872a6 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -3875,11 +3875,12 @@
             pw.print(prefix); pw.print("mRootProcess="); pw.println(mRootProcess);
         }
         pw.print(prefix); pw.print("taskId=" + mTaskId); pw.println(" stackId=" + getRootTaskId());
-        pw.print(prefix + "mHasBeenVisible=" + getHasBeenVisible());
-        pw.print(" mResizeMode=" + ActivityInfo.resizeModeToString(mResizeMode));
-        pw.print(" mSupportsPictureInPicture=" + mSupportsPictureInPicture);
-        pw.print(" isResizeable=" + isResizeable());
-        pw.print(" lastActiveTime=" + lastActiveTime);
+        pw.print(prefix); pw.print("mHasBeenVisible="); pw.println(getHasBeenVisible());
+        pw.print(prefix); pw.print("mResizeMode=");
+        pw.print(ActivityInfo.resizeModeToString(mResizeMode));
+        pw.print(" mSupportsPictureInPicture="); pw.print(mSupportsPictureInPicture);
+        pw.print(" isResizeable="); pw.println(isResizeable());
+        pw.print(prefix); pw.print("lastActiveTime="); pw.print(lastActiveTime);
         pw.println(" (inactive for " + (getInactiveDuration() / 1000) + "s)");
     }