Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b84b394 authored by Haoran Zhang's avatar Haoran Zhang Committed by Automerger Merge Worker
Browse files

[DO NOT MERGE] Fix Memory Leak: Part II of rewrite render info callback am:...

[DO NOT MERGE] Fix Memory Leak: Part II of rewrite render info callback am: e22573d1 am: f3652561 am: 99589f65

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23416834



Change-Id: I86309144965a9e0f8cb55b52e051bfbdb1c81624
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents a0c0f2cb 99589f65
Loading
Loading
Loading
Loading
+55 −0
Original line number Diff line number Diff line
/*
 * 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.util.Slog;
import android.view.inputmethod.InlineSuggestionsRequest;

import java.lang.ref.WeakReference;
import java.util.function.Consumer;

class InlineSuggestionRequestConsumer implements Consumer<InlineSuggestionsRequest> {

    static final String TAG = "InlineSuggestionRequestConsumer";

    private final WeakReference<Session.AssistDataReceiverImpl> mAssistDataReceiverWeakReference;
    private final WeakReference<ViewState>  mViewStateWeakReference;

    InlineSuggestionRequestConsumer(WeakReference<Session.AssistDataReceiverImpl>
            assistDataReceiverWeakReference,
            WeakReference<ViewState>  viewStateWeakReference) {
        mAssistDataReceiverWeakReference = assistDataReceiverWeakReference;
        mViewStateWeakReference = viewStateWeakReference;
    }

    @Override
    public void accept(InlineSuggestionsRequest inlineSuggestionsRequest) {
        Session.AssistDataReceiverImpl assistDataReceiver = mAssistDataReceiverWeakReference.get();
        ViewState viewState = mViewStateWeakReference.get();
        if (assistDataReceiver == null) {
            Slog.wtf(TAG, "assistDataReceiver is null when accepting new inline suggestion"
                    + "requests");
            return;
        }

        if (viewState == null) {
            Slog.wtf(TAG, "view state is null when accepting new inline suggestion requests");
            return;
        }
        assistDataReceiver.handleInlineSuggestionRequest(inlineSuggestionsRequest, viewState);
    }
}
+23 −12
Original line number Diff line number Diff line
@@ -323,7 +323,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
     * Id of the View currently being displayed.
     */
    @GuardedBy("mLock")
    @Nullable AutofillId mCurrentViewId;
    private @Nullable AutofillId mCurrentViewId;

    @GuardedBy("mLock")
    private IAutoFillManagerClient mClient;
@@ -614,7 +614,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
     * TODO(b/151867668): improve how asynchronous data dependencies are handled, without using
     * CountDownLatch.
     */
    private final class AssistDataReceiverImpl extends IAssistDataReceiver.Stub {
    final class AssistDataReceiverImpl extends IAssistDataReceiver.Stub {
        @GuardedBy("mLock")
        private boolean mWaitForInlineRequest;
        @GuardedBy("mLock")
@@ -629,7 +629,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
            mPendingFillRequest = null;
            mWaitForInlineRequest = isInlineRequest;
            mPendingInlineSuggestionsRequest = null;
            return isInlineRequest ? (inlineSuggestionsRequest) -> {
            if (isInlineRequest) {
                WeakReference<AssistDataReceiverImpl> assistDataReceiverWeakReference =
                        new WeakReference<AssistDataReceiverImpl>(this);
                WeakReference<ViewState> viewStateWeakReference =
                        new WeakReference<ViewState>(viewState);
                return new InlineSuggestionRequestConsumer(assistDataReceiverWeakReference,
                    viewStateWeakReference);
            }
            return null;
        }

        void handleInlineSuggestionRequest(InlineSuggestionsRequest inlineSuggestionsRequest,
                ViewState viewState) {
            synchronized (mLock) {
                if (!mWaitForInlineRequest || mPendingInlineSuggestionsRequest != null) {
                    return;
@@ -639,7 +651,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
                maybeRequestFillLocked();
                viewState.resetState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST);
            }
            } : null;
        }

        @GuardedBy("mLock")