import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.NetworkInfo;
+import android.net.NetworkInfo.State;
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
@Override
public void onConnectedChanged() {
- notifySliceChange();
}
@Override
final List<AccessPoint> resultList = new ArrayList<>();
for (AccessPoint ap : accessPoints) {
if (ap.isReachable()) {
- resultList.add(ap);
+ resultList.add(clone(ap));
+ if (resultList.size() >= DEFAULT_EXPANDED_ROW_COUNT) {
+ break;
+ }
}
}
updateResults(resultList);
}
+
+ private AccessPoint clone(AccessPoint accessPoint) {
+ final Bundle savedState = new Bundle();
+ accessPoint.saveWifiState(savedState);
+ return new AccessPoint(mContext, savedState);
+ }
+
+ @Override
+ protected boolean areListsTheSame(List<AccessPoint> a, List<AccessPoint> b) {
+ if (!a.equals(b)) {
+ return false;
+ }
+
+ // compare access point states one by one
+ final int listSize = a.size();
+ for (int i = 0; i < listSize; i++) {
+ if (getState(a.get(i)) != getState(b.get(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private State getState(AccessPoint accessPoint) {
+ final NetworkInfo networkInfo = accessPoint.getNetworkInfo();
+ if (networkInfo != null) {
+ return networkInfo.getState();
+ }
+ return null;
+ }
}
}
import android.content.Context;
import android.content.Intent;
import android.net.NetworkInfo;
+import android.net.NetworkInfo.State;
import android.net.Uri;
import android.net.wifi.WifiManager;
+import android.os.Bundle;
import androidx.core.graphics.drawable.IconCompat;
import androidx.slice.Slice;
import org.robolectric.annotation.Implements;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
verify(mResolver).notifyChange(WIFI_SLICE_URI, null);
}
+ private AccessPoint createAccessPoint(String name, State state) {
+ final NetworkInfo info = mock(NetworkInfo.class);
+ doReturn(state).when(info).getState();
+
+ final Bundle savedState = new Bundle();
+ savedState.putString("key_ssid", name);
+ savedState.putParcelable("key_networkinfo", info);
+ return new AccessPoint(mContext, savedState);
+ }
+
@Test
- public void onConnectedChanged_shouldNotifyChange() {
- mWifiScanWorker.onConnectedChanged();
+ public void SliceAccessPoint_sameState_shouldBeTheSame() {
+ final AccessPoint ap1 = createAccessPoint(AP1_NAME, State.CONNECTED);
+ final AccessPoint ap2 = createAccessPoint(AP1_NAME, State.CONNECTED);
- verify(mResolver).notifyChange(WIFI_SLICE_URI, null);
+ assertThat(mWifiScanWorker.areListsTheSame(Arrays.asList(ap1), Arrays.asList(ap2)))
+ .isTrue();
+ }
+
+ @Test
+ public void SliceAccessPoint_differentState_shouldBeDifferent() {
+ final AccessPoint ap1 = createAccessPoint(AP1_NAME, State.CONNECTING);
+ final AccessPoint ap2 = createAccessPoint(AP1_NAME, State.CONNECTED);
+
+ assertThat(mWifiScanWorker.areListsTheSame(Arrays.asList(ap1), Arrays.asList(ap2)))
+ .isFalse();
+ }
+ @Test
+ public void SliceAccessPoint_differentLength_shouldBeDifferent() {
+ final AccessPoint ap1 = createAccessPoint(AP1_NAME, State.CONNECTED);
+ final AccessPoint ap2 = createAccessPoint(AP1_NAME, State.CONNECTED);
+ final List<AccessPoint> list = new ArrayList<>();
+ list.add(ap1);
+ list.add(ap2);
+
+ assertThat(mWifiScanWorker.areListsTheSame(list, Arrays.asList(ap1))).isFalse();
}
@Implements(SliceBackgroundWorker.class)