From e41c89da2a1cbbc3d38d71540aff0fe4bd848fb4 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 13 Jul 2021 11:38:22 -0400 Subject: [PATCH] Fix switch listener on app notif page Test: RoboTests, manually change setting Fixes: 193442605 Change-Id: Ie93469479e252811921a6451853b073dadb0d0a1 --- .../AppStateNotificationBridge.java | 32 ++++++++----------- .../ApplicationViewHolder.java | 4 +-- .../ManageApplications.java | 2 +- .../AppStateNotificationBridgeTest.java | 10 +++--- .../ApplicationViewHolderTest.java | 11 +++++-- 5 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/com/android/settings/applications/AppStateNotificationBridge.java b/src/com/android/settings/applications/AppStateNotificationBridge.java index c8bb5f9a667..3bcf94f3445 100644 --- a/src/com/android/settings/applications/AppStateNotificationBridge.java +++ b/src/com/android/settings/applications/AppStateNotificationBridge.java @@ -24,8 +24,10 @@ import android.os.UserManager; import android.text.format.DateUtils; import android.util.ArrayMap; import android.util.Log; +import android.util.Slog; import android.view.View; import android.view.ViewGroup; +import android.widget.CompoundButton; import android.widget.Switch; import com.android.settings.R; @@ -222,26 +224,18 @@ public class AppStateNotificationBridge extends AppStateBaseBridge { return userId + "|" + pkg; } - public View.OnClickListener getSwitchOnClickListener(final AppEntry entry) { - if (entry != null) { - return v -> { - ViewGroup view = (ViewGroup) v; - Switch toggle = view.findViewById(R.id.switchWidget); - if (toggle != null) { - if (!toggle.isEnabled()) { - return; - } - toggle.toggle(); - mBackend.setNotificationsEnabledForPackage( - entry.info.packageName, entry.info.uid, toggle.isChecked()); - NotificationsSentState stats = getNotificationsSentState(entry); - if (stats != null) { - stats.blocked = !toggle.isChecked(); - } - } - }; + public CompoundButton.OnCheckedChangeListener getSwitchOnCheckedListener(final AppEntry entry) { + if (entry == null) { + return null; } - return null; + return (buttonView, isChecked) -> { + mBackend.setNotificationsEnabledForPackage( + entry.info.packageName, entry.info.uid, isChecked); + NotificationsSentState stats = getNotificationsSentState(entry); + if (stats != null) { + stats.blocked = !isChecked; + } + }; } public static final AppFilter FILTER_APP_NOTIFICATION_RECENCY = new AppFilter() { diff --git a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java index 9ef66010070..ef5b029a9d0 100644 --- a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java +++ b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java @@ -155,13 +155,13 @@ public class ApplicationViewHolder extends RecyclerView.ViewHolder { } } - void updateSwitch(View.OnClickListener listener, boolean enabled, boolean checked) { + void updateSwitch(Switch.OnCheckedChangeListener listener, boolean enabled, boolean checked) { if (mSwitch != null && mWidgetContainer != null) { - mWidgetContainer.setOnClickListener(listener); mWidgetContainer.setFocusable(false); mWidgetContainer.setClickable(false); mSwitch.setFocusable(true); mSwitch.setClickable(true); + mSwitch.setOnCheckedChangeListener(listener); mSwitch.setChecked(checked); mSwitch.setEnabled(enabled); } diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 43e929b8054..edd4088a27f 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -1505,7 +1505,7 @@ public class ManageApplications extends InstrumentedFragment switch (mManageApplications.mListType) { case LIST_TYPE_NOTIFICATION: holder.updateSwitch(((AppStateNotificationBridge) mExtraInfoBridge) - .getSwitchOnClickListener(entry), + .getSwitchOnCheckedListener(entry), AppStateNotificationBridge.enableSwitch(entry), AppStateNotificationBridge.checkSwitch(entry)); if (entry.extraInfo != null diff --git a/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java b/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java index e59361e0981..21a2947e547 100644 --- a/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java @@ -53,6 +53,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.view.ViewGroup; +import android.widget.CompoundButton; import android.widget.Switch; import com.android.settings.R; @@ -550,12 +551,10 @@ public class AppStateNotificationBridgeTest { } @Test - public void testSwitchOnClickListener() { - ViewGroup parent = mock(ViewGroup.class); + public void testSwitchOnChangeListener() { Switch toggle = mock(Switch.class); when(toggle.isChecked()).thenReturn(true); when(toggle.isEnabled()).thenReturn(true); - when(parent.findViewById(anyInt())).thenReturn(toggle); AppEntry entry = mock(AppEntry.class); entry.info = new ApplicationInfo(); @@ -563,10 +562,9 @@ public class AppStateNotificationBridgeTest { entry.info.uid = 1356; entry.extraInfo = new NotificationsSentState(); - ViewGroup.OnClickListener listener = mBridge.getSwitchOnClickListener(entry); - listener.onClick(parent); + CompoundButton.OnCheckedChangeListener listener = mBridge.getSwitchOnCheckedListener(entry); + listener.onCheckedChanged(toggle, true); - verify(toggle).toggle(); verify(mBackend).setNotificationsEnabledForPackage( entry.info.packageName, entry.info.uid, true); assertThat(((NotificationsSentState) entry.extraInfo).blocked).isFalse(); diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java index 0e7d1bd71c4..be01a8acb02 100644 --- a/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java +++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java @@ -35,6 +35,8 @@ import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import java.util.concurrent.CountDownLatch; + @RunWith(RobolectricTestRunner.class) public class ApplicationViewHolderTest { @@ -123,13 +125,16 @@ public class ApplicationViewHolderTest { @Test public void updateSwitch() { + final CountDownLatch latch = new CountDownLatch(1); mView = ApplicationViewHolder.newView(new FrameLayout(mContext), true); mHolder = new ApplicationViewHolder(mView); - mHolder.updateSwitch(v -> { - } /* listener */, true, true); + mHolder.updateSwitch((buttonView, isChecked) -> latch.countDown(), true, true); assertThat(mHolder.mSwitch.isChecked()).isTrue(); assertThat(mHolder.mSwitch.isEnabled()).isTrue(); - assertThat(mHolder.mWidgetContainer.hasOnClickListeners()).isTrue(); + assertThat(mHolder.mSwitch.isFocusable()).isTrue(); + assertThat(mHolder.mSwitch.isClickable()).isTrue(); + mHolder.mSwitch.callOnClick(); + assertThat(latch.getCount()).isEqualTo(0); } }