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

Commit c585ddbe authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Print top level components in dumpsys." into main

parents 00143545 b593c035
Loading
Loading
Loading
Loading
+72 −14
Original line number Original line 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.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_INDEXER_PACKAGE;
import static android.app.appfunctions.AppFunctionStaticMetadataHelper.APP_FUNCTION_STATIC_NAMESPACE;
import static android.app.appfunctions.AppFunctionStaticMetadataHelper.PROPERTY_FUNCTION_ID;
import static android.app.appfunctions.AppFunctionStaticMetadataHelper.PROPERTY_FUNCTION_ID;


import android.Manifest;
import android.Manifest;
import android.annotation.BinderThread;
import android.annotation.BinderThread;
import android.annotation.RequiresPermission;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.content.Context;
import android.annotation.RequiresPermission;
import android.content.pm.UserInfo;
import android.os.UserManager;
import android.util.IndentingPrintWriter;
import android.app.appfunctions.AppFunctionRuntimeMetadata;
import android.app.appfunctions.AppFunctionRuntimeMetadata;
import android.app.appfunctions.AppFunctionStaticMetadataHelper;
import android.app.appfunctions.AppFunctionStaticMetadataHelper;
import android.app.appsearch.AppSearchManager;
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.GenericDocument;
import android.app.appsearch.JoinSpec;
import android.app.appsearch.SearchResult;
import android.app.appsearch.SearchResult;
import android.app.appsearch.SearchSpec;
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.io.PrintWriter;
import java.lang.reflect.Array;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Set;


public final class AppFunctionDumpHelper {
public final class AppFunctionDumpHelper {
@@ -52,7 +56,8 @@ public final class AppFunctionDumpHelper {
    @BinderThread
    @BinderThread
    @RequiresPermission(
    @RequiresPermission(
            anyOf = {Manifest.permission.CREATE_USERS, Manifest.permission.MANAGE_USERS})
            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);
        UserManager userManager = context.getSystemService(UserManager.class);
        if (userManager == null) {
        if (userManager == null) {
            w.println("Couldn't retrieve UserManager.");
            w.println("Couldn't retrieve UserManager.");
@@ -67,32 +72,58 @@ public final class AppFunctionDumpHelper {
                    "AppFunction state for user " + userInfo.getUserHandle().getIdentifier() + ":");
                    "AppFunction state for user " + userInfo.getUserHandle().getIdentifier() + ":");
            pw.increaseIndent();
            pw.increaseIndent();
            dumpAppFunctionsStateForUser(
            dumpAppFunctionsStateForUser(
                    context.createContextAsUser(userInfo.getUserHandle(), /* flags= */ 0), pw);
                    context.createContextAsUser(userInfo.getUserHandle(), /* flags= */ 0),
                    pw,
                    isVerboseMode(args));
            pw.decreaseIndent();
            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(
    private static void dumpAppFunctionsStateForUser(
            @NonNull Context context, @NonNull IndentingPrintWriter pw) {
            @NonNull Context context, @NonNull IndentingPrintWriter pw, boolean isVerbose) {
        AppSearchManager appSearchManager = context.getSystemService(AppSearchManager.class);
        AppSearchManager appSearchManager = context.getSystemService(AppSearchManager.class);
        if (appSearchManager == null) {
        if (appSearchManager == null) {
            pw.println("Couldn't retrieve AppSearchManager.");
            pw.println("Couldn't retrieve AppSearchManager.");
            return;
            return;
        }
        }


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

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


            try (FutureSearchResults futureSearchResults =
            try (FutureSearchResults futureSearchResults =
                    searchSession.search("", buildAppFunctionMetadataSearchSpec()).get(); ) {
                    searchSession
                            .search("", buildAppFunctionMetadataSearchSpec(isVerbose))
                            .get(); ) {
                List<SearchResult> searchResultsList;
                List<SearchResult> searchResultsList;
                do {
                do {
                    searchResultsList = futureSearchResults.getNextPage().get();
                    searchResultsList = futureSearchResults.getNextPage().get();
                    for (SearchResult searchResult : searchResultsList) {
                    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());
                } while (!searchResultsList.isEmpty());

                dumpSearchResults(pw, packageSearchResults);
            }
            }


        } catch (Exception e) {
        } 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 =
        SearchSpec runtimeMetadataSearchSpec =
                new SearchSpec.Builder()
                new SearchSpec.Builder()
                        .addFilterPackageNames(APP_FUNCTION_INDEXER_PACKAGE)
                        .addFilterPackageNames(APP_FUNCTION_INDEXER_PACKAGE)
@@ -113,7 +166,12 @@ public final class AppFunctionDumpHelper {


        return new SearchSpec.Builder()
        return new SearchSpec.Builder()
                .addFilterPackageNames(APP_FUNCTION_INDEXER_PACKAGE)
                .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)
                .setJoinSpec(joinSpec)
                .build();
                .build();
    }
    }
+1 −2
Original line number Original line Diff line number Diff line
@@ -85,7 +85,6 @@ import java.util.Objects;
import java.util.WeakHashMap;
import java.util.WeakHashMap;
import java.util.concurrent.CompletionException;
import java.util.concurrent.CompletionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;


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


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