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 com.android.server.utils.Slogf;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -319,6 +320,13 @@ public final class Helper {
|
|||||||
return context.createDisplayContext(display);
|
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 {
|
private interface ViewNodeFilter {
|
||||||
boolean matches(ViewNode node);
|
boolean matches(ViewNode node);
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ import android.util.Slog;
|
|||||||
import com.android.internal.infra.AbstractRemoteService;
|
import com.android.internal.infra.AbstractRemoteService;
|
||||||
import com.android.internal.infra.ServiceConnector;
|
import com.android.internal.infra.ServiceConnector;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class responsible for connection with the Remote {@link FieldClassificationService}.
|
* Class responsible for connection with the Remote {@link FieldClassificationService}.
|
||||||
* This class is instantiated when {@link AutofillManagerServiceImpl} is established.
|
* This class is instantiated when {@link AutofillManagerServiceImpl} is established.
|
||||||
@@ -133,7 +135,8 @@ final class RemoteFieldClassificationService
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onFieldClassificationRequest(@NonNull FieldClassificationRequest request,
|
public void onFieldClassificationRequest(@NonNull FieldClassificationRequest request,
|
||||||
FieldClassificationServiceCallbacks fieldClassificationServiceCallbacks) {
|
WeakReference<FieldClassificationServiceCallbacks>
|
||||||
|
fieldClassificationServiceCallbacksWeakRef) {
|
||||||
final long startTime = SystemClock.elapsedRealtime();
|
final long startTime = SystemClock.elapsedRealtime();
|
||||||
if (sVerbose) {
|
if (sVerbose) {
|
||||||
Slog.v(TAG, "onFieldClassificationRequest request:" + request);
|
Slog.v(TAG, "onFieldClassificationRequest request:" + request);
|
||||||
@@ -170,6 +173,15 @@ final class RemoteFieldClassificationService
|
|||||||
Slog.d(TAG, "onSuccess " + msg);
|
Slog.d(TAG, "onSuccess " + msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
FieldClassificationServiceCallbacks
|
||||||
|
fieldClassificationServiceCallbacks =
|
||||||
|
Helper.weakDeref(
|
||||||
|
fieldClassificationServiceCallbacksWeakRef,
|
||||||
|
TAG, "onSuccess "
|
||||||
|
);
|
||||||
|
if (fieldClassificationServiceCallbacks == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
fieldClassificationServiceCallbacks
|
fieldClassificationServiceCallbacks
|
||||||
.onClassificationRequestSuccess(response);
|
.onClassificationRequestSuccess(response);
|
||||||
}
|
}
|
||||||
@@ -180,6 +192,15 @@ final class RemoteFieldClassificationService
|
|||||||
if (sDebug) {
|
if (sDebug) {
|
||||||
Slog.d(TAG, "onFailure");
|
Slog.d(TAG, "onFailure");
|
||||||
}
|
}
|
||||||
|
FieldClassificationServiceCallbacks
|
||||||
|
fieldClassificationServiceCallbacks =
|
||||||
|
Helper.weakDeref(
|
||||||
|
fieldClassificationServiceCallbacksWeakRef,
|
||||||
|
TAG, "onFailure "
|
||||||
|
);
|
||||||
|
if (fieldClassificationServiceCallbacks == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
fieldClassificationServiceCallbacks
|
fieldClassificationServiceCallbacks
|
||||||
.onClassificationRequestFailure(0, null);
|
.onClassificationRequestFailure(0, null);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -850,8 +850,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
RemoteFieldClassificationService remoteFieldClassificationService =
|
RemoteFieldClassificationService remoteFieldClassificationService =
|
||||||
mService.getRemoteFieldClassificationServiceLocked();
|
mService.getRemoteFieldClassificationServiceLocked();
|
||||||
if (remoteFieldClassificationService != null) {
|
if (remoteFieldClassificationService != null) {
|
||||||
|
WeakReference<RemoteFieldClassificationService.FieldClassificationServiceCallbacks>
|
||||||
|
fieldClassificationServiceCallbacksWeakRef =
|
||||||
|
new WeakReference<>(Session.this);
|
||||||
remoteFieldClassificationService.onFieldClassificationRequest(
|
remoteFieldClassificationService.onFieldClassificationRequest(
|
||||||
mClassificationState.mPendingFieldClassificationRequest, Session.this);
|
mClassificationState.mPendingFieldClassificationRequest,
|
||||||
|
fieldClassificationServiceCallbacksWeakRef);
|
||||||
}
|
}
|
||||||
mClassificationState.onFieldClassificationRequestSent();
|
mClassificationState.onFieldClassificationRequestSent();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user