diff options
3 files changed, 35 insertions, 2 deletions
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java index ac770439a524..82af38200166 100644 --- a/services/autofill/java/com/android/server/autofill/Helper.java +++ b/services/autofill/java/com/android/server/autofill/Helper.java @@ -46,6 +46,7 @@ import com.android.internal.util.ArrayUtils; import com.android.server.utils.Slogf; import java.io.PrintWriter; +import java.lang.ref.WeakReference; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; @@ -319,6 +320,13 @@ public final class Helper { return context.createDisplayContext(display); } + static <T> @Nullable T weakDeref(WeakReference<T> weakRef, String tag, String prefix) { + T deref = weakRef.get(); + if (deref == null) { + Slog.wtf(tag, prefix + "fail to deref " + weakRef); + } + return deref; + } private interface ViewNodeFilter { boolean matches(ViewNode node); diff --git a/services/autofill/java/com/android/server/autofill/RemoteFieldClassificationService.java b/services/autofill/java/com/android/server/autofill/RemoteFieldClassificationService.java index ea31074ff5d2..bcca0069eb34 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteFieldClassificationService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteFieldClassificationService.java @@ -44,6 +44,8 @@ import android.util.Slog; import com.android.internal.infra.AbstractRemoteService; import com.android.internal.infra.ServiceConnector; +import java.lang.ref.WeakReference; + /** * Class responsible for connection with the Remote {@link FieldClassificationService}. * This class is instantiated when {@link AutofillManagerServiceImpl} is established. @@ -133,7 +135,8 @@ final class RemoteFieldClassificationService } public void onFieldClassificationRequest(@NonNull FieldClassificationRequest request, - FieldClassificationServiceCallbacks fieldClassificationServiceCallbacks) { + WeakReference<FieldClassificationServiceCallbacks> + fieldClassificationServiceCallbacksWeakRef) { final long startTime = SystemClock.elapsedRealtime(); if (sVerbose) { Slog.v(TAG, "onFieldClassificationRequest request:" + request); @@ -170,6 +173,15 @@ final class RemoteFieldClassificationService Slog.d(TAG, "onSuccess " + msg); } } + FieldClassificationServiceCallbacks + fieldClassificationServiceCallbacks = + Helper.weakDeref( + fieldClassificationServiceCallbacksWeakRef, + TAG, "onSuccess " + ); + if (fieldClassificationServiceCallbacks == null) { + return; + } fieldClassificationServiceCallbacks .onClassificationRequestSuccess(response); } @@ -180,6 +192,15 @@ final class RemoteFieldClassificationService if (sDebug) { Slog.d(TAG, "onFailure"); } + FieldClassificationServiceCallbacks + fieldClassificationServiceCallbacks = + Helper.weakDeref( + fieldClassificationServiceCallbacksWeakRef, + TAG, "onFailure " + ); + if (fieldClassificationServiceCallbacks == null) { + return; + } fieldClassificationServiceCallbacks .onClassificationRequestFailure(0, null); } diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 0c3f8667f4f8..fb26f427dad7 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -850,8 +850,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState RemoteFieldClassificationService remoteFieldClassificationService = mService.getRemoteFieldClassificationServiceLocked(); if (remoteFieldClassificationService != null) { + WeakReference<RemoteFieldClassificationService.FieldClassificationServiceCallbacks> + fieldClassificationServiceCallbacksWeakRef = + new WeakReference<>(Session.this); remoteFieldClassificationService.onFieldClassificationRequest( - mClassificationState.mPendingFieldClassificationRequest, Session.this); + mClassificationState.mPendingFieldClassificationRequest, + fieldClassificationServiceCallbacksWeakRef); } mClassificationState.onFieldClassificationRequestSent(); } |