From 76bdf2faba7c47aeac929e1d1017491ac42e42a0 Mon Sep 17 00:00:00 2001 From: Steve Elliott Date: Thu, 23 Sep 2021 16:52:00 -0400 Subject: [PATCH] [RemoteInputView] Reorder fields + clean listener registration APIs Bug: 193539698 Test: manual, atest Change-Id: I5791b406740d8b72d356588d65696addf53cada4 --- .../row/NotificationContentView.java | 2 +- .../statusbar/policy/RemoteInputView.java | 67 ++++++++++++------- .../statusbar/policy/RemoteInputViewTest.java | 2 +- 3 files changed, 44 insertions(+), 27 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 4f54e4feb21dd..1be0a960087cc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -1253,7 +1253,7 @@ public class NotificationContentView extends FrameLayout { } if (hasRemoteInput) { existing.setWrapper(wrapper); - existing.setOnVisibilityChangedListener(this::setRemoteInputVisible); + existing.addOnVisibilityChangedListener(this::setRemoteInputVisible); if (existingPendingIntent != null || existing.isActive()) { // The current action could be gone, or the pending intent no longer valid. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index 5d7d4809dd57e..aa8d95fdb6252 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -108,36 +108,36 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene private final SendButtonTextWatcher mTextWatcher; private final TextView.OnEditorActionListener mEditorActionHandler; - private final UiEventLogger mUiEventLogger; - private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler; - private final List mEditTextFocusChangeListeners = new ArrayList<>(); - private final List mOnSendListeners = new ArrayList<>(); + private final ArrayList mOnSendListeners = new ArrayList<>(); + private final ArrayList> mOnVisibilityChangedListeners = new ArrayList<>(); + private final ArrayList mEditTextFocusChangeListeners = + new ArrayList<>(); + private RemoteEditText mEditText; private ImageButton mSendButton; private GradientDrawable mContentBackground; private ProgressBar mProgressBar; - private PendingIntent mPendingIntent; - private RemoteInput[] mRemoteInputs; - private RemoteInput mRemoteInput; - private RemoteInputController mController; - - private NotificationEntry mEntry; - - private boolean mRemoved; - + private ImageView mDelete; + private ImageView mDeleteBg; + // TODO(b/193539698): remove reveal param fields, turn them into parameters where needed private int mRevealCx; private int mRevealCy; private int mRevealR; - private boolean mColorized; private int mTint; - private boolean mResetting; - private NotificationViewWrapper mWrapper; - private Consumer mOnVisibilityChangedListener; + + // TODO(b/193539698): move these to a Controller + private RemoteInputController mController; + private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler; + private final UiEventLogger mUiEventLogger; + private NotificationEntry mEntry; + private PendingIntent mPendingIntent; + private RemoteInput mRemoteInput; + private RemoteInput[] mRemoteInputs; private NotificationRemoteInputManager.BouncerChecker mBouncerChecker; - private ImageView mDelete; - private ImageView mDeleteBg; + private boolean mRemoved; + private NotificationViewWrapper mWrapper; /** * Enum for logged notification remote input UiEvents. @@ -382,7 +382,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene private void sendRemoteInput(Intent intent) { if (mBouncerChecker != null && mBouncerChecker.showBouncerIfNecessary()) { mEditText.hideIme(); - for (OnSendRemoteInputListener listener : mOnSendListeners) { + for (OnSendRemoteInputListener listener : new ArrayList<>(mOnSendListeners)) { listener.onSendRequestBounced(); } return; @@ -399,7 +399,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene mController.remoteInputSent(mEntry); mEntry.setHasSentReply(); - for (OnSendRemoteInputListener listener : mOnSendListeners) { + for (OnSendRemoteInputListener listener : new ArrayList<>(mOnSendListeners)) { listener.onSendRemoteInput(); } @@ -760,15 +760,32 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene mWrapper = wrapper; } - public void setOnVisibilityChangedListener(Consumer visibilityChangedListener) { - mOnVisibilityChangedListener = visibilityChangedListener; + /** + * Register a listener to be notified when this view's visibility changes. + * + * Specifically, the passed {@link Consumer} will receive {@code true} when + * {@link #getVisibility()} would return {@link View#VISIBLE}, and {@code false} it would return + * any other value. + */ + public void addOnVisibilityChangedListener(Consumer listener) { + mOnVisibilityChangedListeners.add(listener); + } + + /** + * Unregister a listener previously registered via + * {@link #addOnVisibilityChangedListener(Consumer)}. + */ + public void removeOnVisibilityChangedListener(Consumer listener) { + mOnVisibilityChangedListeners.remove(listener); } @Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); - if (changedView == this && mOnVisibilityChangedListener != null) { - mOnVisibilityChangedListener.accept(visibility == VISIBLE); + if (changedView == this) { + for (Consumer listener : new ArrayList<>(mOnVisibilityChangedListeners)) { + listener.accept(visibility == VISIBLE); + } // Hide soft-keyboard when the input view became invisible // (i.e. The notification shade collapsed by pressing the home key) if (visibility != VISIBLE && !mEditText.isVisibleToUser() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java index dd8354dedafd8..97e1edb9ac747 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java @@ -205,7 +205,7 @@ public class RemoteInputViewTest extends SysuiTestCase { ExpandableNotificationRow row = helper.createRow(); RemoteInputView view = RemoteInputView.inflate(mContext, null, row.getEntry(), mController); - view.setOnVisibilityChangedListener(null); + view.addOnVisibilityChangedListener(null); view.setVisibility(View.INVISIBLE); view.setVisibility(View.VISIBLE); }