From 1f8b07bb8d644c88869f1356443f07c2902e2e3e Mon Sep 17 00:00:00 2001 From: Felipe Leme Date: Wed, 3 May 2017 18:03:37 -0700 Subject: [PATCH] Improved dump() on Autofill UI. Bug: 37958210 Bug: 37986800 Test: adb shell dumpsys autofill --ui-only Change-Id: Ia580eba219c919f7e84cdd39b756d60cd687f275 --- .../autofill/AutofillManagerService.java | 31 +++++++++++++- .../com/android/server/autofill/Session.java | 3 ++ .../server/autofill/ui/AutoFillUI.java | 7 +++- .../android/server/autofill/ui/FillUi.java | 17 ++++++++ .../android/server/autofill/ui/SaveUi.java | 40 ++++++++++++++----- 5 files changed, 84 insertions(+), 14 deletions(-) diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index b536ad969c95c..f3e610ed14eb4 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -602,6 +602,31 @@ public final class AutofillManagerService extends SystemService { public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; + boolean showHistory = true; + boolean uiOnly = false; + if (args != null) { + for (String arg : args) { + switch(arg) { + case "--no-history": + showHistory = false; + break; + case "--ui-only": + uiOnly = true; + break; + case "--help": + pw.println("Usage: dumpsys autofill [--ui-only|--no-history]"); + return; + default: + throw new IllegalArgumentException("Invalid dump arg: " + arg); + } + } + } + + if (uiOnly) { + mUi.dump(pw); + return; + } + boolean oldDebug = sDebug; try { synchronized (mLock) { @@ -624,8 +649,10 @@ public final class AutofillManagerService extends SystemService { } mUi.dump(pw); } - pw.println("Requests history:"); - mRequestsHistory.reverseDump(fd, pw, args); + if (showHistory) { + pw.println("Requests history:"); + mRequestsHistory.reverseDump(fd, pw, args); + } } finally { setDebugLocked(oldDebug); } diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 23b734adaa9af..dbc7f2b67ec89 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -1043,6 +1043,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } break; case ACTION_VIEW_ENTERED: + if (sVerbose && virtualBounds != null) { + Slog.w(TAG, "entered on virtual child " + id + ": " + virtualBounds); + } requestNewFillResponseIfNecessaryLocked(id, viewState, flags); // Remove the UI if the ViewState has changed. diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java index 086742eac6d53..25814b308abe5 100644 --- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java +++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java @@ -282,13 +282,18 @@ public final class AutoFillUI { pw.println("Autofill UI"); final String prefix = " "; final String prefix2 = " "; - pw.print(prefix); pw.print("showsSaveUi: "); pw.println(mSaveUi != null); if (mFillUi != null) { pw.print(prefix); pw.println("showsFillUi: true"); mFillUi.dump(pw, prefix2); } else { pw.print(prefix); pw.println("showsFillUi: false"); } + if (mSaveUi != null) { + pw.print(prefix); pw.println("showsSaveUi: true"); + mSaveUi.dump(pw, prefix2); + } else { + pw.print(prefix); pw.println("showsSaveUi: false"); + } } @android.annotation.UiThread diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java index dd297a645436c..922962f1b63b5 100644 --- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java @@ -398,6 +398,7 @@ final class FillUi { } return false; } + } public void dump(PrintWriter pw, String prefix) { @@ -408,5 +409,21 @@ final class FillUi { pw.print(prefix); pw.print("mContentWidth: "); pw.println(mContentWidth); pw.print(prefix); pw.print("mContentHeight: "); pw.println(mContentHeight); pw.print(prefix); pw.print("mDestroyed: "); pw.println(mDestroyed); + pw.print(prefix); pw.print("mWindow: "); + if (mWindow == null) { + pw.println("N/A"); + } else { + final String prefix2 = prefix + " "; + pw.println(); + pw.print(prefix2); pw.print("showing: "); pw.println(mWindow.mShowing); + pw.print(prefix2); pw.print("view: "); pw.println(mWindow.mContentView); + pw.print(prefix2); pw.print("screen coordinates: "); + if (mWindow.mContentView == null) { + pw.println("N/A"); + } else { + final int[] coordinates = mWindow.mContentView.getLocationOnScreen(); + pw.print(coordinates[0]); pw.print("x"); pw.println(coordinates[1]); + } + } } } diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java index bcdb118eb76d3..d25ffced77978 100644 --- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java @@ -37,6 +37,8 @@ import android.view.View; import com.android.internal.R; import com.android.server.UiThread; +import java.io.PrintWriter; + /** * Autofill Save Prompt */ @@ -96,6 +98,9 @@ final class SaveUi { private final @NonNull OneTimeListener mListener; + private final CharSequence mTitle; + private final CharSequence mSubTitle; + private boolean mDestroyed; SaveUi(@NonNull Context context, @NonNull CharSequence providerLabel, @NonNull SaveInfo info, @@ -126,37 +131,36 @@ final class SaveUi { types.add(context.getString(R.string.autofill_save_type_email_address)); } - final CharSequence title; switch (types.size()) { case 1: - title = Html.fromHtml(context.getString(R.string.autofill_save_title_with_type, + mTitle = Html.fromHtml(context.getString(R.string.autofill_save_title_with_type, types.valueAt(0), providerLabel), 0); break; case 2: - title = Html.fromHtml(context.getString(R.string.autofill_save_title_with_2types, + mTitle = Html.fromHtml(context.getString(R.string.autofill_save_title_with_2types, types.valueAt(0), types.valueAt(1), providerLabel), 0); break; case 3: - title = Html.fromHtml(context.getString(R.string.autofill_save_title_with_3types, + mTitle = Html.fromHtml(context.getString(R.string.autofill_save_title_with_3types, types.valueAt(0), types.valueAt(1), types.valueAt(2), providerLabel), 0); break; default: // Use generic if more than 3 or invalid type (size 0). - title = Html.fromHtml( + mTitle = Html.fromHtml( context.getString(R.string.autofill_save_title, providerLabel), 0); } - titleView.setText(title); - final CharSequence subTitle = info.getDescription(); - if (subTitle != null) { + titleView.setText(mTitle); + mSubTitle = info.getDescription(); + if (mSubTitle != null) { final TextView subTitleView = (TextView) view.findViewById(R.id.autofill_save_subtitle); - subTitleView.setText(subTitle); + subTitleView.setText(mSubTitle); subTitleView.setVisibility(View.VISIBLE); } - Slog.i(TAG, "Showing save dialog: " + title); + Slog.i(TAG, "Showing save dialog: " + mTitle); if (sDebug) { - Slog.d(TAG, "SubTitle: " + subTitle); + Slog.d(TAG, "SubTitle: " + mSubTitle); } final TextView noButton = view.findViewById(R.id.autofill_save_no); @@ -207,4 +211,18 @@ final class SaveUi { throw new IllegalStateException("cannot interact with a destroyed instance"); } } + + void dump(PrintWriter pw, String prefix) { + pw.print(prefix); pw.print("title: "); pw.println(mTitle); + pw.print(prefix); pw.print("subtitle: "); pw.println(mSubTitle); + + final View view = mDialog.getWindow().getDecorView(); + final int[] loc = view.getLocationOnScreen(); + pw.print(prefix); pw.print("coordinates: "); + pw.print('('); pw.print(loc[0]); pw.print(','); pw.print(loc[1]);pw.print(')'); + pw.print('('); + pw.print(loc[0] + view.getWidth()); pw.print(','); + pw.print(loc[1] + view.getHeight());pw.println(')'); + pw.print(prefix); pw.print("destroyed: "); pw.println(mDestroyed); + } }