diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index 0999580e1ead9..41a78a760f60c 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.MANAGE_AUTO_FILL; import static android.content.Context.AUTOFILL_MANAGER_SERVICE; import static com.android.server.autofill.Helper.sDebug; +import static com.android.server.autofill.Helper.sPartitionMaxCount; import static com.android.server.autofill.Helper.sVerbose; import static com.android.server.autofill.Helper.bundleToString; @@ -397,6 +398,21 @@ public final class AutofillManagerService extends SystemService { } } + // Called by Shell command. + public int getMaxPartitions() { + synchronized (mLock) { + return sPartitionMaxCount; + } + } + + // Called by Shell command. + public void setMaxPartitions(int max) { + Slog.i(TAG, "setMaxPartitions(): " + max); + synchronized (mLock) { + sPartitionMaxCount = max; + } + } + private void setDebugLocked(boolean debug) { com.android.server.autofill.Helper.sDebug = debug; android.view.autofill.Helper.sDebug = debug; @@ -628,6 +644,7 @@ public final class AutofillManagerService extends SystemService { pw.print("Debug mode: "); pw.println(oldDebug); pw.print("Verbose mode: "); pw.println(sVerbose); pw.print("Disabled users: "); pw.println(mDisabledUsers); + pw.print("Max partitions per session: "); pw.println(sPartitionMaxCount); final int size = mServicesCache.size(); pw.print("Cached services: "); if (size == 0) { diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java index 1b9c86ef59a96..f3de557ec5405 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java @@ -70,9 +70,15 @@ public final class AutofillManagerServiceShellCommand extends ShellCommand { pw.println(" get log_level "); pw.println(" Gets the Autofill log level (off | debug | verbose)."); pw.println(""); + pw.println(" get max_partitions"); + pw.println(" Gets the maximum number of partitions per session."); + pw.println(""); pw.println(" set log_level [off | debug | verbose]"); pw.println(" Sets the Autofill log level."); pw.println(""); + pw.println(" set max_partitions number"); + pw.println(" Sets the maximum number of partitions per session."); + pw.println(""); pw.println(" list sessions [--user USER_ID]"); pw.println(" List all pending sessions."); pw.println(""); @@ -86,9 +92,33 @@ public final class AutofillManagerServiceShellCommand extends ShellCommand { } private int requestGet(PrintWriter pw) { - if (!isNextArgLogLevel(pw, "get")) { - return -1; + final String what = getNextArgRequired(); + switch(what) { + case "log_level": + return getLogLevel(pw); + case "max_partitions": + return getMaxPartitions(pw); + default: + pw.println("Invalid set: " + what); + return -1; } + } + + private int requestSet(PrintWriter pw) { + final String what = getNextArgRequired(); + + switch(what) { + case "log_level": + return setLogLevel(pw); + case "max_partitions": + return setMaxPartitions(); + default: + pw.println("Invalid set: " + what); + return -1; + } + } + + private int getLogLevel(PrintWriter pw) { final int logLevel = mService.getLogLevel(); switch (logLevel) { case AutofillManager.FLAG_ADD_CLIENT_VERBOSE: @@ -106,11 +136,8 @@ public final class AutofillManagerServiceShellCommand extends ShellCommand { } } - private int requestSet(PrintWriter pw) { - if (!isNextArgLogLevel(pw, "set")) { - return -1; - } - final String logLevel = getNextArg(); + private int setLogLevel(PrintWriter pw) { + final String logLevel = getNextArgRequired(); switch (logLevel.toLowerCase()) { case "verbose": mService.setLogLevel(AutofillManager.FLAG_ADD_CLIENT_VERBOSE); @@ -127,6 +154,16 @@ public final class AutofillManagerServiceShellCommand extends ShellCommand { } } + private int getMaxPartitions(PrintWriter pw) { + pw.println(mService.getMaxPartitions()); + return 0; + } + + private int setMaxPartitions() { + mService.setMaxPartitions(Integer.parseInt(getNextArgRequired())); + return 0; + } + private int requestDestroy(PrintWriter pw) { if (!isNextArgSessions(pw)) { return -1; diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java index ffcde8de84483..0281f73d5b405 100644 --- a/services/autofill/java/com/android/server/autofill/Helper.java +++ b/services/autofill/java/com/android/server/autofill/Helper.java @@ -26,16 +26,23 @@ public final class Helper { /** * Defines a logging flag that can be dynamically changed at runtime using - * {@code cmd autofill debug [on|off]}. + * {@code cmd autofill set log_level debug}. */ public static boolean sDebug = false; /** * Defines a logging flag that can be dynamically changed at runtime using - * {@code cmd autofill verbose [on|off]}. + * {@code cmd autofill set log_level verbose}. */ public static boolean sVerbose = false; + /** + * Maximum number of partitions that can be allowed in a session. + * + *
Can be modified using {@code cmd autofill set max_partitions}. + */ + static int sPartitionMaxCount = 10; + private Helper() { throw new UnsupportedOperationException("contains static members only"); } diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index ef5cdd1467370..4746ee95cdb1b 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -26,6 +26,7 @@ import static android.view.autofill.AutofillManager.ACTION_VIEW_ENTERED; import static android.view.autofill.AutofillManager.ACTION_VIEW_EXITED; import static com.android.server.autofill.Helper.sDebug; +import static com.android.server.autofill.Helper.sPartitionMaxCount; import static com.android.server.autofill.Helper.sVerbose; import static com.android.server.autofill.ViewState.STATE_AUTOFILLED; import static com.android.server.autofill.ViewState.STATE_RESTARTED_SESSION; @@ -162,6 +163,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState @GuardedBy("mLock") private boolean mIsSaving; + /** * Receiver of assist data from the app's {@link Activity}. */ @@ -933,7 +935,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } - private static final int PARTITION_MAX_COUNT = 64; /** * Determines if a new partition should be started for an id. * @@ -947,8 +948,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } final int numResponses = mResponses.size(); - if (numResponses >= PARTITION_MAX_COUNT) { - Slog.e(TAG, "Cannot create more than 64 partitions. Not creating a new partition."); + if (numResponses >= sPartitionMaxCount) { + Slog.e(TAG, "Not starting a new partition on " + id + " because session " + this.id + + " reached maximum of " + sPartitionMaxCount); return false; }