Merge "Session Memory Leak - Weak Ref in FieldClassificationRequest" into udc-dev
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user