Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b593c035 authored by Utkarsh Nigam's avatar Utkarsh Nigam
Browse files

Print top level components in dumpsys.

Bug: 410550886
Flag: EXEMPT Dumpsys change
Test: Dumpsys paste/4708992255000576
Change-Id: I1ee6856f0c706733129d4bfdfc650e32a7e535fa
parent 4ef82094
Loading
Loading
Loading
Loading
+72 −14
Original line number Diff line number Diff line
@@ -18,29 +18,33 @@ package com.android.server.appfunctions;

import static android.app.appfunctions.AppFunctionRuntimeMetadata.PROPERTY_APP_FUNCTION_STATIC_METADATA_QUALIFIED_ID;
import static android.app.appfunctions.AppFunctionStaticMetadataHelper.APP_FUNCTION_INDEXER_PACKAGE;
import static android.app.appfunctions.AppFunctionStaticMetadataHelper.APP_FUNCTION_STATIC_NAMESPACE;
import static android.app.appfunctions.AppFunctionStaticMetadataHelper.PROPERTY_FUNCTION_ID;

import android.Manifest;
import android.annotation.BinderThread;
import android.annotation.RequiresPermission;
import android.annotation.NonNull;
import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserManager;
import android.util.IndentingPrintWriter;
import android.annotation.RequiresPermission;
import android.app.appfunctions.AppFunctionRuntimeMetadata;
import android.app.appfunctions.AppFunctionStaticMetadataHelper;
import android.app.appsearch.AppSearchManager;
import android.app.appsearch.AppSearchManager.SearchContext;
import android.app.appsearch.JoinSpec;
import android.app.appsearch.GenericDocument;
import android.app.appsearch.JoinSpec;
import android.app.appsearch.SearchResult;
import android.app.appsearch.SearchSpec;
import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserManager;
import android.util.ArrayMap;
import android.util.IndentingPrintWriter;

import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

public final class AppFunctionDumpHelper {
@@ -52,7 +56,8 @@ public final class AppFunctionDumpHelper {
    @BinderThread
    @RequiresPermission(
            anyOf = {Manifest.permission.CREATE_USERS, Manifest.permission.MANAGE_USERS})
    public static void dumpAppFunctionsState(@NonNull Context context, @NonNull PrintWriter w) {
    public static void dumpAppFunctionsState(
            @NonNull Context context, @NonNull PrintWriter w, @NonNull String[] args) {
        UserManager userManager = context.getSystemService(UserManager.class);
        if (userManager == null) {
            w.println("Couldn't retrieve UserManager.");
@@ -67,32 +72,58 @@ public final class AppFunctionDumpHelper {
                    "AppFunction state for user " + userInfo.getUserHandle().getIdentifier() + ":");
            pw.increaseIndent();
            dumpAppFunctionsStateForUser(
                    context.createContextAsUser(userInfo.getUserHandle(), /* flags= */ 0), pw);
                    context.createContextAsUser(userInfo.getUserHandle(), /* flags= */ 0),
                    pw,
                    isVerboseMode(args));
            pw.decreaseIndent();
        }
    }

    private static boolean isVerboseMode(String[] args) {
        for (String arg : args) {
            if (arg.equals("--verbose") || arg.equals("-v")) {
                return true;
            }
        }

        return false;
    }

    private static void dumpAppFunctionsStateForUser(
            @NonNull Context context, @NonNull IndentingPrintWriter pw) {
            @NonNull Context context, @NonNull IndentingPrintWriter pw, boolean isVerbose) {
        AppSearchManager appSearchManager = context.getSystemService(AppSearchManager.class);
        if (appSearchManager == null) {
            pw.println("Couldn't retrieve AppSearchManager.");
            return;
        }

        Map<String, List<SearchResult>> packageSearchResults = new ArrayMap<>();

        try (FutureGlobalSearchSession searchSession =
                new FutureGlobalSearchSession(appSearchManager, Runnable::run)) {
            pw.println();

            try (FutureSearchResults futureSearchResults =
                    searchSession.search("", buildAppFunctionMetadataSearchSpec()).get(); ) {
                    searchSession
                            .search("", buildAppFunctionMetadataSearchSpec(isVerbose))
                            .get(); ) {
                List<SearchResult> searchResultsList;
                do {
                    searchResultsList = futureSearchResults.getNextPage().get();
                    for (SearchResult searchResult : searchResultsList) {
                        dumpAppFunctionMetadata(pw, searchResult);
                        String packageName =
                                searchResult
                                        .getGenericDocument()
                                        .getPropertyString(
                                                AppFunctionStaticMetadataHelper
                                                        .PROPERTY_PACKAGE_NAME);
                        packageSearchResults
                                .computeIfAbsent(packageName, (k) -> new ArrayList<>())
                                .add(searchResult);
                    }
                } while (!searchResultsList.isEmpty());

                dumpSearchResults(pw, packageSearchResults);
            }

        } catch (Exception e) {
@@ -100,7 +131,29 @@ public final class AppFunctionDumpHelper {
        }
    }

    private static SearchSpec buildAppFunctionMetadataSearchSpec() {
    private static void dumpSearchResults(
            IndentingPrintWriter pw, Map<String, List<SearchResult>> packageSearchResults) {
        for (Map.Entry<String, List<SearchResult>> entry : packageSearchResults.entrySet()) {
            pw.println("AppFunctionDocument(s) for package: " + entry.getKey());

            pw.increaseIndent();
            for (SearchResult result : entry.getValue()) {
                if (result.getGenericDocument()
                        .getSchemaType()
                        .startsWith(AppFunctionStaticMetadataHelper.STATIC_SCHEMA_TYPE)) {
                    dumpAppFunctionMetadata(pw, result);
                } else {
                    pw.println(result.getGenericDocument().getSchemaType() + ": ");
                    pw.increaseIndent();
                    writeGenericDocumentProperties(pw, result.getGenericDocument());
                    pw.decreaseIndent();
                }
            }
            pw.decreaseIndent();
        }
    }

    private static SearchSpec buildAppFunctionMetadataSearchSpec(boolean isVerbose) {
        SearchSpec runtimeMetadataSearchSpec =
                new SearchSpec.Builder()
                        .addFilterPackageNames(APP_FUNCTION_INDEXER_PACKAGE)
@@ -113,7 +166,12 @@ public final class AppFunctionDumpHelper {

        return new SearchSpec.Builder()
                .addFilterPackageNames(APP_FUNCTION_INDEXER_PACKAGE)
                .addFilterSchemas(AppFunctionStaticMetadataHelper.STATIC_SCHEMA_TYPE)
                .addFilterNamespaces(APP_FUNCTION_STATIC_NAMESPACE)
                .addFilterSchemas(
                        // Retrieve all documents if isVerbose is true.
                        isVerbose
                                ? Collections.emptyList()
                                : List.of(AppFunctionStaticMetadataHelper.STATIC_SCHEMA_TYPE))
                .setJoinSpec(joinSpec)
                .build();
    }
+1 −2
Original line number Diff line number Diff line
@@ -85,7 +85,6 @@ import java.util.Objects;
import java.util.WeakHashMap;
import java.util.concurrent.CompletionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/** Implementation of the AppFunctionManagerService. */
public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub {
@@ -154,7 +153,7 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub {

        final long token = Binder.clearCallingIdentity();
        try {
            AppFunctionDumpHelper.dumpAppFunctionsState(mContext, pw);
            AppFunctionDumpHelper.dumpAppFunctionsState(mContext, pw, args);
        } finally {
            Binder.restoreCallingIdentity(token);
        }