Merge "Fix switch listener on app notif page" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-07-14 15:41:04 +00:00
committed by Android (Google) Code Review
5 changed files with 28 additions and 31 deletions

View File

@@ -24,8 +24,10 @@ import android.os.UserManager;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
import android.util.Slog;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.Switch; import android.widget.Switch;
import com.android.settings.R; import com.android.settings.R;
@@ -222,27 +224,19 @@ public class AppStateNotificationBridge extends AppStateBaseBridge {
return userId + "|" + pkg; return userId + "|" + pkg;
} }
public View.OnClickListener getSwitchOnClickListener(final AppEntry entry) { public CompoundButton.OnCheckedChangeListener getSwitchOnCheckedListener(final AppEntry entry) {
if (entry != null) { if (entry == null) {
return v -> { return null;
ViewGroup view = (ViewGroup) v;
Switch toggle = view.findViewById(R.id.switchWidget);
if (toggle != null) {
if (!toggle.isEnabled()) {
return;
} }
toggle.toggle(); return (buttonView, isChecked) -> {
mBackend.setNotificationsEnabledForPackage( mBackend.setNotificationsEnabledForPackage(
entry.info.packageName, entry.info.uid, toggle.isChecked()); entry.info.packageName, entry.info.uid, isChecked);
NotificationsSentState stats = getNotificationsSentState(entry); NotificationsSentState stats = getNotificationsSentState(entry);
if (stats != null) { if (stats != null) {
stats.blocked = !toggle.isChecked(); stats.blocked = !isChecked;
}
} }
}; };
} }
return null;
}
public static final AppFilter FILTER_APP_NOTIFICATION_RECENCY = new AppFilter() { public static final AppFilter FILTER_APP_NOTIFICATION_RECENCY = new AppFilter() {
@Override @Override

View File

@@ -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) { if (mSwitch != null && mWidgetContainer != null) {
mWidgetContainer.setOnClickListener(listener);
mWidgetContainer.setFocusable(false); mWidgetContainer.setFocusable(false);
mWidgetContainer.setClickable(false); mWidgetContainer.setClickable(false);
mSwitch.setFocusable(true); mSwitch.setFocusable(true);
mSwitch.setClickable(true); mSwitch.setClickable(true);
mSwitch.setOnCheckedChangeListener(listener);
mSwitch.setChecked(checked); mSwitch.setChecked(checked);
mSwitch.setEnabled(enabled); mSwitch.setEnabled(enabled);
} }

View File

@@ -1505,7 +1505,7 @@ public class ManageApplications extends InstrumentedFragment
switch (mManageApplications.mListType) { switch (mManageApplications.mListType) {
case LIST_TYPE_NOTIFICATION: case LIST_TYPE_NOTIFICATION:
holder.updateSwitch(((AppStateNotificationBridge) mExtraInfoBridge) holder.updateSwitch(((AppStateNotificationBridge) mExtraInfoBridge)
.getSwitchOnClickListener(entry), .getSwitchOnCheckedListener(entry),
AppStateNotificationBridge.enableSwitch(entry), AppStateNotificationBridge.enableSwitch(entry),
AppStateNotificationBridge.checkSwitch(entry)); AppStateNotificationBridge.checkSwitch(entry));
if (entry.extraInfo != null if (entry.extraInfo != null

View File

@@ -53,6 +53,7 @@ import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.Switch; import android.widget.Switch;
import com.android.settings.R; import com.android.settings.R;
@@ -550,12 +551,10 @@ public class AppStateNotificationBridgeTest {
} }
@Test @Test
public void testSwitchOnClickListener() { public void testSwitchOnChangeListener() {
ViewGroup parent = mock(ViewGroup.class);
Switch toggle = mock(Switch.class); Switch toggle = mock(Switch.class);
when(toggle.isChecked()).thenReturn(true); when(toggle.isChecked()).thenReturn(true);
when(toggle.isEnabled()).thenReturn(true); when(toggle.isEnabled()).thenReturn(true);
when(parent.findViewById(anyInt())).thenReturn(toggle);
AppEntry entry = mock(AppEntry.class); AppEntry entry = mock(AppEntry.class);
entry.info = new ApplicationInfo(); entry.info = new ApplicationInfo();
@@ -563,10 +562,9 @@ public class AppStateNotificationBridgeTest {
entry.info.uid = 1356; entry.info.uid = 1356;
entry.extraInfo = new NotificationsSentState(); entry.extraInfo = new NotificationsSentState();
ViewGroup.OnClickListener listener = mBridge.getSwitchOnClickListener(entry); CompoundButton.OnCheckedChangeListener listener = mBridge.getSwitchOnCheckedListener(entry);
listener.onClick(parent); listener.onCheckedChanged(toggle, true);
verify(toggle).toggle();
verify(mBackend).setNotificationsEnabledForPackage( verify(mBackend).setNotificationsEnabledForPackage(
entry.info.packageName, entry.info.uid, true); entry.info.packageName, entry.info.uid, true);
assertThat(((NotificationsSentState) entry.extraInfo).blocked).isFalse(); assertThat(((NotificationsSentState) entry.extraInfo).blocked).isFalse();

View File

@@ -35,6 +35,8 @@ import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import java.util.concurrent.CountDownLatch;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class ApplicationViewHolderTest { public class ApplicationViewHolderTest {
@@ -123,13 +125,16 @@ public class ApplicationViewHolderTest {
@Test @Test
public void updateSwitch() { public void updateSwitch() {
final CountDownLatch latch = new CountDownLatch(1);
mView = ApplicationViewHolder.newView(new FrameLayout(mContext), true); mView = ApplicationViewHolder.newView(new FrameLayout(mContext), true);
mHolder = new ApplicationViewHolder(mView); mHolder = new ApplicationViewHolder(mView);
mHolder.updateSwitch(v -> { mHolder.updateSwitch((buttonView, isChecked) -> latch.countDown(), true, true);
} /* listener */, true, true);
assertThat(mHolder.mSwitch.isChecked()).isTrue(); assertThat(mHolder.mSwitch.isChecked()).isTrue();
assertThat(mHolder.mSwitch.isEnabled()).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);
} }
} }