import android.content.ComponentName;
import android.content.Intent;
import android.graphics.Rect;
+import android.os.Build;
import android.os.CancellationSignal;
import android.os.Handler;
import android.os.IBinder;
private static final String TAG = AugmentedAutofillService.class.getSimpleName();
- // TODO(b/123100811): STOPSHIP use dynamic value, or change to false
- static final boolean DEBUG = true;
- static final boolean VERBOSE = false;
+ static boolean sDebug = Build.IS_USER ? false : true;
+ static boolean sVerbose = false;
/**
* The {@link Intent} that must be declared as handled by the service.
private final IAugmentedAutofillService mInterface = new IAugmentedAutofillService.Stub() {
@Override
- public void onConnected() {
+ public void onConnected(boolean debug, boolean verbose) {
mHandler.sendMessage(obtainMessage(AugmentedAutofillService::handleOnConnected,
- AugmentedAutofillService.this));
+ AugmentedAutofillService.this, debug, verbose));
}
@Override
public void onDisconnected() {
}
- private void handleOnConnected() {
+ private void handleOnConnected(boolean debug, boolean verbose) {
+ if (sDebug || debug) {
+ Log.d(TAG, "handleOnConnected(): debug=" + debug + ", verbose=" + verbose);
+ }
+ sDebug = debug;
+ sVerbose = verbose;
onConnected();
}
mAutofillProxies.put(sessionId, proxy);
} else {
// TODO(b/123099468): figure out if it's ok to reuse the proxy; add logging
- if (DEBUG) Log.d(TAG, "Reusing proxy for session " + sessionId);
+ if (sDebug) Log.d(TAG, "Reusing proxy for session " + sessionId);
proxy.update(focusedId, focusedValue, callback);
}
private void handleOnUnbind() {
if (mAutofillProxies == null) {
- if (DEBUG) Log.d(TAG, "onUnbind(): no proxy to destroy");
+ if (sDebug) Log.d(TAG, "onUnbind(): no proxy to destroy");
return;
}
final int size = mAutofillProxies.size();
- if (DEBUG) Log.d(TAG, "onUnbind(): destroying " + size + " proxies");
+ if (sDebug) Log.d(TAG, "onUnbind(): destroying " + size + " proxies");
for (int i = 0; i < size; i++) {
final AutofillProxy proxy = mAutofillProxies.valueAt(i);
try {
return null;
}
if (rect == null) {
- if (DEBUG) Log.d(TAG, "getViewCoordinates(" + mFocusedId + ") returned null");
+ if (sDebug) Log.d(TAG, "getViewCoordinates(" + mFocusedId + ") returned null");
return null;
}
mSmartSuggestion = new SystemPopupPresentationParams(this, rect);
public void requestShowFillUi(int width, int height, Rect anchorBounds,
IAutofillWindowPresenter presenter) throws RemoteException {
if (mCancellationSignal.isCanceled()) {
- if (VERBOSE) {
+ if (sVerbose) {
Log.v(TAG, "requestShowFillUi() not showing because request is cancelled");
}
return;
case REPORT_EVENT_ON_SUCCESS:
if (mFirstOnSuccessTime == 0) {
mFirstOnSuccessTime = SystemClock.elapsedRealtime();
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "Service responded in " + TimeUtils.formatDuration(
mFirstOnSuccessTime - mFirstRequestTime));
}
case REPORT_EVENT_UI_SHOWN:
if (mUiFirstShownTime == 0) {
mUiFirstShownTime = SystemClock.elapsedRealtime();
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "UI shown in " + TimeUtils.formatDuration(
mUiFirstShownTime - mFirstRequestTime));
}
case REPORT_EVENT_UI_DESTROYED:
if (mUiFirstDestroyedTime == 0) {
mUiFirstDestroyedTime = SystemClock.elapsedRealtime();
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "UI destroyed in " + TimeUtils.formatDuration(
mUiFirstDestroyedTime - mFirstRequestTime));
}
private void destroy() {
synchronized (mLock) {
if (mFillWindow != null) {
- if (DEBUG) Log.d(TAG, "destroying window");
+ if (sDebug) Log.d(TAG, "destroying window");
mFillWindow.destroy();
mFillWindow = null;
}
*/
package android.service.autofill.augmented;
-import static android.service.autofill.augmented.AugmentedAutofillService.DEBUG;
+import static android.service.autofill.augmented.AugmentedAutofillService.sDebug;
import android.annotation.NonNull;
import android.annotation.Nullable;
* could not provide autofill for the request.
*/
public void onSuccess(@Nullable FillResponse response) {
- if (DEBUG) Log.d(TAG, "onSuccess(): " + response);
+ if (sDebug) Log.d(TAG, "onSuccess(): " + response);
mProxy.report(AutofillProxy.REPORT_EVENT_ON_SUCCESS);
if (response == null) return;
*/
package android.service.autofill.augmented;
-import static android.service.autofill.augmented.AugmentedAutofillService.DEBUG;
+import static android.service.autofill.augmented.AugmentedAutofillService.sDebug;
import android.annotation.NonNull;
import android.annotation.SystemApi;
public void autofill(@NonNull List<Pair<AutofillId, AutofillValue>> values) {
Preconditions.checkNotNull(values);
- if (DEBUG) {
+ if (sDebug) {
Log.d(TAG, "autofill() with " + values.size() + " values");
}
*/
package android.service.autofill.augmented;
-import static android.service.autofill.augmented.AugmentedAutofillService.DEBUG;
-import static android.service.autofill.augmented.AugmentedAutofillService.VERBOSE;
+import static android.service.autofill.augmented.AugmentedAutofillService.sDebug;
+import static android.service.autofill.augmented.AugmentedAutofillService.sVerbose;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
* @throws IllegalArgumentException if the area is not compatible with this window
*/
public boolean update(@NonNull Area area, @NonNull View rootView, long flags) {
- if (DEBUG) {
+ if (sDebug) {
Log.d(TAG, "Updating " + area + " + with " + rootView);
}
// TODO(b/123100712): add test case for null
mFillView.setOnTouchListener(
(view, motionEvent) -> {
if (motionEvent.getAction() == MotionEvent.ACTION_OUTSIDE) {
- if (VERBOSE) Log.v(TAG, "Outside touch detected, hiding the window");
+ if (sVerbose) Log.v(TAG, "Outside touch detected, hiding the window");
hide();
}
return false;
);
mShowing = false;
mBounds = new Rect(area.getBounds());
- if (DEBUG) {
+ if (sDebug) {
Log.d(TAG, "Created FillWindow: params= " + smartSuggestion + " view=" + rootView);
}
mUpdateCalled = true;
/** @hide */
void show() {
// TODO(b/123100712): check if updated first / throw exception
- if (DEBUG) Log.d(TAG, "show()");
+ if (sDebug) Log.d(TAG, "show()");
synchronized (mLock) {
checkNotDestroyedLocked();
if (mWm == null || mFillView == null) {
* <p>The window is not destroyed and can be shown again
*/
private void hide() {
- if (DEBUG) Log.d(TAG, "hide()");
+ if (sDebug) Log.d(TAG, "hide()");
synchronized (mLock) {
checkNotDestroyedLocked();
if (mWm == null || mFillView == null) {
}
private void handleShow(WindowManager.LayoutParams p) {
- if (DEBUG) Log.d(TAG, "handleShow()");
+ if (sDebug) Log.d(TAG, "handleShow()");
synchronized (mLock) {
if (mWm != null && mFillView != null) {
p.flags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
}
private void handleHide() {
- if (DEBUG) Log.d(TAG, "handleHide()");
+ if (sDebug) Log.d(TAG, "handleHide()");
synchronized (mLock) {
if (mWm != null && mFillView != null && mShowing) {
mWm.removeView(mFillView);
* <p>Once destroyed, this window cannot be used anymore
*/
public void destroy() {
- if (DEBUG) {
+ if (sDebug) {
Log.d(TAG,
"destroy(): mDestroyed=" + mDestroyed + " mShowing=" + mShowing + " mFillView="
+ mFillView);
@Override
public void show(WindowManager.LayoutParams p, Rect transitionEpicenter,
boolean fitsSystemWindows, int layoutDirection) {
- if (DEBUG) Log.d(TAG, "FillWindowPresenter.show()");
+ if (sDebug) Log.d(TAG, "FillWindowPresenter.show()");
mUiThreadHandler.sendMessage(obtainMessage(FillWindow::handleShow, FillWindow.this, p));
}
@Override
public void hide(Rect transitionEpicenter) {
- if (DEBUG) Log.d(TAG, "FillWindowPresenter.hide()");
+ if (sDebug) Log.d(TAG, "FillWindowPresenter.hide()");
mUiThreadHandler.sendMessage(obtainMessage(FillWindow::handleHide, FillWindow.this));
}
}
* @hide
*/
oneway interface IAugmentedAutofillService {
- void onConnected();
+ void onConnected(boolean debug, boolean verbose);
void onDisconnected();
void onFillRequest(int sessionId, in IBinder autofillManagerClient, int taskId,
in ComponentName activityComponent, in AutofillId focusedId,
package com.android.server.autofill;
import static com.android.server.autofill.Helper.sDebug;
+import static com.android.server.autofill.Helper.sVerbose;
import android.annotation.NonNull;
import android.annotation.Nullable;
}
try {
if (state) {
- mService.onConnected();
+ mService.onConnected(sDebug, sVerbose);
} else {
mService.onDisconnected();
}
// main reason being the cases where user tap HOME.
// Right now it's completely destroying the UI, but we need to decide whether / how to
// properly recover it later (for example, if the user switches back to the activity,
- // should it be restored? Right not it kind of is, because Autofill's Session trigger a
+ // should it be restored? Right now it kind of is, because Autofill's Session trigger a
// new FillRequest, which in turn triggers the Augmented Autofill request again)
@GuardedBy("mLock")
@Nullable
viewState.setState(ViewState.STATE_TRIGGERED_AUGMENTED_AUTOFILL);
final AutofillValue currentValue = viewState.getCurrentValue();
- // TODO(b/111330312): we might need to add a new state in the AutofillManager to optimize
- // further AFM -> AFMS calls.
-
if (mAugmentedRequestsLogs == null) {
mAugmentedRequestsLogs = new ArrayList<>();
}