Fix the bug of "Connecting" is rarely appearing on Wi-Fi slice

- AccessPoint treats connected and connecting as equal so slice doesn't
refresh in this case
- Add a new method to determine if two lists are the same in SliceBackgroundWorker
- WifiScanWorker overrides this method to check the access point states

Fixes: 123941320
Test: robotest
Change-Id: I78d610da4b6b1d40f5785ba6701fb71b987fe31c
This commit is contained in:
Jason Chiu
2019-03-07 17:42:39 +08:00
parent b5b61b202b
commit 4e42f53896
3 changed files with 78 additions and 7 deletions

View File

@@ -146,7 +146,7 @@ public abstract class SliceBackgroundWorker<E> implements Closeable {
needNotify = true; needNotify = true;
} }
} else { } else {
needNotify = !results.equals(mCachedResults); needNotify = !areListsTheSame(results, mCachedResults);
} }
if (needNotify) { if (needNotify) {
@@ -155,6 +155,10 @@ public abstract class SliceBackgroundWorker<E> implements Closeable {
} }
} }
protected boolean areListsTheSame(List<E> a, List<E> b) {
return a.equals(b);
}
/** /**
* Notify that data was updated and attempt to sync changes to the Slice. * Notify that data was updated and attempt to sync changes to the Slice.
*/ */

View File

@@ -32,6 +32,7 @@ import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiInfo; import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
@@ -355,7 +356,6 @@ public class WifiSlice implements CustomSliceable {
@Override @Override
public void onConnectedChanged() { public void onConnectedChanged() {
notifySliceChange();
} }
@Override @Override
@@ -370,10 +370,43 @@ public class WifiSlice implements CustomSliceable {
final List<AccessPoint> resultList = new ArrayList<>(); final List<AccessPoint> resultList = new ArrayList<>();
for (AccessPoint ap : accessPoints) { for (AccessPoint ap : accessPoints) {
if (ap.isReachable()) { if (ap.isReachable()) {
resultList.add(ap); resultList.add(clone(ap));
if (resultList.size() >= DEFAULT_EXPANDED_ROW_COUNT) {
break;
}
} }
} }
updateResults(resultList); 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;
}
} }
} }

View File

@@ -34,8 +34,10 @@ import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Bundle;
import androidx.core.graphics.drawable.IconCompat; import androidx.core.graphics.drawable.IconCompat;
import androidx.slice.Slice; import androidx.slice.Slice;
@@ -61,6 +63,7 @@ import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements; import org.robolectric.annotation.Implements;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@@ -253,11 +256,42 @@ public class WifiSliceTest {
verify(mResolver).notifyChange(WIFI_SLICE_URI, null); verify(mResolver).notifyChange(WIFI_SLICE_URI, null);
} }
@Test private AccessPoint createAccessPoint(String name, State state) {
public void onConnectedChanged_shouldNotifyChange() { final NetworkInfo info = mock(NetworkInfo.class);
mWifiScanWorker.onConnectedChanged(); doReturn(state).when(info).getState();
verify(mResolver).notifyChange(WIFI_SLICE_URI, null); final Bundle savedState = new Bundle();
savedState.putString("key_ssid", name);
savedState.putParcelable("key_networkinfo", info);
return new AccessPoint(mContext, savedState);
}
@Test
public void SliceAccessPoint_sameState_shouldBeTheSame() {
final AccessPoint ap1 = createAccessPoint(AP1_NAME, State.CONNECTED);
final AccessPoint ap2 = createAccessPoint(AP1_NAME, State.CONNECTED);
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) @Implements(SliceBackgroundWorker.class)