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

Commit 1973f979 authored by Ibrahim Yilmaz's avatar Ibrahim Yilmaz
Browse files

[Inline Reply] Fix RemoteInputView visibility listener leak

Whenever notification is updated, we are adding a new listener for the same ContentView instance. The list is getting bigger.
This CL fixes this issue by getting back to 1-1 listener model from 1-N.
Bug: 349628193
Test: presubmit
Flag: NONE BUGFIX

Change-Id: I1e572ad8bf2b665fa027416c0ae496d50203124b
parent 65cb6056
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1465,7 +1465,7 @@ public class NotificationContentView extends FrameLayout implements Notification
            }
            if (hasRemoteInput) {
                result.mView.setWrapper(wrapper);
                result.mView.addOnVisibilityChangedListener(this::setRemoteInputVisible);
                result.mView.setOnVisibilityChangedListener(this::setRemoteInputVisible);

                if (existingPendingIntent != null || result.mView.isActive()) {
                    // The current action could be gone, or the pending intent no longer valid.
+6 −13
Original line number Diff line number Diff line
@@ -115,7 +115,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
    private final SendButtonTextWatcher mTextWatcher;
    private final TextView.OnEditorActionListener mEditorActionHandler;
    private final ArrayList<Runnable> mOnSendListeners = new ArrayList<>();
    private final ArrayList<Consumer<Boolean>> mOnVisibilityChangedListeners = new ArrayList<>();
    private Consumer<Boolean> mOnVisibilityChangedListener = null;
    private final ArrayList<OnFocusChangeListener> mEditTextFocusChangeListeners =
            new ArrayList<>();

@@ -733,24 +733,17 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
     * {@link #getVisibility()} would return {@link View#VISIBLE}, and {@code false} it would return
     * any other value.
     */
    public void addOnVisibilityChangedListener(Consumer<Boolean> listener) {
        mOnVisibilityChangedListeners.add(listener);
    }

    /**
     * Unregister a listener previously registered via
     * {@link #addOnVisibilityChangedListener(Consumer)}.
     */
    public void removeOnVisibilityChangedListener(Consumer<Boolean> listener) {
        mOnVisibilityChangedListeners.remove(listener);
    public void setOnVisibilityChangedListener(Consumer<Boolean> listener) {
        mOnVisibilityChangedListener = listener;
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        if (changedView == this) {
            for (Consumer<Boolean> listener : new ArrayList<>(mOnVisibilityChangedListeners)) {
                listener.accept(visibility == VISIBLE);
            final Consumer<Boolean> visibilityChangedListener = mOnVisibilityChangedListener;
            if (visibilityChangedListener != null) {
                visibilityChangedListener.accept(visibility == VISIBLE);
            }
            // Hide soft-keyboard when the input view became invisible
            // (i.e. The notification shade collapsed by pressing the home key)
+1 −1
Original line number Diff line number Diff line
@@ -247,7 +247,7 @@ public class RemoteInputViewTest extends SysuiTestCase {
        ExpandableNotificationRow row = helper.createRow();
        RemoteInputView view = RemoteInputView.inflate(mContext, null, row.getEntry(), mController);

        view.addOnVisibilityChangedListener(null);
        view.setOnVisibilityChangedListener(null);
        view.setVisibility(View.INVISIBLE);
        view.setVisibility(View.VISIBLE);
    }