diff options
author | 2022-02-14 19:28:29 +0000 | |
---|---|---|
committer | 2022-02-14 19:28:29 +0000 | |
commit | 865dc828f5ad5a7a6bbbde9e0571dd6201d9dc7f (patch) | |
tree | 2e3a76950432009f3eb7d9258cecefb4539c858b | |
parent | 29df200dc455fe91f54fdedac38519aa301633a5 (diff) | |
parent | bca61d7f66439b0edf5ff6ba1c18dab1a2d2c8a4 (diff) |
Merge "Final (?!?!?!) improvements on Activity.dump()"
4 files changed, 58 insertions, 26 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 983dde3beda0..eaf79b49d461 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -7348,43 +7348,67 @@ public class Activity extends ContextThemeWrapper public void dumpInternal(@NonNull String prefix, @SuppressLint("UseParcelFileDescriptor") @Nullable FileDescriptor fd, @NonNull PrintWriter writer, @Nullable String[] args) { - if (args != null && args.length > 0 - && CompatChanges.isChangeEnabled(DUMP_IGNORES_SPECIAL_ARGS)) { + + // Lazy-load mDumpableContainer with Dumpables activity might already have a reference to + if (mAutofillClientController != null) { + addDumpable(mAutofillClientController); + } + if (mUiTranslationController != null) { + addDumpable(mUiTranslationController); + } + if (mContentCaptureManager != null) { + mContentCaptureManager.addDumpable(this); + } + + boolean dumpInternalState = true; + String arg = null; + if (args != null && args.length > 0) { + arg = args[0]; + boolean isSpecialCase = true; // Handle special cases - switch (args[0]) { + switch (arg) { case "--autofill": dumpAutofillManager(prefix, writer, args); - return; + break; case "--contentcapture": dumpContentCaptureManager(prefix, writer); - return; + break; case "--translation": dumpUiTranslation(prefix, writer); - return; + break; case "--list-dumpables": if (mDumpableContainer == null) { writer.print(prefix); writer.println("No dumpables"); - return; + } else { + mDumpableContainer.listDumpables(prefix, writer); } - mDumpableContainer.listDumpables(prefix, writer); - return; + break; case "--dump-dumpable": if (args.length == 1) { writer.println("--dump-dumpable requires the dumpable name"); - return; - } - if (mDumpableContainer == null) { + } else if (mDumpableContainer == null) { writer.println("no dumpables"); - return; + } else { + // Strips --dump-dumpable NAME + String[] prunedArgs = new String[args.length - 2]; + System.arraycopy(args, 2, prunedArgs, 0, prunedArgs.length); + mDumpableContainer.dumpOneDumpable(prefix, writer, args[1], prunedArgs); } - // Strips --dump-dumpable NAME - String[] prunedArgs = new String[args.length - 2]; - System.arraycopy(args, 2, prunedArgs, 0, prunedArgs.length); - mDumpableContainer.dumpOneDumpable(prefix, writer, args[1], prunedArgs); - return; + break; + default: + isSpecialCase = false; + break; + } + if (isSpecialCase) { + dumpInternalState = !CompatChanges.isChangeEnabled(DUMP_IGNORES_SPECIAL_ARGS); } } - dump(prefix, fd, writer, args); + + if (dumpInternalState) { + dump(prefix, fd, writer, args); + } else { + Log.i(TAG, "Not calling dump() on " + this + " because of special argument " + arg); + } } void dumpInner(@NonNull String prefix, @Nullable FileDescriptor fd, @@ -7429,7 +7453,6 @@ public class Activity extends ContextThemeWrapper } private void dumpContentCaptureManager(String prefix, PrintWriter writer) { - getContentCaptureManager(); dumpLegacyDumpable(prefix, writer, ContentCaptureManager.DUMPABLE_NAME, /* args= */ null); } diff --git a/core/java/android/view/autofill/AutofillClientController.java b/core/java/android/view/autofill/AutofillClientController.java index 0f0fa4a83c00..93d98ac51c3b 100644 --- a/core/java/android/view/autofill/AutofillClientController.java +++ b/core/java/android/view/autofill/AutofillClientController.java @@ -76,7 +76,6 @@ public final class AutofillClientController implements AutofillManager.AutofillC */ public AutofillClientController(Activity activity) { mActivity = activity; - activity.addDumpable(this); } private AutofillManager getAutofillManager() { diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java index 54bd9e701acf..ad48ea006a21 100644 --- a/core/java/android/view/contentcapture/ContentCaptureManager.java +++ b/core/java/android/view/contentcapture/ContentCaptureManager.java @@ -391,6 +391,9 @@ public final class ContentCaptureManager { @GuardedBy("mLock") private MainContentCaptureSession mMainSession; + @Nullable // set on-demand by addDumpable() + private Dumper mDumpable; + /** @hide */ public interface ContentCaptureClient { /** @@ -407,9 +410,6 @@ public final class ContentCaptureManager { mService = Objects.requireNonNull(service, "service cannot be null"); mOptions = Objects.requireNonNull(options, "options cannot be null"); - if (context instanceof Activity) { - ((Activity) context).addDumpable(new Dumper()); - } ContentCaptureHelper.setLoggingLevel(mOptions.loggingLevel); if (sVerbose) Log.v(TAG, "Constructor for " + context.getPackageName()); @@ -748,6 +748,14 @@ public final class ContentCaptureManager { return resultReceiver; } + /** @hide */ + public void addDumpable(Activity activity) { + if (mDumpable == null) { + mDumpable = new Dumper(); + } + activity.addDumpable(mDumpable); + } + // NOTE: ContentCaptureManager cannot implement it directly as it would be exposed as public API private final class Dumper implements Dumpable { @Override diff --git a/core/java/com/android/internal/util/dump/DumpableContainerImpl.java b/core/java/com/android/internal/util/dump/DumpableContainerImpl.java index 2e56ebf1e41c..ccec6c61b92a 100644 --- a/core/java/com/android/internal/util/dump/DumpableContainerImpl.java +++ b/core/java/com/android/internal/util/dump/DumpableContainerImpl.java @@ -47,8 +47,10 @@ public final class DumpableContainerImpl implements DumpableContainer { Objects.requireNonNull(name, () -> "name of" + dumpable); if (mDumpables.containsKey(name)) { - Log.e(TAG, "addDumpable(): ignoring " + dumpable + " as there is already a dumpable" - + " with that name (" + name + "): " + mDumpables.get(name)); + if (DEBUG) { + Log.d(TAG, "addDumpable(): ignoring " + dumpable + " as there is already a dumpable" + + " with that name (" + name + "): " + mDumpables.get(name)); + } return false; } |