Fix crash on Wi-Fi Slice when it's continuously pinned and unpinned

It's because WifiTracker's initialization and onStop is on different
thread. Fine tune the thread logic in SliceBackgroundWorker.

Fixes: 118165942
Test: manual
Change-Id: Icc86b5df7ec3c6fd0e4a79a62ea0c84465e9528d
This commit is contained in:
Jason Chiu
2018-10-23 15:31:54 +08:00
parent 61a8d1fbe4
commit 89b15785c7
4 changed files with 64 additions and 21 deletions

View File

@@ -30,8 +30,6 @@ import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiSsid;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.provider.SettingsSlicesContract;
import android.text.TextUtils;
@@ -62,7 +60,6 @@ import java.util.List;
*/
public class WifiSlice implements CustomSliceable {
/**
* Backing Uri for the Wifi Slice.
*/
@@ -124,16 +121,16 @@ public class WifiSlice implements CustomSliceable {
return listBuilder.build();
}
List<AccessPoint> result = getBackgroundWorker().getResults();
if (result == null) {
result = new ArrayList<>();
List<AccessPoint> results = getBackgroundWorker().getResults();
if (results == null) {
results = new ArrayList<>();
}
final int apCount = result.size();
final int apCount = results.size();
// Add AP rows
final CharSequence placeholder = mContext.getText(R.string.summary_placeholder);
for (int i = 0; i < DEFAULT_EXPANDED_ROW_COUNT; i++) {
if (i < apCount) {
listBuilder.addRow(getAccessPointRow(result.get(i)));
listBuilder.addRow(getAccessPointRow(results.get(i)));
} else {
listBuilder.addRow(new RowBuilder()
.setTitle(placeholder)
@@ -277,12 +274,12 @@ public class WifiSlice implements CustomSliceable {
private static class WifiScanWorker extends SliceBackgroundWorker<AccessPoint>
implements WifiTracker.WifiListener {
// TODO: enforce all the SliceBackgroundWorkers being singletons at syntax level
private static WifiScanWorker mWifiScanWorker;
private final Context mContext;
private WifiTracker mWifiTracker;
private WifiManager mWifiManager;
private WifiScanWorker(Context context, Uri uri) {
super(context.getContentResolver(), uri);
@@ -298,17 +295,20 @@ public class WifiSlice implements CustomSliceable {
@Override
protected void onSlicePinned() {
new Handler(Looper.getMainLooper()).post(() -> {
if (mWifiTracker == null) {
mWifiTracker = new WifiTracker(mContext, this, true, true);
mWifiManager = mWifiTracker.getManager();
mWifiTracker.onStart();
onAccessPointsChanged();
});
}
mWifiTracker.onStart();
onAccessPointsChanged();
}
@Override
protected void onSliceUnpinned() {
mWifiTracker.onStop();
}
@Override
public void close() {
mWifiTracker.onDestroy();
mWifiScanWorker = null;
}
@@ -324,7 +324,7 @@ public class WifiSlice implements CustomSliceable {
@Override
public void onAccessPointsChanged() {
// in case state has changed
if (!mWifiManager.isWifiEnabled()) {
if (!mWifiTracker.getManager().isWifiEnabled()) {
updateResults(null);
return;
}