Loading services/appfunctions/java/com/android/server/appfunctions/AppFunctionDumpHelper.java +72 −14 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading @@ -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."); Loading @@ -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) { Loading @@ -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) Loading @@ -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(); } } Loading services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java +1 −2 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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); } } Loading Loading
services/appfunctions/java/com/android/server/appfunctions/AppFunctionDumpHelper.java +72 −14 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading @@ -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."); Loading @@ -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) { Loading @@ -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) Loading @@ -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(); } } Loading
services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java +1 −2 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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); } } Loading