Merge "[DO NOT MERGE] Fix Memory Leak: Part I of Rewrite render info remote callback." into udc-dev
This commit is contained in:
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.server.autofill;
|
||||||
|
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.RemoteCallback;
|
||||||
|
import android.util.Slog;
|
||||||
|
import android.view.autofill.AutofillId;
|
||||||
|
import android.view.inputmethod.InlineSuggestionsRequest;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
final class InlineSuggestionRendorInfoCallbackOnResultListener implements
|
||||||
|
RemoteCallback.OnResultListener{
|
||||||
|
private static final String TAG = "InlineSuggestionRendorInfoCallbackOnResultListener";
|
||||||
|
|
||||||
|
private final int mRequestIdCopy;
|
||||||
|
private final AutofillId mFocusedId;
|
||||||
|
private final WeakReference<Session> mSessionWeakReference;
|
||||||
|
private final Consumer<InlineSuggestionsRequest> mInlineSuggestionsRequestConsumer;
|
||||||
|
|
||||||
|
InlineSuggestionRendorInfoCallbackOnResultListener(WeakReference<Session> sessionWeakReference,
|
||||||
|
int requestIdCopy,
|
||||||
|
Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestConsumer,
|
||||||
|
AutofillId focusedId) {
|
||||||
|
this.mRequestIdCopy = requestIdCopy;
|
||||||
|
this.mInlineSuggestionsRequestConsumer = inlineSuggestionsRequestConsumer;
|
||||||
|
this.mSessionWeakReference = sessionWeakReference;
|
||||||
|
this.mFocusedId = focusedId;
|
||||||
|
}
|
||||||
|
public void onResult(@Nullable Bundle result) {
|
||||||
|
Session session = this.mSessionWeakReference.get();
|
||||||
|
if (session == null) {
|
||||||
|
Slog.wtf(TAG, "Session is null before trying to call onResult");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
synchronized (session.mLock) {
|
||||||
|
if (session.mDestroyed) {
|
||||||
|
Slog.wtf(TAG, "Session is destroyed before trying to call onResult");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
session.mInlineSessionController.onCreateInlineSuggestionsRequestLocked(
|
||||||
|
this.mFocusedId,
|
||||||
|
session.inlineSuggestionsRequestCacheDecorator(
|
||||||
|
this.mInlineSuggestionsRequestConsumer, this.mRequestIdCopy),
|
||||||
|
result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -184,6 +184,7 @@ import com.android.server.wm.ActivityTaskManagerInternal;
|
|||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -321,7 +322,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
* Id of the View currently being displayed.
|
* Id of the View currently being displayed.
|
||||||
*/
|
*/
|
||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
@Nullable private AutofillId mCurrentViewId;
|
@Nullable AutofillId mCurrentViewId;
|
||||||
|
|
||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
private IAutoFillManagerClient mClient;
|
private IAutoFillManagerClient mClient;
|
||||||
@@ -369,7 +370,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
private Bundle mClientState;
|
private Bundle mClientState;
|
||||||
|
|
||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
private boolean mDestroyed;
|
boolean mDestroyed;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper used to handle state of Save UI when it must be hiding to show a custom description
|
* Helper used to handle state of Save UI when it must be hiding to show a custom description
|
||||||
@@ -448,7 +449,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
private ArrayList<AutofillId> mAugmentedAutofillableIds;
|
private ArrayList<AutofillId> mAugmentedAutofillableIds;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final AutofillInlineSessionController mInlineSessionController;
|
final AutofillInlineSessionController mInlineSessionController;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Receiver of assist data from the app's {@link Activity}.
|
* Receiver of assist data from the app's {@link Activity}.
|
||||||
@@ -1226,22 +1227,28 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
if (mSessionFlags.mInlineSupportedByService
|
if (mSessionFlags.mInlineSupportedByService
|
||||||
&& remoteRenderService != null
|
&& remoteRenderService != null
|
||||||
&& (isViewFocusedLocked(flags) || isRequestSupportFillDialog(flags))) {
|
&& (isViewFocusedLocked(flags) || isRequestSupportFillDialog(flags))) {
|
||||||
|
|
||||||
Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestConsumer =
|
Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestConsumer =
|
||||||
mAssistReceiver.newAutofillRequestLocked(viewState,
|
mAssistReceiver.newAutofillRequestLocked(viewState,
|
||||||
/* isInlineRequest= */ true);
|
/* isInlineRequest= */ true);
|
||||||
|
|
||||||
if (inlineSuggestionsRequestConsumer != null) {
|
if (inlineSuggestionsRequestConsumer != null) {
|
||||||
final AutofillId focusedId = mCurrentViewId;
|
|
||||||
final int requestIdCopy = requestId;
|
final int requestIdCopy = requestId;
|
||||||
|
final AutofillId focusedId = mCurrentViewId;
|
||||||
|
|
||||||
|
WeakReference sessionWeakReference = new WeakReference<Session>(this);
|
||||||
|
InlineSuggestionRendorInfoCallbackOnResultListener
|
||||||
|
inlineSuggestionRendorInfoCallbackOnResultListener =
|
||||||
|
new InlineSuggestionRendorInfoCallbackOnResultListener(
|
||||||
|
sessionWeakReference,
|
||||||
|
requestIdCopy,
|
||||||
|
inlineSuggestionsRequestConsumer,
|
||||||
|
focusedId);
|
||||||
|
RemoteCallback inlineSuggestionRendorInfoCallback = new RemoteCallback(
|
||||||
|
inlineSuggestionRendorInfoCallbackOnResultListener, mHandler);
|
||||||
|
|
||||||
remoteRenderService.getInlineSuggestionsRendererInfo(
|
remoteRenderService.getInlineSuggestionsRendererInfo(
|
||||||
new RemoteCallback((extras) -> {
|
inlineSuggestionRendorInfoCallback);
|
||||||
synchronized (mLock) {
|
|
||||||
mInlineSessionController.onCreateInlineSuggestionsRequestLocked(
|
|
||||||
focusedId, inlineSuggestionsRequestCacheDecorator(
|
|
||||||
inlineSuggestionsRequestConsumer, requestIdCopy),
|
|
||||||
extras);
|
|
||||||
}
|
|
||||||
}, mHandler)
|
|
||||||
);
|
|
||||||
viewState.setState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST);
|
viewState.setState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -5151,7 +5158,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestCacheDecorator(
|
Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestCacheDecorator(
|
||||||
@NonNull Consumer<InlineSuggestionsRequest> consumer, int requestId) {
|
@NonNull Consumer<InlineSuggestionsRequest> consumer, int requestId) {
|
||||||
return inlineSuggestionsRequest -> {
|
return inlineSuggestionsRequest -> {
|
||||||
consumer.accept(inlineSuggestionsRequest);
|
consumer.accept(inlineSuggestionsRequest);
|
||||||
|
|||||||
Reference in New Issue
Block a user